diff --git a/CHANGELOG.md b/CHANGELOG.md
index 56b9b9537..0d5e8724e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,7 +11,7 @@ All notable changes to this project will be documented in this file.
### Changed
-
+- LVGL library from v9.0.0 to v9.1.0
### Fixed
diff --git a/lib/libesp32_lvgl/LVGL_assets/gen.sh b/lib/libesp32_lvgl/LVGL_assets/gen.sh
index f64fa0337..dcedc5e2d 100755
--- a/lib/libesp32_lvgl/LVGL_assets/gen.sh
+++ b/lib/libesp32_lvgl/LVGL_assets/gen.sh
@@ -11,7 +11,7 @@
# bpp 2 and strong autohint for more readability at low size
~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --no-compress --size 10 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf --autohint-strong -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_10.c --format lvgl
~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 2 --no-compress --size 14 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf --autohint-strong -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_14.c --format lvgl
-~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --force-fast-kern-format --bpp 3 --size 20 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_20.c --format lvgl
+~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --force-fast-kern-format --bpp 2 --size 20 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_20.c --format lvgl
# icons only fonts for sizes not covered by monsterrat
~/Tasmota/s-hadinger/lv_font_conv/lv_font_conv.js --no-kerning --bpp 1 --size 12 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r '0xf012c=>0xE12C','0xf0140=>0xE140','0xf0141=>0xE141','0xf0142=>0xE142','0xf0143=>0xE143','0xf0156=>0xE156','0xf0045=>0xE045','0xf004d=>0xE04D','0xf0054=>0xE054','0xf005d=>0xE05D','0xf02dc=>0xE2DC','0xf0374=>0xE374','0xf0415=>0xE415','0xf0717=>0xE717','0xf060c=>0xE60C','0xf0599=>0xE599','0xf05a8=>0xE5A8','0xf0335=>0xE335','0xf06e8=>0xE6E8','0xf050f=>0xE50F','0xf058e=>0xE58E','0xf0594=>0xE594','0xf140b=>0xF40B','0xf05a9=>0xE5A9','0xf011c=>0xE11C','0xf0425=>0xE425','0xf0769=>0xE769','0xf081b=>0xE81B','0xf10af=>0xF0AF','0xf081c=>0xE81C','0xf0322=>0xE322','0xf06a5=>0xE6A5','0xf0150=>0xE150','0xf12d4=>0xF2D4','0xf12d3=>0xF2D3','0xf111c=>0xF21C','0xf111d=>0xF21D','0xf111e=>0xF21E','0xf010b=>0xE10B','0xf033e=>0xE33E','0xf0fc6=>0xEFC6','0xf1054=>0xF154','0xf070d=>0xE70D','0xf099d=>0xE99D','0xf001b=>0xE01B','0xf0026=>0xE026','0xf009a=>0xE09A','0xf030b=>0xE30B','0xf032a=>0xE32A','0xf0438=>0xE438','0xf0ad7=>0xEAD7','0xf068a=>0xE68A','0xf04ad=>0xE4AD','0xf04ae=>0xE4AE','0xf0502=>0xE502','0xf00ac=>0xE0AC','0xf1011=>0xE011','0xf070e=>0xE70E','0xf0565=>0xE565','0xf0a70=>0xEA70','0xf075f=>0xE75F','0xf04b9=>0xE4B9','0xf0004=>0xE004','0xf02e3=>0xE2E3','0xf064a=>0xE64A','0xf09a0=>0xE9A0','0xf0606=>0xE606','0xf1020=>0xF020','0xf08dd=>0xE8DD','0xf06b5=>0xE6B5','0xf0456=>0xE456','0xf0457=>0xE457','0xf0458=>0xE458','0xf11f3=>0xF1F3','0xf049d=>0xE49D','0xf049e=>0xE49E','0xf04c3=>0xE4C3','0xF0A7A=>0xEA7A','0xf11e1=>0xF1E1','0xf057e=>0xE57E','0xf091c=>0xE91C','0xf00af=>0xE0AF','0xf0493=>0xE493','0xf0210=>0xE210','0xf0238=>0xE238','0xf03e4=>0xE3E4','0xf040a=>0xE40A','0xf04db=>0xE4DB','0xf04de=>0xE4DE','0xf0580=>0xE580','0xf072a=>0xE72A','0xf0917=>0xE917','0xf0aac=>0xEAAC','0xF028F=>0xE28F','0xF0C99=>0xEC99','0xf095f=>0xE95F','0xf05f1=>0xE5F1','0xf09ab=>0xE9AB','0xf058c=>0xE58C','0xf0176=>0xE176','0xf12ba=>0xF2BA','0xf051b=>0xE51B','0xF11DB=>0xF1DB','0xf008e=>0xE08E','0xf06a1=>0xE6A1','0xF096B=>0xE96B','0xf05fa=>0xE5FA','0xf075a=>0xE75A','0xf058f=>0xE58F','0xf06c0=>0xE6C0','0xf06c3=>0xE6C3','0xf12a3=>0xF2A3','0xf12a1=>0xF2A1','0xf12a2=>0xF2A2','0xF00ED=>0xE0ED','0xF07AE=>0xE7AE','0xF02DA=>0xE2DA','0xf01d9=>0xE1D9','0xf01fa=>0xE1FA','0xf0f5f=>0xEF5F' --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/icons/lv_font_icons_12.c --format lvgl
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_12.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_12.c
index ef148fdb0..b032fc22d 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_12.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_12.c
@@ -985,6 +985,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1008,7 +1009,7 @@ lv_font_t lv_font_icons_12 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_14.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_14.c
index e69587a3d..e7c4f4ef1 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_14.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_14.c
@@ -1076,6 +1076,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1099,7 +1100,7 @@ lv_font_t lv_font_icons_14 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_16.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_16.c
index 520b4330d..056814b21 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_16.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_16.c
@@ -1461,6 +1461,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1484,7 +1485,7 @@ lv_font_t lv_font_icons_16 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_18.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_18.c
index 37bebe5c1..5396986ee 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_18.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_18.c
@@ -1657,6 +1657,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1680,7 +1681,7 @@ lv_font_t lv_font_icons_18 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_20.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_20.c
index ed492ef03..5d5eaf528 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_20.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_20.c
@@ -1794,6 +1794,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1817,7 +1818,7 @@ lv_font_t lv_font_icons_20 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_22.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_22.c
index 84bd6c815..ab5fa37da 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_22.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_22.c
@@ -1951,6 +1951,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1974,7 +1975,7 @@ lv_font_t lv_font_icons_22 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_24.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_24.c
index d5bd6f4fc..e7fda55fc 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_24.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_24.c
@@ -2059,6 +2059,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2082,7 +2083,7 @@ lv_font_t lv_font_icons_24 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_28.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_28.c
index 74a058f1d..ccc7a9f51 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_28.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/icons/lv_font_icons_28.c
@@ -2492,6 +2492,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2515,7 +2516,7 @@ lv_font_t lv_font_icons_28 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_10.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_10.c
index 51e8286f0..db77f5f09 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_10.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_10.c
@@ -1574,6 +1574,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -1597,7 +1598,7 @@ lv_font_t lv_font_montserrat_tasmota_10 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_14.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_14.c
index 9d5e45df3..a02eea518 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_14.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_14.c
@@ -2091,6 +2091,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2114,7 +2115,7 @@ lv_font_t lv_font_montserrat_tasmota_14 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_20.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_20.c
index 1a51a7351..5f5e3304d 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_20.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/montserrat/lv_font_montserrat_tasmota_20.c
@@ -1,7 +1,7 @@
/*******************************************************************************
* Size: 20 px
- * Bpp: 3
- * Opts: --force-fast-kern-format --bpp 3 --size 20 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_20.c --format lvgl
+ * Bpp: 2
+ * Opts: --force-fast-kern-format --bpp 2 --size 20 --font fonts/Montserrat-Medium/Montserrat-Medium.ttf -r 0x20-0x7F,0xB0,0x2022 --font fonts/Symbols/materialdesignicons-webfont.ttf --autohint-strong -r 0xf012c=>0xE12C,0xf0140=>0xE140,0xf0141=>0xE141,0xf0142=>0xE142,0xf0143=>0xE143,0xf0156=>0xE156,0xf0045=>0xE045,0xf004d=>0xE04D,0xf0054=>0xE054,0xf005d=>0xE05D,0xf02dc=>0xE2DC,0xf0374=>0xE374,0xf0415=>0xE415,0xf0717=>0xE717,0xf060c=>0xE60C,0xf0599=>0xE599,0xf05a8=>0xE5A8,0xf0335=>0xE335,0xf06e8=>0xE6E8,0xf050f=>0xE50F,0xf058e=>0xE58E,0xf0594=>0xE594,0xf140b=>0xF40B,0xf05a9=>0xE5A9,0xf011c=>0xE11C,0xf0425=>0xE425,0xf0769=>0xE769,0xf081b=>0xE81B,0xf10af=>0xF0AF,0xf081c=>0xE81C,0xf0322=>0xE322,0xf06a5=>0xE6A5,0xf0150=>0xE150,0xf12d4=>0xF2D4,0xf12d3=>0xF2D3,0xf111c=>0xF21C,0xf111d=>0xF21D,0xf111e=>0xF21E,0xf010b=>0xE10B,0xf033e=>0xE33E,0xf0fc6=>0xEFC6,0xf1054=>0xF154,0xf070d=>0xE70D,0xf099d=>0xE99D,0xf001b=>0xE01B,0xf0026=>0xE026,0xf009a=>0xE09A,0xf030b=>0xE30B,0xf032a=>0xE32A,0xf0438=>0xE438,0xf0ad7=>0xEAD7,0xf068a=>0xE68A,0xf04ad=>0xE4AD,0xf04ae=>0xE4AE,0xf0502=>0xE502,0xf00ac=>0xE0AC,0xf1011=>0xE011,0xf070e=>0xE70E,0xf0565=>0xE565,0xf0a70=>0xEA70,0xf075f=>0xE75F,0xf04b9=>0xE4B9,0xf0004=>0xE004,0xf02e3=>0xE2E3,0xf064a=>0xE64A,0xf09a0=>0xE9A0,0xf0606=>0xE606,0xf1020=>0xF020,0xf08dd=>0xE8DD,0xf06b5=>0xE6B5,0xf0456=>0xE456,0xf0457=>0xE457,0xf0458=>0xE458,0xf11f3=>0xF1F3,0xf049d=>0xE49D,0xf049e=>0xE49E,0xf04c3=>0xE4C3,0xF0A7A=>0xEA7A,0xf11e1=>0xF1E1,0xf057e=>0xE57E,0xf091c=>0xE91C,0xf00af=>0xE0AF,0xf0493=>0xE493,0xf0210=>0xE210,0xf0238=>0xE238,0xf03e4=>0xE3E4,0xf040a=>0xE40A,0xf04db=>0xE4DB,0xf04de=>0xE4DE,0xf0580=>0xE580,0xf072a=>0xE72A,0xf0917=>0xE917,0xf0aac=>0xEAAC,0xF028F=>0xE28F,0xF0C99=>0xEC99,0xf095f=>0xE95F,0xf05f1=>0xE5F1,0xf09ab=>0xE9AB,0xf058c=>0xE58C,0xf0176=>0xE176,0xf12ba=>0xF2BA,0xf051b=>0xE51B,0xF11DB=>0xF1DB,0xf008e=>0xE08E,0xf06a1=>0xE6A1,0xF096B=>0xE96B,0xf05fa=>0xE5FA,0xf075a=>0xE75A,0xf058f=>0xE58F,0xf06c0=>0xE6C0,0xf06c3=>0xE6C3,0xf12a3=>0xF2A3,0xf12a1=>0xF2A1,0xf12a2=>0xF2A2,0xF00ED=>0xE0ED,0xF07AE=>0xE7AE,0xF02DA=>0xE2DA,0xf01d9=>0xE1D9,0xf01fa=>0xE1FA,0xf0f5f=>0xEF5F --font fonts/Symbols/FontAwesome5-Solid+Brands+Regular.woff --autohint-strong -r 61441,61448,61451,61452,61452,61453,61457,61459,61461,61465,61468,61473,61478,61479,61480,61502,61507,61512,61515,61516,61517,61521,61522,61523,61524,61543,61544,61550,61552,61553,61556,61559,61560,61561,61563,61587,61589,61636,61637,61639,61641,61664,61671,61674,61683,61724,61732,61787,61931,62016,62017,62018,62019,62020,62087,62099,62212,62189,62810,63426,63650 --format bin -o src/fonts/montserrat/lv_font_montserrat_tasmota_20.c --format lvgl
******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
@@ -25,2598 +25,2077 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0020 " " */
/* U+0021 "!" */
- 0x7f, 0x1, 0x10, 0xc0, 0xf3, 0x4, 0xf, 0xdc,
- 0x90, 0xc, 0xc4, 0x51, 0xdc, 0x18,
+ 0x7c, 0x1c, 0x87, 0x90, 0xff, 0x61, 0xb4, 0x99,
+ 0xb1,
/* U+0022 "\"" */
- 0xbc, 0x7, 0x80, 0x7c, 0x40, 0xb8, 0x1f, 0xfc,
- 0xf, 0x40, 0x34,
+ 0xb0, 0x70, 0x7f, 0xd8, 0x7f, 0xf0, 0x38, 0xa,
/* U+0023 "#" */
- 0x3, 0x3e, 0x4, 0xb9, 0x3, 0xd8, 0x81, 0x10,
- 0x40, 0xf3, 0x60, 0x2e, 0x40, 0xdb, 0xf1, 0x5f,
- 0xcc, 0xfe, 0x82, 0xb6, 0x9, 0xb8, 0x16, 0xd8,
- 0x39, 0x47, 0x92, 0x16, 0x42, 0x3, 0x98, 0x18,
- 0x81, 0xe6, 0x8, 0x2, 0x7, 0xe2, 0x6, 0x61,
- 0x81, 0x3f, 0xd0, 0x7f, 0x51, 0xbf, 0x4, 0xd8,
- 0x93, 0x71, 0xd, 0xa0, 0x32, 0x2, 0x92, 0x66,
- 0x43, 0x3, 0x1e, 0x4, 0xd8, 0xf, 0xc4, 0x8,
- 0x90, 0x18,
+ 0xc, 0xe1, 0x38, 0x7d, 0x87, 0xff, 0x5, 0x41,
+ 0x61, 0xdf, 0xf, 0xc9, 0xe8, 0x94, 0x2e, 0x2,
+ 0xb1, 0xa1, 0xd4, 0x54, 0x87, 0x21, 0xff, 0x21,
+ 0xff, 0xc6, 0x44, 0x27, 0xd1, 0xf4, 0x7c, 0x2c,
+ 0x5, 0x80, 0xa8, 0x14, 0x1a, 0x92, 0x88, 0x76,
+ 0x12, 0x83, 0xff, 0x8c,
/* U+0024 "$" */
- 0x3, 0x97, 0x3, 0xff, 0xa8, 0xf5, 0x1f, 0x40,
- 0x36, 0x84, 0x1, 0x27, 0x80, 0x42, 0x5e, 0x8d,
- 0xe5, 0x0, 0x87, 0x3, 0x9b, 0x1, 0x98, 0x1f,
- 0xd4, 0x56, 0x40, 0xf9, 0xb0, 0x90, 0x22, 0x3,
- 0xa6, 0x84, 0x3b, 0xd0, 0x18, 0xb8, 0x2a, 0x14,
- 0x81, 0xf2, 0xac, 0x20, 0x3f, 0xb8, 0xe3, 0x42,
- 0x6, 0x34, 0x60, 0xf, 0x78, 0x36, 0x14, 0x83,
- 0x54, 0x8, 0x25, 0x28, 0x12, 0xbe, 0x8f, 0x98,
- 0x1f, 0xfc, 0x77, 0x0, 0xe0,
+ 0xe, 0x70, 0xff, 0xea, 0x3c, 0x7a, 0xd, 0xc1,
+ 0xce, 0x8, 0x1c, 0x7a, 0x80, 0x4c, 0x39, 0x41,
+ 0x90, 0xfe, 0x89, 0xf, 0xca, 0x28, 0x48, 0x75,
+ 0xc0, 0x6d, 0xe, 0x62, 0x48, 0x3f, 0x32, 0x21,
+ 0xfd, 0x99, 0xc1, 0xe8, 0xc0, 0xfa, 0x3c, 0x28,
+ 0xe4, 0x3a, 0x81, 0x37, 0x1e, 0x43, 0xff, 0x8e,
+ 0xc1, 0xc0,
/* U+0025 "%" */
- 0x1, 0x3f, 0x40, 0x3d, 0xa8, 0x1a, 0xab, 0x4a,
- 0x81, 0xa1, 0xa0, 0x65, 0x12, 0x44, 0x4, 0x9d,
- 0x3, 0x10, 0x80, 0x20, 0x40, 0x56, 0x80, 0xf1,
- 0x0, 0x41, 0x14, 0xc0, 0x38, 0x94, 0x1, 0x10,
- 0x49, 0xc0, 0xfb, 0x3f, 0xce, 0x8a, 0xcd, 0xfc,
- 0xc0, 0xdb, 0xf6, 0x14, 0xca, 0xed, 0x46, 0x7,
- 0xc9, 0x39, 0x5d, 0x24, 0x80, 0x3e, 0xb0, 0xb0,
- 0x40, 0x10, 0x3e, 0xa5, 0x81, 0xe6, 0x7, 0x9a,
- 0xe0, 0x18, 0x20, 0x10, 0x1c, 0x64, 0x10, 0x5,
- 0x42, 0x52, 0x0, 0xdc, 0xb0, 0x35, 0x1b, 0x1b,
+ 0x5, 0xe8, 0x3d, 0xc1, 0xa6, 0x8c, 0x1a, 0x20,
+ 0xcc, 0xa9, 0x9, 0x50, 0x79, 0x2, 0x1a, 0x50,
+ 0x7f, 0xf0, 0x62, 0xf, 0xa0, 0x48, 0xac, 0x3e,
+ 0xdf, 0x31, 0x25, 0xe4, 0x37, 0xe2, 0x28, 0xd4,
+ 0x87, 0xca, 0xc7, 0x55, 0x3, 0xea, 0x8, 0x7f,
+ 0xf0, 0x21, 0xf, 0x21, 0xe5, 0x60, 0x43, 0x21,
+ 0xea, 0x6, 0x60, 0x50, 0x36, 0x21, 0xa3, 0xca,
0x0,
/* U+0026 "&" */
- 0x3, 0x4d, 0xf3, 0x3, 0xf6, 0x6a, 0x38, 0xc0,
- 0xf2, 0x2e, 0x3a, 0x68, 0x1f, 0xb8, 0x11, 0x3,
- 0xe4, 0x20, 0xa, 0x20, 0x1f, 0x51, 0xba, 0xa8,
- 0xf, 0xe2, 0x32, 0x3, 0xe9, 0x4c, 0x1c, 0x80,
- 0x84, 0x3, 0x76, 0x74, 0xe2, 0x1d, 0x1, 0x4,
- 0x0, 0xa8, 0xd4, 0x50, 0x22, 0x6, 0x54, 0x22,
- 0x40, 0x9, 0x30, 0x3e, 0x24, 0x2, 0x9, 0xed,
- 0x7a, 0x20, 0xc4, 0x2c, 0xca, 0x43, 0x3b, 0xc8,
- 0x80, 0x33, 0x7e, 0xcc, 0x1, 0xa0,
+ 0xd, 0x7c, 0x87, 0xed, 0x53, 0x21, 0xe4, 0x66,
+ 0x20, 0xfd, 0x87, 0xfc, 0x90, 0x22, 0xf, 0xa3,
+ 0xcc, 0x87, 0xfd, 0xa1, 0xf5, 0x8, 0xc2, 0x82,
+ 0x5b, 0x63, 0x3, 0x2, 0x20, 0x31, 0xc4, 0x1f,
+ 0x98, 0x43, 0xc8, 0x7f, 0xd1, 0x74, 0xe2, 0x30,
+ 0x3a, 0x28, 0xb7, 0x43, 0x5f, 0x90, 0xa0,
/* U+0027 "'" */
- 0xbc, 0x8, 0x81, 0xbd,
+ 0xb0, 0xfd, 0xc0,
/* U+0028 "(" */
- 0x2, 0xf8, 0x9, 0x8a, 0x5, 0x3, 0x0, 0x42,
- 0x2, 0xa3, 0x81, 0x10, 0xc0, 0x90, 0x20, 0x7f,
- 0x88, 0x1f, 0xfc, 0x52, 0x7, 0xf9, 0x2, 0x4,
- 0x43, 0x2, 0xa3, 0x81, 0x10, 0x80, 0xd0, 0x30,
- 0x26, 0x28,
+ 0xb, 0xc1, 0x24, 0x14, 0x21, 0x90, 0xa3, 0xe,
+ 0x42, 0x43, 0xff, 0xba, 0x87, 0xc8, 0x51, 0x87,
+ 0x21, 0xa1, 0x9, 0x20,
/* U+0029 ")" */
- 0x3e, 0x80, 0x29, 0x8, 0x8, 0x20, 0x2, 0x10,
- 0x13, 0x8, 0x7, 0x4, 0x2, 0x18, 0xf, 0x88,
- 0x60, 0x7f, 0xf0, 0x8, 0x60, 0x7c, 0x86, 0x1,
- 0xc1, 0x0, 0xc2, 0x4, 0x20, 0x10, 0x40, 0x52,
- 0x10,
+ 0x38, 0x25, 0x5, 0x10, 0x64, 0x24, 0x41, 0x86,
+ 0x4c, 0x3f, 0x90, 0xff, 0xe1, 0x21, 0xf2, 0x60,
+ 0xc3, 0x22, 0x12, 0x8, 0x80, 0xa0, 0x0,
/* U+002A "*" */
- 0x2, 0x90, 0x4, 0x58, 0x19, 0x97, 0x31, 0x2d,
- 0x1a, 0xcd, 0x23, 0xc8, 0x24, 0x0, 0x90, 0x39,
- 0xd, 0xa4, 0x36, 0xec, 0x3, 0xec, 0xb, 0xf0,
- 0x10,
+ 0xa, 0x81, 0x90, 0xc8, 0xd8, 0x39, 0x5a, 0xed,
+ 0x14, 0x5, 0xd, 0x15, 0x45, 0x68, 0x1d, 0xb,
+ 0xc1, 0x0,
/* U+002B "+" */
- 0x3, 0xff, 0x85, 0xe8, 0x1f, 0xfd, 0x6b, 0xfc,
- 0x17, 0xf2, 0xc9, 0x40, 0xa5, 0x36, 0xb6, 0xe,
- 0xd8, 0x81, 0xff, 0xc8,
+ 0xf, 0xfe, 0x17, 0x7, 0xff, 0x5a, 0xf8, 0x7e,
+ 0x75, 0x80, 0xbd, 0x50, 0xd4, 0x1f, 0xfc, 0x90,
/* U+002C "," */
- 0xe, 0x80, 0x8a, 0x4, 0x38, 0xe1, 0xc, 0x48,
- 0x2a, 0x0,
+ 0x18, 0x13, 0x9, 0x98, 0x98, 0x4c, 0x0,
/* U+002D "-" */
- 0x96, 0xe4, 0xbd, 0x80,
+ 0xae, 0x5f, 0x60,
/* U+002E "." */
- 0xe, 0x91, 0x15, 0x8, 0x60,
+ 0x18, 0x13, 0x9, 0x80,
/* U+002F "/" */
- 0x3, 0xe6, 0x80, 0xf2, 0x84, 0xf, 0x70, 0xc0,
- 0xf2, 0x20, 0x79, 0xa, 0x7, 0xb8, 0x60, 0x79,
- 0x10, 0x3c, 0x85, 0x3, 0xdc, 0x30, 0x3c, 0x90,
- 0xf, 0x21, 0x80, 0xf7, 0xc, 0xf, 0x24, 0x3,
- 0xc8, 0x60, 0x3d, 0xc3, 0x3, 0xc9, 0x0, 0xf3,
- 0x1c, 0xf, 0x60, 0x80, 0xf2, 0x40, 0x3c, 0xc7,
- 0x3, 0xc0,
+ 0xf, 0x94, 0x1e, 0x60, 0xfb, 0x10, 0xf2, 0x1f,
+ 0x24, 0x1e, 0xc4, 0x3c, 0x87, 0xc9, 0x7, 0xb1,
+ 0xf, 0x28, 0x3c, 0x98, 0x7b, 0x10, 0xf2, 0x83,
+ 0xc9, 0x87, 0xb1, 0xf, 0x28, 0x3c, 0x98, 0x7b,
+ 0x10, 0xf2, 0x83, 0xc9, 0x87, 0x80,
/* U+0030 "0" */
- 0x3, 0x4d, 0xfa, 0x90, 0x38, 0xf6, 0x48, 0x2c,
- 0xc0, 0xdc, 0x2f, 0xbc, 0x10, 0x80, 0x64, 0xa8,
- 0x13, 0x82, 0x0, 0xc2, 0x1, 0xcc, 0x20, 0x8,
- 0x20, 0x3c, 0x41, 0x3, 0xfc, 0xc3, 0x3, 0xff,
- 0x96, 0xc3, 0x8, 0x20, 0x3c, 0x41, 0x18, 0x40,
- 0x39, 0x84, 0x1, 0x92, 0xa0, 0x4e, 0x8, 0x5,
- 0xc2, 0xfb, 0xc1, 0x8, 0x11, 0xec, 0x90, 0x59,
- 0x80,
+ 0xd, 0x7d, 0x7, 0xda, 0x13, 0xa1, 0xb1, 0xfa,
+ 0x20, 0x90, 0x41, 0x31, 0x3, 0x20, 0xe4, 0x40,
+ 0x88, 0x7f, 0xf1, 0xd1, 0xf, 0xfe, 0x5a, 0x22,
+ 0x21, 0xfe, 0xc8, 0x39, 0x10, 0x20, 0x82, 0x62,
+ 0xb, 0x1f, 0xa2, 0xe, 0xd0, 0x9d, 0x0,
/* U+0031 "1" */
- 0xdf, 0xe4, 0xc9, 0x1, 0x5d, 0x88, 0xf, 0xff,
- 0xc0,
+ 0xfe, 0x50, 0x75, 0xe4, 0x3f, 0xff, 0x0,
/* U+0032 "2" */
- 0x0, 0xf7, 0xf5, 0x20, 0xe, 0x84, 0x10, 0xb2,
- 0xc, 0xbf, 0xdb, 0xb1, 0x42, 0xf0, 0xd, 0x0,
- 0x10, 0x3f, 0x10, 0x3f, 0x89, 0xc0, 0x7d, 0xc4,
- 0x3, 0xec, 0x5a, 0x3, 0xd8, 0xb8, 0x7, 0xb1,
- 0x70, 0xe, 0x3c, 0xc8, 0x3, 0x8e, 0x11, 0x81,
- 0xc7, 0x0, 0xbb, 0x74, 0x60, 0x44, 0xf9, 0x0,
+ 0x3, 0xfa, 0xd, 0xc1, 0x9d, 0x11, 0xfc, 0x90,
+ 0xf0, 0x68, 0x3f, 0xfa, 0x99, 0x7, 0xd8, 0xa0,
+ 0xf6, 0x30, 0x7b, 0x18, 0x3d, 0x94, 0xf, 0x64,
+ 0x87, 0xb0, 0x5f, 0xd2, 0x1f, 0xc8,
/* U+0033 "3" */
- 0x5f, 0xff, 0x6, 0x4f, 0x80, 0x10, 0x76, 0xee,
- 0x3, 0x81, 0xf7, 0x14, 0x81, 0xec, 0x62, 0x3,
- 0xd0, 0xa6, 0x7, 0xcc, 0x2f, 0x0, 0xf4, 0x86,
- 0x1e, 0x3, 0x9b, 0x4e, 0x49, 0x1, 0xf9, 0xc,
- 0x7, 0xe2, 0x3b, 0xec, 0xc, 0xd0, 0x40, 0x27,
- 0xfa, 0x8, 0x5e, 0x64, 0x9, 0x66, 0x0,
+ 0x7f, 0xf8, 0x43, 0xfe, 0xff, 0x3, 0xf, 0xb2,
+ 0xf, 0xb2, 0x43, 0xd0, 0xa0, 0xf9, 0x1e, 0xf,
+ 0x51, 0x1c, 0x39, 0x56, 0x4, 0x3f, 0x26, 0x1f,
+ 0xed, 0xd0, 0xca, 0x10, 0x5f, 0xa2, 0x1d, 0xc,
+ 0xe8,
/* U+0034 "4" */
- 0x3, 0xe7, 0xe8, 0x1f, 0xe3, 0xd, 0x3, 0xfd,
- 0x87, 0x3, 0xfd, 0x44, 0x20, 0x7f, 0x44, 0x8c,
- 0xf, 0xe4, 0xcd, 0x3, 0xf8, 0xd1, 0xc0, 0x3e,
- 0xc0, 0xee, 0x29, 0x3, 0xfa, 0x16, 0x80, 0xfe,
- 0x2c, 0x3f, 0xf4, 0x13, 0xf1, 0x4, 0xfe, 0x0,
- 0x4e, 0xdb, 0xea, 0x26, 0xc0, 0x3f, 0xfa, 0x20,
+ 0xf, 0x9e, 0xf, 0xfa, 0x20, 0xff, 0x66, 0x1f,
+ 0xe8, 0x83, 0xfd, 0x2c, 0x1f, 0xca, 0x20, 0xff,
+ 0x46, 0x7, 0x43, 0xb2, 0xf, 0xf4, 0x28, 0x3f,
+ 0xc8, 0xfe, 0x8b, 0xc1, 0xff, 0xc4, 0xff, 0xa2,
+ 0xf0, 0x7f, 0xf4, 0x40,
/* U+0035 "5" */
- 0x1, 0xff, 0xe0, 0x38, 0x9f, 0x0, 0x21, 0x6d,
- 0xe0, 0xc, 0x10, 0x3f, 0x11, 0xc0, 0xff, 0x4d,
- 0x95, 0x90, 0x2e, 0x0, 0x92, 0x99, 0x80, 0x9f,
- 0xec, 0xc4, 0x40, 0x78, 0xc6, 0x38, 0x1f, 0xb0,
- 0x60, 0x81, 0xe2, 0x19, 0xd0, 0x81, 0x28, 0x3b,
- 0xf, 0x7d, 0xe8, 0x69, 0x3c, 0x20, 0x85, 0x60,
+ 0x7, 0xfe, 0xf, 0xfe, 0x1b, 0xfe, 0x2, 0x1f,
+ 0xfc, 0xc, 0x3f, 0xd7, 0xa4, 0x36, 0x19, 0xb4,
+ 0x17, 0xf2, 0x48, 0x7d, 0x26, 0x1f, 0xb1, 0xf,
+ 0xf2, 0x70, 0x66, 0x34, 0x7f, 0x42, 0xdc, 0x19,
+ 0xa0,
/* U+0036 "6" */
- 0x3, 0x2b, 0xfd, 0x58, 0x1a, 0xd2, 0x4, 0x96,
- 0x2, 0xa9, 0x37, 0xd9, 0xe8, 0x4, 0x86, 0x90,
- 0x3e, 0xe2, 0x1, 0xfc, 0x82, 0x7b, 0xf6, 0x60,
- 0x75, 0x81, 0x12, 0x94, 0xc, 0xa6, 0xbb, 0x2,
- 0x40, 0x24, 0xc0, 0x8d, 0x1c, 0x11, 0x80, 0xe6,
- 0x18, 0xa3, 0x1, 0xcc, 0x30, 0xc2, 0x60, 0x46,
- 0x8e, 0x2, 0x89, 0xee, 0xc0, 0xd0, 0x5, 0x99,
- 0x45, 0x58, 0x0,
+ 0xc, 0xdf, 0x48, 0x6a, 0x21, 0x38, 0x52, 0xbf,
+ 0xa0, 0x28, 0x83, 0xf6, 0x41, 0xfc, 0x8a, 0xfc,
+ 0x87, 0x50, 0x41, 0x40, 0xcd, 0xde, 0x14, 0x12,
+ 0x83, 0x46, 0x16, 0x1c, 0x89, 0x18, 0x72, 0x22,
+ 0x28, 0x34, 0x60, 0x8b, 0xbc, 0x28, 0xe, 0x88,
+ 0xd0,
/* U+0037 "7" */
- 0x7f, 0xff, 0x88, 0x11, 0x3e, 0x0, 0x40, 0x3d,
- 0xba, 0x84, 0x7, 0xf5, 0x10, 0x3b, 0x40, 0x64,
- 0x4c, 0x1, 0x10, 0x34, 0x10, 0xf, 0xc4, 0xc8,
- 0xf, 0xd0, 0x50, 0x3f, 0x14, 0x18, 0x1f, 0xa8,
- 0x60, 0x7f, 0x31, 0x0, 0xfc, 0xc3, 0x3, 0xfa,
- 0xa, 0x7, 0xe6, 0x11, 0x3, 0x80,
-
- /* U+0038 "8" */
- 0x2, 0x7b, 0xfa, 0xa0, 0x36, 0x84, 0x91, 0x56,
- 0x80, 0x32, 0x5f, 0x5d, 0x85, 0x20, 0xe2, 0x81,
- 0x8a, 0x4, 0x71, 0x80, 0xe4, 0x8, 0x69, 0x3d,
- 0x97, 0x96, 0x80, 0x70, 0x9, 0xa0, 0x18, 0x3,
- 0xa2, 0x7e, 0xd0, 0x54, 0x20, 0xcc, 0x1, 0x74,
- 0x40, 0x22, 0x7, 0x20, 0x40, 0xfe, 0x20, 0x48,
- 0x50, 0x31, 0xe1, 0x8a, 0x57, 0xd7, 0x61, 0x28,
- 0x3, 0x42, 0x48, 0xa9, 0x80,
-
- /* U+0039 "9" */
- 0x0, 0x6f, 0xf5, 0x40, 0x67, 0x91, 0x45, 0x58,
- 0x5, 0x5, 0xd7, 0x72, 0xd0, 0x41, 0xa0, 0x37,
- 0x10, 0x10, 0x3f, 0x88, 0x41, 0xa0, 0x37, 0x0,
- 0x8b, 0x17, 0x5a, 0xe4, 0x80, 0xa5, 0x45, 0x36,
- 0xec, 0xc, 0xaf, 0xed, 0x3, 0xc, 0xf, 0xe2,
- 0x8, 0x1f, 0xa8, 0x60, 0x48, 0xd, 0x50, 0x80,
- 0x1d, 0xfb, 0x3a, 0x18, 0x9, 0x21, 0x3a, 0x72,
- 0x0,
-
- /* U+003A ":" */
- 0x17, 0xa0, 0x86, 0x11, 0x50, 0xe9, 0x3, 0xff,
- 0x8a, 0xe9, 0x11, 0x50, 0x86,
-
- /* U+003B ";" */
- 0x17, 0xa0, 0x86, 0x11, 0x50, 0xe9, 0x3, 0xff,
- 0x8a, 0xe8, 0x8, 0xa0, 0x43, 0x8e, 0x10, 0xc4,
- 0x82, 0xa0,
-
- /* U+003C "<" */
- 0x3, 0xf3, 0x20, 0x71, 0x9e, 0x30, 0x25, 0xb1,
- 0xaa, 0x8c, 0xf4, 0xbf, 0x50, 0x8c, 0xdf, 0x0,
- 0xc4, 0x1e, 0x80, 0xe9, 0x9a, 0xb9, 0x81, 0x8c,
- 0xf0, 0x4f, 0x48, 0x19, 0xec, 0x69, 0x81, 0xe3,
- 0x3a,
-
- /* U+003D "=" */
- 0xbf, 0xfe, 0x59, 0x2f, 0xcd, 0xad, 0xfc, 0x40,
- 0xff, 0xe4, 0x5f, 0xff, 0x2c, 0x97, 0xe6,
-
- /* U+003E ">" */
- 0x64, 0xf, 0xdb, 0x4c, 0xf, 0x58, 0x27, 0x84,
- 0xc, 0xf6, 0x27, 0xb1, 0x81, 0x8d, 0xf0, 0xc4,
- 0x7, 0x3a, 0x1, 0x80, 0x33, 0xc1, 0x39, 0x5b,
- 0x1a, 0xd8, 0xc0, 0x71, 0x3d, 0x20, 0x69, 0x98,
- 0x1f, 0x0,
-
- /* U+003F "?" */
- 0x0, 0xf7, 0xed, 0x48, 0x3, 0xe1, 0x39, 0x66,
- 0x10, 0x7f, 0x67, 0x62, 0x7, 0xe0, 0x1a, 0x1,
- 0xff, 0xc9, 0xa2, 0x1, 0xf6, 0x4d, 0x80, 0xf6,
- 0x2e, 0x1, 0xe4, 0x4a, 0x1, 0xf3, 0x90, 0x7,
- 0xe2, 0xd0, 0x1f, 0x8c, 0x20, 0x7e, 0x8f, 0x81,
- 0xfb, 0x4, 0x6,
-
- /* U+0040 "@" */
- 0x3, 0xca, 0x6f, 0xed, 0x8, 0x1f, 0xc7, 0x54,
- 0x92, 0x49, 0xea, 0x7, 0xcb, 0xd, 0x91, 0xba,
- 0x7a, 0xf9, 0x3, 0x1a, 0xb1, 0xa, 0x42, 0x7,
- 0x45, 0x80, 0xd8, 0xd0, 0x75, 0x6d, 0x72, 0x62,
- 0x9a, 0x1, 0x8e, 0x3, 0x19, 0xfa, 0x88, 0x5,
- 0x11, 0x18, 0x90, 0x82, 0x30, 0xb, 0x1, 0x90,
- 0x41, 0x20, 0x4, 0x18, 0x1c, 0xc0, 0xc7, 0x0,
- 0xe0, 0x8, 0x1f, 0x70, 0x33, 0x3, 0xc4, 0xf,
- 0xfe, 0x27, 0x0, 0xc1, 0x3, 0xb0, 0x19, 0x90,
- 0x90, 0x4, 0x1c, 0xc, 0xd0, 0x20, 0x96, 0x18,
- 0x90, 0x30, 0xfb, 0x34, 0x81, 0x2e, 0x28, 0x31,
- 0xc0, 0x3a, 0x53, 0x6a, 0xe8, 0x49, 0x80, 0xb1,
- 0xa0, 0x16, 0xfd, 0x50, 0x5f, 0xa8, 0x18, 0xd5,
- 0x88, 0x1f, 0xfc, 0x45, 0x86, 0xc8, 0xda, 0x5e,
- 0xc0, 0xfe, 0x3a, 0xb5, 0x21, 0x8, 0xc0, 0xe0,
-
- /* U+0041 "A" */
- 0x3, 0xef, 0xd0, 0xf, 0xfe, 0x2, 0x0, 0xc0,
- 0xff, 0xe0, 0x40, 0x83, 0x3, 0xfc, 0x8a, 0xa2,
- 0x81, 0xfe, 0xe2, 0x4, 0x50, 0x1f, 0x8a, 0x24,
- 0x20, 0x80, 0x7e, 0x82, 0x0, 0x27, 0x1, 0xf2,
- 0x8, 0xa, 0x8, 0x7, 0xa0, 0x80, 0x64, 0x11,
- 0x3, 0x98, 0x9f, 0xf0, 0xa, 0x6, 0x60, 0xa5,
- 0xf0, 0x60, 0x6a, 0x3d, 0xbf, 0x31, 0x0, 0x22,
- 0x88, 0x1f, 0x50, 0xc0, 0x41, 0xc0, 0xfc, 0x50,
- 0x60,
-
- /* U+0042 "B" */
- 0xff, 0xf5, 0x40, 0x72, 0x5c, 0x55, 0xa0, 0x35,
- 0xbd, 0xa8, 0x44, 0xf, 0xe4, 0x81, 0x1, 0xfe,
- 0x60, 0x81, 0xf8, 0xc2, 0x48, 0xb, 0xfe, 0xcc,
- 0xe0, 0x32, 0x5c, 0x41, 0xc0, 0x6b, 0x7b, 0x76,
- 0x68, 0x1f, 0xe8, 0x10, 0x1f, 0xfc, 0xb8, 0x7,
- 0x5b, 0xee, 0xc5, 0x2, 0x4b, 0xc5, 0xe4, 0x0,
-
- /* U+0043 "C" */
- 0x3, 0x9e, 0xfe, 0xa8, 0xe, 0x5e, 0x10, 0x42,
- 0xb8, 0x9, 0x50, 0xf7, 0xdf, 0x22, 0x81, 0xa2,
- 0x41, 0x2, 0x37, 0x21, 0x43, 0x60, 0x3e, 0x20,
- 0x10, 0xa0, 0x7f, 0xc4, 0x10, 0x3f, 0xf9, 0xa4,
- 0x10, 0x3f, 0xe4, 0x28, 0x1f, 0xf5, 0xd, 0x80,
- 0xf8, 0x80, 0x34, 0x4a, 0x40, 0x8d, 0xc8, 0x2,
- 0xa1, 0x6f, 0xbe, 0x45, 0x1, 0x2f, 0x8, 0x21,
- 0x5c, 0x0,
-
- /* U+0044 "D" */
- 0xff, 0xed, 0x50, 0x1e, 0x27, 0xca, 0xd0, 0x1d,
- 0xb7, 0x7a, 0x56, 0x3, 0xfc, 0xb1, 0x2a, 0x7,
- 0xfd, 0x82, 0x3, 0xff, 0x80, 0x83, 0x3, 0xfe,
- 0x23, 0x81, 0xff, 0x71, 0xc0, 0xff, 0xb0, 0x1f,
- 0xfc, 0x14, 0x18, 0x1f, 0xea, 0x10, 0x1f, 0xcb,
- 0x23, 0x40, 0xb6, 0xef, 0x4a, 0xc0, 0x62, 0x7c,
- 0xad, 0x1, 0x0,
-
- /* U+0045 "E" */
- 0xff, 0xfc, 0x4, 0x4f, 0xe0, 0x2d, 0xbf, 0x1,
- 0xff, 0xd8, 0xff, 0xe2, 0x4, 0x4f, 0xe0, 0x2d,
- 0xbe, 0x3, 0xff, 0xb3, 0xb7, 0xe2, 0x0, 0x9f,
- 0xcc,
-
- /* U+0046 "F" */
- 0xff, 0xfc, 0x0, 0x9f, 0xc0, 0x36, 0xfc, 0x7,
- 0xff, 0x53, 0x6f, 0x80, 0x89, 0xfc, 0x3, 0xff,
- 0x88, 0x1f, 0xfe, 0x60,
-
- /* U+0047 "G" */
- 0x3, 0x9e, 0xfe, 0xac, 0xe, 0x5e, 0x10, 0x42,
- 0x98, 0x80, 0x54, 0x3d, 0xf7, 0xcc, 0xa0, 0x68,
- 0x90, 0x40, 0x8c, 0xcc, 0x50, 0xd8, 0xf, 0x88,
- 0x4, 0x28, 0x1f, 0xf1, 0x4, 0xf, 0xfe, 0x49,
- 0xf4, 0x10, 0x40, 0xff, 0x90, 0x80, 0x7f, 0xd0,
- 0x26, 0x7, 0xfd, 0x44, 0xa4, 0x8, 0xc0, 0x32,
- 0xa1, 0x6f, 0xbe, 0x43, 0x81, 0x2f, 0x8, 0x21,
- 0x4e, 0x80,
-
- /* U+0048 "H" */
- 0xfc, 0x7, 0xed, 0xc8, 0x1f, 0xff, 0x7f, 0xff,
- 0x10, 0x31, 0x3f, 0x80, 0xed, 0xbf, 0x10, 0x3f,
- 0xfe, 0xe0,
-
- /* U+0049 "I" */
- 0xfc, 0x7, 0xff, 0x70,
-
- /* U+004A "J" */
- 0x1, 0xbf, 0xf2, 0x0, 0x89, 0xc0, 0x74, 0xdb,
- 0x20, 0x3f, 0xff, 0xe0, 0x66, 0x18, 0xd8, 0x40,
- 0x32, 0x8, 0x67, 0x67, 0x82, 0x0, 0xb0, 0x90,
- 0x35, 0x80,
-
- /* U+004B "K" */
- 0xfc, 0x7, 0xd7, 0xc0, 0x3f, 0xaa, 0x70, 0xf,
- 0xd5, 0x38, 0x7, 0xea, 0x92, 0x1, 0xfa, 0xa4,
- 0xa0, 0x7e, 0xa9, 0x28, 0x1f, 0xa2, 0x10, 0xf,
- 0xd5, 0x80, 0xc0, 0x7e, 0x47, 0xa1, 0x80, 0xf8,
- 0xe1, 0x49, 0x50, 0x3d, 0xc0, 0xb1, 0x4c, 0xe,
- 0x20, 0x6e, 0x22, 0x3, 0xf8, 0xd1, 0x48, 0x1f,
- 0xca, 0xe, 0x0,
-
- /* U+004C "L" */
- 0xfc, 0x7, 0xff, 0xfc, 0xf, 0xff, 0xe, 0xdf,
- 0x40, 0x4, 0xfe,
-
- /* U+004D "M" */
- 0xfc, 0x7, 0xfd, 0xf8, 0x4, 0x3, 0xfa, 0x1,
- 0x99, 0x3, 0xe2, 0xc0, 0xee, 0x7, 0xd0, 0xe,
- 0x65, 0x81, 0xc9, 0x40, 0x68, 0x20, 0x1d, 0x5,
- 0x3, 0xa0, 0x80, 0x4c, 0xc0, 0x3c, 0xcb, 0x20,
- 0x21, 0x60, 0x7d, 0xc7, 0x14, 0x40, 0x3f, 0x16,
- 0x62, 0x50, 0x1f, 0xd0, 0x31, 0x40, 0xff, 0xa0,
- 0x80, 0x7f, 0xf0, 0x1d, 0x60, 0x7f, 0xf0, 0x50,
- 0x1f, 0x0,
-
- /* U+004E "N" */
- 0xfc, 0x40, 0xfb, 0x72, 0x3, 0x81, 0xff, 0xc0,
- 0x34, 0xf, 0xfe, 0x2, 0x80, 0x7f, 0xa8, 0x68,
- 0xf, 0xe5, 0x45, 0x20, 0x7f, 0x26, 0x30, 0x1f,
- 0xe8, 0x86, 0x3, 0xfd, 0x49, 0x40, 0x3f, 0xdc,
- 0x36, 0x3, 0xf8, 0xd1, 0x8, 0x1f, 0xc9, 0x81,
- 0xff, 0xc0, 0x88, 0xf, 0xfe, 0x5, 0x20, 0x0,
-
- /* U+004F "O" */
- 0x3, 0x9e, 0xfe, 0xa8, 0xf, 0x97, 0x84, 0x10,
- 0xae, 0x20, 0x65, 0x43, 0xdf, 0x7c, 0x8e, 0x20,
- 0x54, 0x48, 0x20, 0x46, 0xb1, 0xc0, 0x40, 0xd8,
- 0xf, 0xa1, 0x24, 0x10, 0xa0, 0x7f, 0x51, 0xc1,
- 0x4, 0xf, 0xe4, 0x18, 0x1f, 0xfc, 0x52, 0x8,
- 0x1f, 0xc8, 0x30, 0x85, 0x3, 0xfa, 0x8e, 0x20,
- 0x6c, 0x7, 0xd0, 0x92, 0x1, 0x44, 0xa4, 0x8,
- 0xd6, 0x38, 0x12, 0xa1, 0x6f, 0xbe, 0x47, 0x10,
- 0x32, 0xf0, 0x82, 0x15, 0xc4, 0x0,
-
- /* U+0050 "P" */
- 0xff, 0xec, 0xc0, 0xe2, 0x70, 0x33, 0x10, 0x2d,
- 0xb7, 0xc8, 0xf0, 0x3f, 0x1a, 0x9, 0x1, 0xfc,
- 0x83, 0x3, 0xff, 0x90, 0x50, 0x60, 0x7c, 0xb8,
- 0x44, 0x7, 0xfd, 0x4a, 0xa0, 0x44, 0xe4, 0xed,
- 0x1, 0xb6, 0xd6, 0x20, 0x3f, 0xfb, 0x60,
-
- /* U+0051 "Q" */
- 0x3, 0x9e, 0xfe, 0xa8, 0xf, 0xcb, 0xc2, 0x8,
- 0x57, 0x10, 0x39, 0x50, 0xb7, 0xde, 0xa3, 0x88,
- 0x1a, 0x89, 0x48, 0x12, 0xac, 0x70, 0x28, 0x13,
- 0x3, 0xe8, 0x49, 0x0, 0x42, 0x1, 0xfd, 0x47,
- 0x0, 0x41, 0x3, 0xf9, 0x6, 0x7, 0xff, 0x1c,
- 0x82, 0x7, 0xf2, 0xc, 0x2, 0x14, 0xf, 0xea,
- 0x38, 0xa, 0x1a, 0x3, 0xe8, 0x49, 0x0, 0x30,
- 0x58, 0x40, 0x8d, 0x63, 0x81, 0x9c, 0xf, 0x7d,
- 0xf2, 0x18, 0x81, 0xcf, 0x32, 0x8, 0x33, 0x90,
- 0x3e, 0x33, 0x76, 0xa, 0x2, 0xa0, 0x7f, 0x46,
- 0x35, 0xae, 0x88, 0x1f, 0xd2, 0xa5, 0xb1,
-
- /* U+0052 "R" */
- 0xff, 0xec, 0xc0, 0xe2, 0x70, 0x33, 0x10, 0x2d,
- 0xb7, 0xc8, 0xf0, 0x3f, 0x1a, 0x9, 0x1, 0xfc,
- 0x83, 0x3, 0xff, 0x90, 0x50, 0x60, 0x7c, 0xb8,
- 0x44, 0x7, 0xfd, 0x4a, 0xa0, 0x44, 0xc8, 0x87,
- 0x40, 0xdb, 0x57, 0x6, 0x40, 0xfe, 0xa3, 0x81,
- 0xfc, 0x99, 0x80, 0x7f, 0x42, 0xd0,
-
- /* U+0053 "S" */
- 0x2, 0x7b, 0xfb, 0x30, 0x36, 0x84, 0xf4, 0xc0,
- 0x21, 0x2d, 0xb7, 0x94, 0x2, 0x1c, 0x81, 0x9b,
- 0x1, 0x98, 0x1f, 0xd4, 0x56, 0x7, 0xe7, 0x4,
- 0xfa, 0x20, 0x39, 0xf8, 0x8b, 0xbd, 0x1, 0xce,
- 0xfc, 0x85, 0x20, 0x7c, 0x6b, 0x8, 0xf, 0xee,
- 0x38, 0xd4, 0x81, 0x8c, 0x18, 0x35, 0xbe, 0xcf,
- 0x83, 0x42, 0xe6, 0x4c, 0x15, 0x80,
-
- /* U+0054 "T" */
- 0xff, 0xfe, 0xa8, 0x9c, 0x0, 0x9e, 0xbb, 0x5c,
- 0x1d, 0xb4, 0x3, 0xff, 0xfe, 0x7, 0xff, 0xb4,
-
- /* U+0055 "U" */
- 0x1f, 0x80, 0xf8, 0xfc, 0x7, 0xff, 0xfc, 0xf,
- 0xfe, 0x91, 0x4, 0xf, 0x30, 0xc2, 0x14, 0xf,
- 0x41, 0x85, 0xe, 0x1, 0xa9, 0xc, 0x1a, 0x1f,
- 0xdf, 0x90, 0xc0, 0x4b, 0x32, 0x40, 0xbe, 0x40,
-
- /* U+0056 "V" */
- 0x1b, 0xa0, 0x3f, 0xbf, 0x0, 0x82, 0x1, 0xf9,
- 0x86, 0x1, 0x2, 0x40, 0x7d, 0x45, 0x2, 0x82,
- 0x1, 0xe4, 0x51, 0x2, 0x61, 0x10, 0x3b, 0x8e,
- 0x7, 0x31, 0x40, 0xc5, 0x14, 0x7, 0x50, 0xc0,
- 0xd4, 0x50, 0x3c, 0x50, 0x60, 0x4c, 0x30, 0x3e,
- 0xe2, 0x80, 0x61, 0x81, 0xf9, 0x12, 0x42, 0x8,
- 0x7, 0xf5, 0x1d, 0x4, 0x7, 0xf9, 0x85, 0x44,
- 0x3, 0xfe, 0x60, 0x9, 0x1, 0xff, 0x40, 0x10,
- 0xf, 0x0,
-
- /* U+0057 "W" */
- 0x3f, 0x1, 0xf6, 0xec, 0xf, 0x1f, 0x49, 0xc0,
- 0x78, 0x8a, 0x7, 0xa8, 0xe1, 0xa, 0x7, 0x30,
- 0x4, 0xf, 0x20, 0x85, 0x8, 0xe, 0xa1, 0x86,
- 0x6, 0x24, 0x80, 0x13, 0x80, 0x89, 0x2a, 0x28,
- 0x1a, 0x8e, 0x4, 0x85, 0x2, 0x43, 0x93, 0x1,
- 0x90, 0x40, 0x54, 0x20, 0x2a, 0x10, 0xa1, 0x80,
- 0x24, 0x80, 0xc4, 0xe0, 0x49, 0x0, 0x42, 0x80,
- 0xa3, 0x81, 0xc8, 0x51, 0x47, 0x0, 0x4e, 0xc,
- 0x20, 0x3a, 0x84, 0x10, 0x40, 0x54, 0x22, 0x10,
- 0x1e, 0x26, 0x65, 0x1, 0x98, 0xb4, 0x38, 0x1f,
- 0x21, 0x7, 0x3, 0x89, 0x30, 0x80, 0xfa, 0x81,
- 0x20, 0x3a, 0x80, 0x40, 0x7e, 0x24, 0x18, 0x1e,
- 0x60, 0x38, 0x18,
-
- /* U+0058 "X" */
- 0x1f, 0x88, 0x1e, 0xbd, 0x80, 0xa3, 0x1, 0xcd,
- 0x23, 0x0, 0x98, 0xa0, 0x46, 0xa, 0x6, 0x85,
- 0x30, 0x1c, 0x50, 0x3d, 0xc4, 0x30, 0xb4, 0x7,
- 0x8c, 0x19, 0x98, 0x7, 0xe6, 0x80, 0x70, 0x3f,
- 0xc8, 0x2, 0x3, 0xfa, 0x86, 0x21, 0x3, 0xe6,
- 0x8c, 0xa3, 0x81, 0xe3, 0x7, 0x9, 0xd, 0x3,
- 0xb8, 0xa4, 0x5, 0x29, 0x0, 0xa9, 0x48, 0x6,
- 0xe2, 0x90, 0x90, 0xd0, 0x38, 0xc1, 0xc0,
-
- /* U+0059 "Y" */
- 0x1b, 0xa0, 0x3e, 0x5e, 0x80, 0xe2, 0x81, 0xf4,
- 0x10, 0x1, 0x62, 0x1, 0xcc, 0xc2, 0x5, 0x3,
- 0x20, 0x46, 0x16, 0x7, 0x51, 0xc0, 0xa0, 0x80,
- 0x79, 0x21, 0x61, 0x2c, 0x7, 0xd0, 0x41, 0x45,
- 0x3, 0xf1, 0x63, 0x88, 0x7, 0xfa, 0x10, 0x58,
- 0x1f, 0xf2, 0x14, 0xf, 0xff, 0xb0,
-
- /* U+005A "Z" */
- 0x1f, 0xff, 0xc8, 0x13, 0xf8, 0x9, 0x8d, 0xbf,
- 0x11, 0x8, 0x1f, 0xa9, 0x6c, 0x7, 0xe8, 0x8c,
- 0x3, 0xf2, 0x63, 0x1, 0xf8, 0xd1, 0x80, 0xfe,
- 0xc2, 0x90, 0x3f, 0x60, 0xd0, 0x1f, 0xa1, 0x50,
- 0xf, 0xcd, 0x8d, 0x3, 0xf2, 0x83, 0x81, 0xfd,
- 0x40, 0x7d, 0xbe, 0x64, 0x8, 0x9f, 0xdc,
-
- /* U+005B "[" */
- 0xff, 0x20, 0x9, 0x18, 0xb, 0x44, 0xf, 0xff,
- 0xe5, 0xa2, 0x1, 0x23,
-
- /* U+005C "\\" */
- 0x4c, 0xf, 0x8c, 0x40, 0x79, 0x8e, 0x7, 0xc5,
- 0x1, 0xf5, 0x8, 0xf, 0x31, 0xc0, 0xf9, 0x20,
- 0x1f, 0x60, 0x80, 0xf3, 0x1c, 0xf, 0x92, 0x1,
- 0xf6, 0x8, 0xf, 0x31, 0xc0, 0xf9, 0x20, 0x1f,
- 0x70, 0xc0, 0xf2, 0x18, 0xf, 0x92, 0x1, 0xf7,
- 0xc, 0xf, 0x21, 0x80, 0xf9, 0x20, 0x1f, 0x70,
+ 0x7f, 0xfc, 0x1f, 0xfc, 0x37, 0xfa, 0x10, 0xfe,
+ 0x88, 0x68, 0x19, 0xe, 0x43, 0xa2, 0xf, 0xf9,
+ 0xf, 0xd1, 0x7, 0xf2, 0x21, 0xfa, 0x10, 0xfe,
+ 0x48, 0x3f, 0x22, 0x1f, 0xd1, 0x7, 0xe4, 0x43,
0xc0,
+ /* U+0038 "8" */
+ 0x9, 0xfd, 0x21, 0xb8, 0x8, 0xd0, 0x8, 0x3d,
+ 0x78, 0x51, 0x90, 0x72, 0x16, 0x61, 0xc8, 0x4b,
+ 0x75, 0x62, 0x81, 0x81, 0x60, 0x60, 0x62, 0xfa,
+ 0x24, 0x8d, 0x9, 0x88, 0x3f, 0x90, 0xff, 0xe1,
+ 0xa4, 0x1d, 0x89, 0xf, 0xaf, 0x2, 0x7, 0x1,
+ 0x1b, 0x0,
+
+ /* U+0039 "9" */
+ 0xa, 0xfa, 0x43, 0x3a, 0x23, 0x40, 0xa2, 0xef,
+ 0xa, 0x11, 0x41, 0xb2, 0xf, 0xfe, 0xa, 0x28,
+ 0x36, 0x4, 0x4b, 0xa6, 0x1d, 0x44, 0x5b, 0x43,
+ 0x37, 0xd0, 0x88, 0x7f, 0xf2, 0x21, 0x9, 0xd,
+ 0x24, 0x6, 0xfc, 0x98, 0x4a, 0xd, 0x61, 0x0,
+
+ /* U+003A ":" */
+ 0x2d, 0x13, 0x26, 0x18, 0x3f, 0xf8, 0xcc, 0x9,
+ 0x84, 0xc0,
+
+ /* U+003B ";" */
+ 0x2d, 0x13, 0x26, 0x18, 0x3f, 0xf8, 0xcc, 0x9,
+ 0x84, 0xcc, 0x4c, 0x26, 0x0,
+
+ /* U+003C "<" */
+ 0xf, 0xc8, 0x7d, 0x72, 0x13, 0xe5, 0x49, 0x70,
+ 0xf2, 0x49, 0x70, 0x7d, 0xa1, 0xd6, 0xab, 0x43,
+ 0xae, 0x2e, 0xe, 0x7c, 0xb0, 0x7d, 0x68,
+
+ /* U+003D "=" */
+ 0xbf, 0xf3, 0xaf, 0xfa, 0xbf, 0x7, 0xff, 0x26,
+ 0xff, 0xce, 0xbf, 0xc0,
+
+ /* U+003E ">" */
+ 0x43, 0xfb, 0xe4, 0x3d, 0x42, 0xe0, 0xe7, 0xca,
+ 0xf2, 0x1d, 0x71, 0x21, 0xcc, 0x4, 0x2b, 0x8b,
+ 0x1f, 0x2b, 0xc8, 0x32, 0xe0, 0xeb, 0x43, 0xe0,
+
+ /* U+003F "?" */
+ 0x3, 0xfa, 0xd, 0xc1, 0x9d, 0x11, 0xfc, 0x90,
+ 0xf0, 0x68, 0x3f, 0xf9, 0x31, 0x7, 0xda, 0xc1,
+ 0xec, 0x60, 0xf2, 0x8, 0x3e, 0x68, 0x1f, 0xca,
+ 0xf, 0xe8, 0x3f, 0xa7, 0xf, 0xd8, 0x86,
+
+ /* U+0040 "@" */
+ 0xf, 0x37, 0xf4, 0x1f, 0xf7, 0x2a, 0xa5, 0x70,
+ 0x7c, 0xe7, 0xa5, 0xae, 0x70, 0xf4, 0xe0, 0x68,
+ 0x83, 0x9c, 0x36, 0x40, 0xe5, 0x5a, 0x88, 0x80,
+ 0x98, 0x32, 0xf4, 0x41, 0x48, 0x30, 0xa2, 0x40,
+ 0xe1, 0x91, 0x14, 0x4, 0x43, 0x90, 0xec, 0x18,
+ 0x7f, 0xb0, 0xc8, 0x7f, 0xf2, 0xf0, 0x21, 0xf6,
+ 0x19, 0x2, 0x81, 0x18, 0x65, 0x7, 0x66, 0x1a,
+ 0x3a, 0x74, 0x29, 0x88, 0x98, 0x18, 0x5a, 0x61,
+ 0x58, 0x59, 0x1, 0xfa, 0x47, 0xd0, 0x74, 0xe1,
+ 0xff, 0xc5, 0x73, 0xd2, 0xa9, 0xa1, 0xfe, 0xe5,
+ 0x51, 0x24, 0x38,
+
+ /* U+0041 "A" */
+ 0xf, 0xbd, 0x7, 0xff, 0x1, 0x2, 0x1f, 0xfc,
+ 0x8, 0x44, 0x3f, 0xc8, 0xc4, 0x1f, 0xec, 0x84,
+ 0x43, 0xf9, 0xa, 0x20, 0xfd, 0x10, 0x7f, 0xf0,
+ 0x51, 0xa, 0x20, 0xf4, 0x41, 0x91, 0xf, 0x25,
+ 0xfc, 0x8, 0x32, 0x5, 0xf8, 0x43, 0x47, 0x5f,
+ 0x24, 0x4, 0x43, 0xf4, 0x20, 0x8c, 0x3f, 0x91,
+
+ /* U+0042 "B" */
+ 0xff, 0xd2, 0x1c, 0xbc, 0x34, 0xd, 0x5d, 0xc2,
+ 0x1f, 0xe5, 0x8, 0x7f, 0x90, 0xff, 0xa0, 0x21,
+ 0x7f, 0x93, 0xc, 0xbc, 0x16, 0x1a, 0xbb, 0xc9,
+ 0x7, 0xfa, 0x10, 0xff, 0xe5, 0xc1, 0xd5, 0xed,
+ 0x20, 0x97, 0xc3, 0xa0,
+
+ /* U+0043 "C" */
+ 0xe, 0x7f, 0x48, 0x73, 0xc1, 0x9b, 0x9, 0x87,
+ 0xf9, 0x10, 0x45, 0x3, 0xad, 0x21, 0x41, 0xfe,
+ 0x48, 0x3f, 0xfd, 0x29, 0x7, 0xfd, 0xa, 0xf,
+ 0xfa, 0x28, 0x1d, 0x68, 0x18, 0x7f, 0x91, 0x9,
+ 0xe0, 0xcd, 0x80,
+
+ /* U+0044 "D" */
+ 0xff, 0xd2, 0x1f, 0xfc, 0x6, 0x81, 0xdf, 0xe8,
+ 0x70, 0xff, 0x38, 0x20, 0xff, 0xb1, 0xf, 0xfe,
+ 0x2, 0x21, 0xff, 0xc1, 0xc3, 0xfe, 0xcc, 0x3f,
+ 0xec, 0x3f, 0xf8, 0x28, 0x87, 0xfa, 0x10, 0xfe,
+ 0x74, 0x82, 0xff, 0x43, 0x87, 0xf9, 0xa0, 0x40,
+
+ /* U+0045 "E" */
+ 0xff, 0xf0, 0x7f, 0xf0, 0xbf, 0xf0, 0x7f, 0xf6,
+ 0x3f, 0xe0, 0xff, 0xe1, 0xff, 0xc1, 0xff, 0xd9,
+ 0xff, 0xc1, 0xff, 0x20,
+
+ /* U+0046 "F" */
+ 0xff, 0xf0, 0x7f, 0xf0, 0x3f, 0xf0, 0x7f, 0xf5,
+ 0x3f, 0xe0, 0xff, 0xe0, 0xff, 0xc1, 0xff, 0xe7,
+
+ /* U+0047 "G" */
+ 0xe, 0x7f, 0x48, 0x73, 0xc1, 0x9b, 0x9, 0x87,
+ 0xf9, 0x10, 0x45, 0x3, 0xad, 0x21, 0x41, 0xfe,
+ 0x48, 0x3f, 0xfb, 0x1c, 0x1f, 0xfc, 0x34, 0x83,
+ 0xfe, 0x85, 0x7, 0xfd, 0x14, 0xe, 0x83, 0x30,
+ 0xff, 0x26, 0x13, 0xc1, 0x9b, 0x40,
+
+ /* U+0048 "H" */
+ 0xf0, 0x7e, 0xf0, 0x7f, 0xfe, 0x3f, 0xf0, 0x7f,
+ 0xf1, 0xbf, 0xf0, 0x7f, 0xfe, 0x0,
+
+ /* U+0049 "I" */
+ 0xf0, 0x7f, 0xf7, 0x0,
+
+ /* U+004A "J" */
+ 0x7, 0xfc, 0x81, 0xf, 0xeb, 0xf2, 0x1f, 0xff,
+ 0xf0, 0xc8, 0x9e, 0x9, 0xc, 0x9f, 0x44, 0xa,
+ 0x6, 0x90,
+
+ /* U+004B "K" */
+ 0xf0, 0x7d, 0x70, 0x7f, 0x4a, 0x83, 0xf4, 0xa8,
+ 0x3f, 0x4a, 0x83, 0xf4, 0xa8, 0x3f, 0x4a, 0x83,
+ 0xf4, 0x90, 0x7e, 0x90, 0x61, 0xf9, 0x34, 0xc3,
+ 0xf6, 0x40, 0x83, 0xd8, 0x58, 0xa0, 0xff, 0x64,
+ 0x87, 0xfa, 0x20, 0xff, 0x31, 0x80,
+
+ /* U+004C "L" */
+ 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xc3, 0xff, 0x41,
+ 0xfe,
+
+ /* U+004D "M" */
+ 0xf0, 0x7f, 0xde, 0x4, 0x1f, 0xd0, 0x64, 0x3f,
+ 0x90, 0xec, 0x3e, 0x83, 0x91, 0xe, 0x58, 0x34,
+ 0x41, 0xd1, 0x7, 0x44, 0x12, 0x41, 0xe4, 0x42,
+ 0x84, 0x3e, 0xcc, 0x88, 0x3f, 0x92, 0x58, 0x3f,
+ 0xa1, 0x20, 0xff, 0xa2, 0xf, 0xfe, 0x3, 0x21,
+ 0xff, 0xc1, 0x43, 0xe0,
+
+ /* U+004E "N" */
+ 0xf0, 0x7e, 0xf0, 0x58, 0x7f, 0xf0, 0x60, 0xff,
+ 0xe0, 0x30, 0x7f, 0xa1, 0x41, 0xfc, 0xc4, 0x1f,
+ 0xe5, 0x18, 0x7f, 0xa4, 0xc3, 0xfd, 0x2, 0xf,
+ 0xf6, 0x28, 0x3f, 0xd1, 0x7, 0xf9, 0x41, 0xff,
+ 0xc0, 0x90, 0xff, 0xe0, 0x41, 0x0,
+
+ /* U+004F "O" */
+ 0xe, 0x7f, 0x48, 0x7c, 0xf0, 0x66, 0xc3, 0x98,
+ 0x7f, 0x93, 0xd, 0x14, 0xe, 0x93, 0x4, 0x28,
+ 0x3e, 0x80, 0x89, 0x7, 0xf4, 0x61, 0xff, 0xc1,
+ 0x44, 0x3f, 0xfa, 0x28, 0x89, 0x7, 0xf4, 0x64,
+ 0x28, 0x3e, 0x80, 0x82, 0x28, 0x1d, 0x26, 0x13,
+ 0xf, 0xf2, 0x61, 0xcf, 0x6, 0x6c, 0x20,
+
+ /* U+0050 "P" */
+ 0xff, 0xc8, 0x7f, 0xd6, 0x1b, 0xfc, 0x98, 0x7f,
+ 0x41, 0xff, 0xc0, 0x44, 0x3f, 0xf9, 0x28, 0x87,
+ 0xce, 0x21, 0x7f, 0x43, 0x7, 0xca, 0xa0, 0x6f,
+ 0xd4, 0x43, 0xff, 0xb6,
+
+ /* U+0051 "Q" */
+ 0xe, 0x7f, 0x48, 0x7e, 0x78, 0x33, 0x61, 0xe6,
+ 0x1f, 0xd2, 0x61, 0xd1, 0x40, 0xcc, 0x98, 0x50,
+ 0xa0, 0xfa, 0x2, 0x4, 0x83, 0xfa, 0x30, 0xff,
+ 0xe1, 0x22, 0x1f, 0xfd, 0x34, 0x40, 0x90, 0x7f,
+ 0x46, 0x8, 0x50, 0x7d, 0x1, 0xa, 0x28, 0x1d,
+ 0x26, 0x19, 0x87, 0xf9, 0x30, 0xf3, 0xa1, 0xd6,
+ 0x1f, 0xd7, 0x90, 0x21, 0x41, 0xfd, 0x27, 0x4d,
+ 0xf, 0xf5, 0x17, 0x60,
+
+ /* U+0052 "R" */
+ 0xff, 0xc8, 0x7f, 0xd6, 0x1b, 0xfc, 0x98, 0x7f,
+ 0x41, 0xff, 0xc0, 0x44, 0x3f, 0xf9, 0x28, 0x87,
+ 0xce, 0x21, 0x7f, 0x43, 0x7, 0x90, 0x30, 0x6f,
+ 0xac, 0x43, 0xfd, 0x18, 0x7f, 0x28, 0x83, 0xfa,
+ 0x14,
+
+ /* U+0053 "S" */
+ 0x9, 0xfe, 0x43, 0x70, 0x75, 0x82, 0x7, 0xf5,
+ 0x0, 0x98, 0x72, 0x83, 0x21, 0xfd, 0x12, 0x1f,
+ 0x98, 0xbd, 0x21, 0xcf, 0x23, 0x68, 0x73, 0x79,
+ 0x20, 0xfe, 0x91, 0xf, 0xec, 0xce, 0xf, 0x46,
+ 0x2b, 0xfc, 0x28, 0xb4, 0x33, 0x40,
+
+ /* U+0054 "T" */
+ 0xff, 0xfa, 0x43, 0xfe, 0xbf, 0x3, 0xf4, 0x1f,
+ 0xff, 0xf0, 0xff, 0xf6, 0x80,
+
+ /* U+0055 "U" */
+ 0x3c, 0x1f, 0xbc, 0x1f, 0xff, 0xf0, 0xff, 0xed,
+ 0xa2, 0x24, 0x1e, 0x8c, 0x86, 0xd, 0x1, 0x4,
+ 0x3f, 0x93, 0x9, 0xd0, 0xce, 0x0,
+
+ /* U+0056 "V" */
+ 0x3c, 0x87, 0xf7, 0x81, 0x10, 0x7e, 0x44, 0x8,
+ 0x7f, 0xa2, 0xa, 0x20, 0xf2, 0x21, 0x91, 0xf,
+ 0x66, 0x1c, 0x90, 0x72, 0x21, 0xd0, 0x86, 0x88,
+ 0x3e, 0x44, 0x24, 0x43, 0xec, 0x80, 0x88, 0x7e,
+ 0x40, 0x91, 0x7, 0xf4, 0x68, 0x87, 0xf9, 0x18,
+ 0x83, 0xfe, 0x43, 0xff, 0x87, 0x2, 0xf, 0x0,
+
+ /* U+0057 "W" */
+ 0x3c, 0x1f, 0x79, 0xf, 0xb8, 0x3f, 0xf8, 0x10,
+ 0x7a, 0x31, 0x20, 0xe4, 0x3f, 0x91, 0x21, 0xe,
+ 0x84, 0x43, 0xc8, 0x7f, 0xcc, 0x41, 0xa3, 0x9,
+ 0x20, 0x93, 0xf, 0x91, 0xa, 0x10, 0xa1, 0x21,
+ 0xc, 0x87, 0xfc, 0x81, 0x20, 0x46, 0x1c, 0x91,
+ 0x18, 0x7c, 0x88, 0x74, 0x22, 0x21, 0x42, 0x4,
+ 0x3f, 0x91, 0xc, 0x94, 0x30, 0xf9, 0x23, 0xf,
+ 0x91, 0xf, 0xa0, 0x90, 0xe8, 0x8, 0x7f, 0xc8,
+ 0x79, 0x6, 0x18,
+
+ /* U+0058 "X" */
+ 0x3c, 0x1f, 0x5a, 0x8, 0xc3, 0x97, 0x1, 0x44,
+ 0x1a, 0x20, 0xd0, 0xa0, 0x64, 0x1e, 0xc8, 0x85,
+ 0x7, 0xd1, 0xa4, 0x1f, 0x94, 0xc, 0x3f, 0xc8,
+ 0x10, 0xfe, 0x84, 0x83, 0xf2, 0x8a, 0x18, 0x7d,
+ 0x18, 0xa2, 0xe, 0xc8, 0x28, 0x50, 0x50, 0xa0,
+ 0xd9, 0x1, 0x44, 0x1e, 0x8c,
+
+ /* U+0059 "Y" */
+ 0x3c, 0x87, 0xcf, 0x3, 0x20, 0xfa, 0x20, 0x92,
+ 0xe, 0x48, 0x34, 0x21, 0xd0, 0x87, 0x46, 0x14,
+ 0x41, 0xe5, 0x8, 0xb8, 0x3e, 0x88, 0x88, 0x3f,
+ 0x93, 0x20, 0xff, 0x41, 0x21, 0xff, 0x24, 0x1f,
+ 0xff, 0x60,
+
+ /* U+005A "Z" */
+ 0x3f, 0xfe, 0x43, 0xff, 0x80, 0x9f, 0xf8, 0x10,
+ 0x7f, 0x42, 0x83, 0xf4, 0x90, 0x7e, 0x51, 0x87,
+ 0xf4, 0x61, 0xfd, 0x90, 0x7f, 0x62, 0x83, 0xf4,
+ 0x30, 0x7e, 0x51, 0x7, 0xe6, 0x30, 0xfe, 0x81,
+ 0xff, 0x90, 0xff, 0xe0, 0x60,
+
+ /* U+005B "[" */
+ 0xfc, 0x81, 0x60, 0x50, 0x3f, 0xff, 0xb4, 0x9,
+ 0x60,
+
+ /* U+005C "\\" */
+ 0x50, 0x7e, 0x90, 0xf2, 0x61, 0xf9, 0xf, 0xa1,
+ 0xf, 0x26, 0x1f, 0x28, 0x3e, 0xc4, 0x3c, 0x98,
+ 0x7c, 0xa0, 0xfb, 0x10, 0xf2, 0x61, 0xf2, 0x83,
+ 0xec, 0x43, 0xc9, 0x87, 0xca, 0xf, 0xb1, 0xf,
+ 0x26, 0x1f, 0x28, 0x3e, 0xc4,
+
/* U+005D "]" */
- 0xbf, 0xd3, 0x22, 0x1, 0xd8, 0x7, 0xff, 0xf1,
- 0xd8, 0x3, 0x22, 0x0,
+ 0xbe, 0xb4, 0x26, 0x81, 0xff, 0xfc, 0x68, 0xd,
+ 0x8,
/* U+005E "^" */
- 0x3, 0x34, 0x7, 0xca, 0x50, 0x3e, 0x88, 0x30,
- 0x38, 0x97, 0x74, 0xe, 0xa5, 0x52, 0x80, 0xce,
- 0x82, 0x5c, 0x9, 0x86, 0x2, 0xa2, 0x2, 0xa0,
- 0x26, 0x28, 0x46, 0x1, 0x9b, 0x0,
+ 0xc, 0xa0, 0xf9, 0xa0, 0x7d, 0x22, 0x1f, 0x6c,
+ 0x1d, 0xc, 0x21, 0x98, 0x2c, 0x24, 0x41, 0x21,
+ 0x48, 0x49, 0x9, 0x6, 0x50,
/* U+005F "_" */
- 0x3, 0xfd, 0xff, 0xfb, 0x6f, 0xf0,
+ 0xf, 0xf7, 0xff, 0xf2, 0x0,
/* U+0060 "`" */
- 0x2d, 0x80, 0x89, 0x4c, 0x4, 0xb0, 0xc0,
+ 0x14, 0x1d, 0x61, 0x39, 0x80,
/* U+0061 "a" */
- 0xa, 0xff, 0x54, 0x1, 0xd4, 0x51, 0x55, 0x4,
- 0x9f, 0x5d, 0x5, 0x6, 0x81, 0x99, 0x4, 0xf,
- 0xfa, 0x7f, 0xc4, 0x4, 0x66, 0x5b, 0x10, 0xc,
- 0x66, 0x94, 0xc0, 0xfc, 0x50, 0x6, 0x33, 0x69,
- 0x80, 0xa4, 0x9, 0xa, 0xb0, 0x0,
+ 0x1b, 0xe9, 0x3, 0x22, 0x32, 0x2b, 0xd7, 0x10,
+ 0x20, 0xc8, 0x7f, 0xf0, 0xaf, 0xe0, 0xa4, 0xac,
+ 0x12, 0x6b, 0xc1, 0xfc, 0x81, 0x35, 0x58, 0x54,
+ 0x28, 0xc8, 0x0,
/* U+0062 "b" */
- 0x3e, 0x81, 0xff, 0xe5, 0x9f, 0xb4, 0x20, 0x67,
- 0xd9, 0x33, 0xc8, 0x8, 0x8d, 0xae, 0xc5, 0x3,
- 0x62, 0x5, 0x10, 0x60, 0x9, 0x1, 0xdc, 0x60,
- 0xc, 0xf, 0x30, 0xc0, 0x30, 0x3c, 0xc3, 0x0,
- 0x48, 0xe, 0xe3, 0x1, 0x62, 0x5, 0x10, 0x60,
- 0x8, 0xda, 0xec, 0x50, 0x27, 0xd9, 0x20, 0xf2,
+ 0x38, 0x3f, 0xfc, 0xb7, 0xd0, 0x73, 0xa1, 0x3a,
+ 0x1d, 0xf9, 0x20, 0xd8, 0x69, 0x10, 0xfe, 0xcc,
+ 0x8, 0x79, 0x10, 0x21, 0xe4, 0x43, 0xfb, 0x30,
+ 0xb0, 0xd2, 0x21, 0xbf, 0x24, 0x13, 0xa1, 0x3a,
0x0,
/* U+0063 "c" */
- 0x2, 0x37, 0xfa, 0x1, 0x9e, 0x44, 0x83, 0xe4,
- 0x28, 0x2e, 0xcf, 0x2, 0x10, 0x54, 0x4, 0xfb,
- 0x4, 0x20, 0x3e, 0x20, 0x81, 0xf8, 0x82, 0x7,
- 0xf1, 0x8, 0xf, 0xd0, 0x54, 0x4, 0xfb, 0xa,
- 0xb, 0xb3, 0xc0, 0x80, 0x3c, 0x89, 0x7, 0xc8,
+ 0xd, 0x7d, 0x6, 0x74, 0x27, 0x3, 0x17, 0xd0,
+ 0x91, 0x21, 0x3a, 0x12, 0x1f, 0xfd, 0x44, 0x3f,
+ 0x44, 0x84, 0xe8, 0xc5, 0xf4, 0x20, 0x74, 0x27,
+ 0x0,
/* U+0064 "d" */
- 0x3, 0xfd, 0xf0, 0x1f, 0xfd, 0xb5, 0x7f, 0x66,
- 0x7, 0x4a, 0x89, 0xa5, 0x2, 0x4c, 0x5d, 0x9e,
- 0x20, 0x28, 0x2a, 0x2, 0x6c, 0x4, 0x42, 0x3,
- 0xa8, 0x2, 0x8, 0x1e, 0x20, 0x8, 0x20, 0x78,
- 0x81, 0x10, 0x80, 0xea, 0x5, 0x5, 0x20, 0x49,
- 0x81, 0x26, 0x35, 0xad, 0x50, 0x1a, 0x54, 0xa1,
- 0x28, 0x0,
+ 0xf, 0xf7, 0x83, 0xff, 0xb6, 0xdf, 0x21, 0xd4,
+ 0x42, 0xa0, 0x4a, 0x2f, 0xa4, 0x28, 0x90, 0x94,
+ 0x1c, 0x87, 0x41, 0xff, 0xd1, 0x43, 0xa0, 0xa2,
+ 0xc, 0xa0, 0x94, 0x74, 0xe4, 0x35, 0x16, 0x28,
+ 0x0,
/* U+0065 "e" */
- 0x2, 0x57, 0xf6, 0x60, 0x74, 0xa8, 0xa3, 0x30,
- 0x12, 0x67, 0x65, 0xe8, 0xc0, 0x10, 0x72, 0x5,
- 0x4b, 0x0, 0x41, 0x3, 0x90, 0x44, 0x7, 0xfe,
- 0x60, 0x90, 0xb, 0x7f, 0x30, 0x43, 0x4b, 0xe0,
- 0x10, 0x64, 0x4, 0x69, 0x0, 0xa0, 0xbf, 0x69,
- 0x20, 0x13, 0xc8, 0x12, 0x59, 0x80,
+ 0x9, 0xbe, 0x43, 0xa8, 0x89, 0x61, 0x28, 0xf5,
+ 0xa4, 0x8, 0xc3, 0x42, 0x1f, 0xe4, 0x42, 0xff,
+ 0x21, 0xd5, 0xf9, 0x9, 0x7f, 0x2, 0x34, 0x34,
+ 0x13, 0x17, 0xe5, 0x4, 0xe8, 0x4e, 0x80,
/* U+0066 "f" */
- 0x2, 0x7b, 0xe6, 0x1, 0xc2, 0x80, 0xd4, 0x6b,
- 0x98, 0x2, 0x8, 0x15, 0xe0, 0x3f, 0x86, 0x40,
- 0x12, 0x83, 0xa0, 0x2d, 0x80, 0xff, 0xfa, 0x80,
+ 0x9, 0xf9, 0x3, 0x8, 0x68, 0xed, 0xf, 0xd6,
+ 0xf, 0x8d, 0x2, 0xc3, 0x2, 0xa0, 0xff, 0xfa,
+ 0x80,
/* U+0067 "g" */
- 0x2, 0x57, 0xf6, 0x63, 0x70, 0x12, 0xa2, 0x69,
- 0x88, 0x4, 0xc5, 0xd9, 0xe9, 0x2, 0x82, 0xa0,
- 0x25, 0x0, 0x88, 0x40, 0x73, 0x0, 0x41, 0x3,
- 0xf8, 0x82, 0x7, 0xf8, 0x84, 0x7, 0x30, 0x28,
- 0x2a, 0x2, 0x50, 0x9, 0x31, 0x75, 0xf4, 0x81,
- 0xa5, 0x45, 0x19, 0x80, 0xe5, 0x7f, 0x66, 0x42,
- 0x1, 0x50, 0x18, 0xf1, 0xc2, 0x4b, 0xf5, 0xd8,
- 0x52, 0x5, 0x99, 0x24, 0x55, 0xa0,
+ 0x9, 0xbe, 0x4f, 0x2, 0x88, 0x56, 0x12, 0x8b,
+ 0xe8, 0x34, 0x48, 0x4c, 0x1c, 0x87, 0x21, 0xff,
+ 0xd1, 0x43, 0x90, 0xa2, 0x42, 0x60, 0x94, 0x5d,
+ 0xc1, 0xd4, 0x44, 0xb0, 0xe6, 0xf9, 0x2, 0x9,
+ 0xe, 0xcc, 0x55, 0xeb, 0xc2, 0x87, 0x40, 0x8d,
+ 0x0,
/* U+0068 "h" */
- 0x3e, 0x81, 0xff, 0xe1, 0x9f, 0xd0, 0xc, 0xfb,
- 0x24, 0x1e, 0x2, 0x25, 0xb6, 0x24, 0xc0, 0xb9,
- 0x0, 0x60, 0xa0, 0x9, 0x1, 0x90, 0x19, 0x81,
- 0xf1, 0x3, 0xff, 0xd6,
+ 0x38, 0x3f, 0xfc, 0x37, 0xd0, 0x67, 0x42, 0x70,
+ 0xef, 0xc0, 0x42, 0xc3, 0x44, 0x1f, 0x90, 0xc8,
+ 0x7f, 0xfc, 0xc0,
/* U+0069 "i" */
- 0x3e, 0x84, 0x10, 0x6d, 0x40, 0x44, 0xf, 0xa0,
- 0x7f, 0xf7, 0x40,
+ 0x38, 0x44, 0x54, 0x9, 0x7, 0x7, 0xff, 0x74,
/* U+006A "j" */
- 0x2, 0x3f, 0x1, 0x98, 0x20, 0x65, 0x28, 0x1c,
- 0xd0, 0x1d, 0xf0, 0x1f, 0xff, 0xf0, 0x3c, 0x83,
- 0xf, 0x5a, 0x1c, 0x1, 0x46, 0xa0,
+ 0xd, 0xe0, 0xc8, 0x79, 0xa0, 0x72, 0x83, 0xbc,
+ 0x1f, 0xff, 0xf0, 0xf2, 0x23, 0xd0, 0xc2, 0x49,
+ 0x0,
/* U+006B "k" */
- 0x3e, 0x81, 0xff, 0xe8, 0x3b, 0xa0, 0x3e, 0x38,
- 0xc4, 0x7, 0x8e, 0x11, 0x81, 0xe3, 0x84, 0x60,
- 0x79, 0x60, 0xd8, 0xf, 0x2a, 0x1, 0x90, 0x3f,
- 0x56, 0x38, 0x1f, 0x55, 0x9, 0x40, 0x39, 0x20,
- 0xc, 0x1b, 0x1, 0xfd, 0x44, 0x20, 0x7e, 0x50,
- 0x70,
+ 0x38, 0x3f, 0xfd, 0x3e, 0x43, 0xf6, 0x48, 0x7d,
+ 0x92, 0x1f, 0x64, 0x87, 0x9c, 0x50, 0x79, 0x80,
+ 0x87, 0xf4, 0x98, 0x7d, 0x30, 0x20, 0xe5, 0x3,
+ 0x14, 0x1f, 0xd1, 0x7, 0xf3, 0x18,
/* U+006C "l" */
- 0x3e, 0x81, 0xff, 0xde,
+ 0x38, 0x3f, 0xfb, 0xc0,
/* U+006D "m" */
- 0x3e, 0x9b, 0xfb, 0x30, 0xb, 0x7e, 0xc8, 0xc,
- 0xf2, 0x42, 0x52, 0xd8, 0xa2, 0x55, 0x81, 0x15,
- 0xee, 0xc0, 0x95, 0xee, 0xa2, 0x1, 0xa8, 0x11,
- 0x60, 0x28, 0x12, 0x40, 0x80, 0x10, 0x3b, 0x84,
- 0x7, 0x10, 0x40, 0x30, 0x38, 0x82, 0x7, 0xff,
- 0xfc, 0xf, 0xfe, 0x80,
+ 0x38, 0xbe, 0x40, 0xfe, 0x43, 0x3a, 0x81, 0x58,
+ 0x41, 0x21, 0x9e, 0xf0, 0xb7, 0x71, 0x6, 0x83,
+ 0x20, 0x82, 0x50, 0x87, 0xec, 0x43, 0xfc, 0x87,
+ 0xff, 0xfc, 0x3f, 0xfb, 0x0,
/* U+006E "n" */
- 0x3e, 0x9b, 0xfd, 0x0, 0xcf, 0x22, 0x83, 0xc0,
- 0x44, 0xbe, 0xbc, 0x93, 0x2, 0xe0, 0x68, 0x28,
- 0x2, 0x40, 0x64, 0x6, 0x60, 0x7c, 0x40, 0xff,
- 0xf5, 0x80,
+ 0x38, 0xbe, 0x83, 0x3a, 0x23, 0x87, 0x7a, 0xc0,
+ 0x85, 0x86, 0x88, 0x3f, 0x21, 0x90, 0xff, 0xf9,
+ 0x80,
/* U+006F "o" */
- 0x2, 0x37, 0xf6, 0x80, 0x73, 0xc8, 0x99, 0xf4,
- 0x1, 0x41, 0x76, 0x78, 0x28, 0x8, 0x2a, 0x2,
- 0x6c, 0x18, 0x21, 0x1, 0xd4, 0x62, 0x8, 0x1e,
- 0x21, 0x90, 0x40, 0xf1, 0xc, 0x10, 0x80, 0xea,
- 0x30, 0x82, 0xa0, 0x26, 0xc1, 0x85, 0x5, 0xd9,
- 0xe0, 0xc0, 0x4f, 0x22, 0x67, 0xc8,
+ 0xd, 0x7d, 0x7, 0x3a, 0x13, 0xa0, 0x62, 0xfa,
+ 0x20, 0x44, 0x84, 0xa1, 0x9, 0xe, 0x8c, 0x3f,
+ 0xe4, 0x3f, 0xe4, 0x24, 0x3a, 0x32, 0x24, 0x25,
+ 0x8, 0xc5, 0xf4, 0x61, 0x3a, 0x13, 0x80,
/* U+0070 "p" */
- 0x3e, 0x99, 0xfb, 0x42, 0x6, 0x79, 0xa4, 0xf,
- 0x20, 0x22, 0x5a, 0xd6, 0x82, 0x81, 0xb9, 0x2,
- 0x6c, 0x18, 0x2, 0x40, 0x76, 0x18, 0x3, 0x3,
- 0xcc, 0x30, 0xc, 0xf, 0x30, 0xc0, 0x12, 0x3,
- 0xb8, 0xc0, 0x58, 0x81, 0x44, 0x18, 0x2, 0x36,
- 0xbb, 0x14, 0x9, 0xf6, 0x48, 0x3c, 0x80, 0xe9,
- 0xfd, 0x8, 0x1f, 0xfd, 0xa0,
+ 0x38, 0xbe, 0x83, 0x9d, 0x61, 0xd0, 0xee, 0x9c,
+ 0x41, 0xb0, 0xca, 0x10, 0xfe, 0xcc, 0x8, 0x79,
+ 0x10, 0x21, 0xe4, 0x43, 0xfb, 0x30, 0xb0, 0xd2,
+ 0x21, 0xbf, 0x24, 0x13, 0xa1, 0x3a, 0x1d, 0x7d,
+ 0x7, 0xff, 0x6c,
/* U+0071 "q" */
- 0x2, 0x57, 0xf6, 0x63, 0xe0, 0x12, 0xa2, 0x69,
- 0x40, 0x93, 0x17, 0x67, 0x88, 0xa, 0xa, 0x80,
- 0x9b, 0x1, 0x10, 0x80, 0xea, 0x0, 0x82, 0x7,
- 0x88, 0x2, 0x8, 0x1e, 0x20, 0x44, 0x20, 0x3a,
- 0x81, 0x41, 0x50, 0x13, 0x60, 0x24, 0xc5, 0xd9,
- 0xe2, 0x3, 0x4a, 0x89, 0xa5, 0x3, 0x95, 0xfd,
- 0x98, 0x1f, 0xfd, 0xb0,
+ 0x9, 0xbe, 0x4f, 0x2, 0x88, 0x54, 0x9, 0x45,
+ 0xf4, 0x85, 0x12, 0x12, 0x83, 0x90, 0xe8, 0x3f,
+ 0xfa, 0x28, 0x74, 0x14, 0x48, 0x4a, 0x9, 0x45,
+ 0xf4, 0x86, 0xa2, 0x15, 0x3, 0x9b, 0xe4, 0x3f,
+ 0xfb, 0x60,
/* U+0072 "r" */
- 0x3e, 0x89, 0xe0, 0x7, 0xd8, 0xe0, 0x8, 0xbd,
- 0x81, 0x54, 0x7, 0x20, 0x38, 0x81, 0xe6, 0x7,
- 0xff, 0x50,
+ 0x38, 0xb8, 0xe, 0x98, 0x6b, 0x42, 0x90, 0xe4,
+ 0x3f, 0xf8, 0x8, 0x7f, 0xf5, 0x0,
/* U+0073 "s" */
- 0x0, 0xb7, 0xf5, 0x40, 0x25, 0x24, 0x8a, 0x80,
- 0x18, 0xfa, 0xec, 0xe0, 0x82, 0x6, 0x24, 0x9,
- 0xb3, 0x20, 0x77, 0x25, 0x37, 0xa4, 0x1, 0xde,
- 0xc4, 0x98, 0x81, 0x93, 0xac, 0x21, 0x8, 0x18,
- 0x82, 0x9e, 0xf6, 0xba, 0x29, 0x2a, 0x9, 0xc,
- 0xc0,
+ 0x3, 0xfa, 0x41, 0x40, 0x23, 0x1, 0x3d, 0x7c,
+ 0x1f, 0xfc, 0x2d, 0xf, 0x60, 0xbd, 0x6, 0xf5,
+ 0x15, 0x87, 0x2a, 0x44, 0x83, 0xf2, 0xbd, 0x4d,
+ 0x15, 0x22, 0x8b, 0x0,
/* U+0074 "t" */
- 0x0, 0xe0, 0x1e, 0x8c, 0xf, 0xfe, 0x5, 0xe0,
- 0x3f, 0x86, 0x40, 0x12, 0x83, 0xa0, 0x2d, 0x80,
- 0xff, 0xef, 0x90, 0x80, 0xea, 0x2d, 0x66, 0x1,
- 0xc2, 0x81,
+ 0x3, 0x7, 0xa4, 0x3f, 0xf8, 0x16, 0xf, 0x8d,
+ 0x2, 0xc3, 0x2, 0xa0, 0xff, 0xf0, 0xa1, 0xd1,
+ 0x4d, 0x3, 0x8, 0x0,
/* U+0075 "u" */
- 0x5e, 0x81, 0xc7, 0xd0, 0x3f, 0xfe, 0x6c, 0x3,
- 0xc, 0xe, 0xc0, 0x9, 0x98, 0x12, 0x60, 0x50,
- 0x4d, 0x75, 0x20, 0x4b, 0x22, 0x84, 0xe0, 0x0,
+ 0x78, 0x3d, 0xc1, 0xff, 0xf3, 0x40, 0x88, 0x76,
+ 0x1c, 0x84, 0xa0, 0xa2, 0xee, 0xc, 0xe8, 0x96,
+ 0x0,
/* U+0076 "v" */
- 0x1b, 0x90, 0x3d, 0xf8, 0x5, 0x14, 0xe, 0x41,
- 0x80, 0x61, 0x81, 0xdc, 0x50, 0x26, 0x18, 0x11,
- 0x48, 0x40, 0xa8, 0xa0, 0x54, 0x70, 0x31, 0x44,
- 0x80, 0x32, 0x80, 0xee, 0x20, 0x62, 0x81, 0xe4,
- 0x50, 0xa1, 0x81, 0xf5, 0x14, 0xb0, 0x3f, 0x30,
- 0x85, 0x3, 0xf9, 0x82, 0x40, 0x60,
+ 0x3c, 0x1f, 0x78, 0x11, 0x7, 0x22, 0x4, 0x43,
+ 0xb2, 0x9, 0x10, 0xca, 0xd, 0x10, 0x51, 0x87,
+ 0x21, 0x91, 0xe, 0xc8, 0x48, 0x3c, 0x89, 0x8,
+ 0x7d, 0x10, 0x87, 0xe4, 0x48, 0x3f, 0x90, 0xf8,
/* U+0077 "w" */
- 0xbc, 0xf, 0x7e, 0x3, 0xde, 0xf0, 0xc0, 0xc8,
- 0x3, 0x3, 0x31, 0xd0, 0xa0, 0x6e, 0x3, 0x1,
- 0xa8, 0x41, 0x12, 0x2, 0x4b, 0x1, 0x8b, 0x1,
- 0xc5, 0x0, 0xc7, 0xe0, 0xc0, 0x31, 0x40, 0x20,
- 0x80, 0x50, 0x90, 0x50, 0x14, 0x10, 0x26, 0x4e,
- 0x60, 0x19, 0x39, 0x81, 0xa8, 0xb4, 0x28, 0xa,
- 0x2d, 0xa, 0x6, 0x24, 0xd8, 0x90, 0x2, 0x49,
- 0x92, 0x3, 0xa8, 0xa, 0x6, 0xa4, 0x50, 0x3c,
- 0xc0, 0x30, 0x32, 0x0, 0xc0, 0x80,
+ 0xb0, 0xf7, 0x83, 0xdd, 0x88, 0x64, 0x8, 0x64,
+ 0xd2, 0xd, 0x83, 0xd, 0x8, 0x87, 0x2e, 0xe,
+ 0x41, 0x90, 0x13, 0xc2, 0x4, 0x80, 0x88, 0x21,
+ 0x44, 0x8, 0x39, 0xc, 0x81, 0xc, 0x86, 0x8a,
+ 0x10, 0x22, 0x84, 0x1e, 0x50, 0x79, 0x41, 0xf4,
+ 0x8, 0x34, 0x8, 0x3c, 0x81, 0xc, 0x81, 0x8,
/* U+0078 "x" */
- 0x3f, 0x80, 0xed, 0xc9, 0x41, 0x40, 0xa9, 0x84,
- 0x34, 0x8c, 0x34, 0x8c, 0xa, 0x98, 0xa0, 0xa0,
- 0x77, 0x14, 0x60, 0x3c, 0x50, 0x44, 0xf, 0x34,
- 0x13, 0x3, 0x8c, 0x18, 0x42, 0x6, 0xe2, 0x9c,
- 0x38, 0x14, 0x2d, 0x2, 0xcd, 0x9, 0x98, 0x5,
- 0xa, 0x60,
+ 0x3c, 0x1d, 0xe0, 0x44, 0x14, 0x40, 0x5c, 0x2e,
+ 0xa, 0x26, 0x20, 0xec, 0x8c, 0x3e, 0x44, 0x3e,
+ 0x50, 0xa0, 0xf4, 0x64, 0x1d, 0x91, 0x98, 0x50,
+ 0xa0, 0x24, 0x28, 0x82, 0x85, 0x0,
/* U+0079 "y" */
- 0x1b, 0x90, 0x3d, 0xf8, 0x5, 0x14, 0xe, 0x41,
- 0x80, 0x61, 0x81, 0xdc, 0x50, 0x26, 0x18, 0x11,
- 0x48, 0x40, 0xa0, 0xa0, 0x54, 0x70, 0x39, 0x14,
- 0x1, 0x94, 0x7, 0x41, 0xc3, 0x14, 0xf, 0x12,
- 0x46, 0x86, 0x7, 0xd4, 0x72, 0xc0, 0xfc, 0xc1,
- 0x14, 0xf, 0xe6, 0x11, 0x3, 0xf8, 0x8e, 0x7,
- 0x88, 0x2, 0x8a, 0x3, 0x8e, 0xcb, 0x87, 0x3,
- 0xc5, 0x94, 0x69, 0x3, 0xc0,
+ 0x3c, 0x1f, 0x78, 0x11, 0x7, 0x22, 0x4, 0x43,
+ 0xb2, 0x9, 0x10, 0xca, 0xd, 0x10, 0x51, 0x87,
+ 0x22, 0x4, 0x43, 0xa3, 0x12, 0xf, 0xc9, 0x8,
+ 0x7d, 0x18, 0x87, 0xe4, 0x28, 0x3f, 0x91, 0xf,
+ 0xfe, 0x6, 0x1f, 0xe4, 0x43, 0xde, 0xb3, 0xf,
+ 0x91, 0x20, 0xf8,
/* U+007A "z" */
- 0x1f, 0xfe, 0x81, 0x2f, 0x0, 0xc2, 0xde, 0x21,
- 0xa0, 0x39, 0xb1, 0x80, 0x71, 0x83, 0x1, 0xee,
- 0x28, 0x1e, 0xa6, 0x20, 0x39, 0xa4, 0x60, 0x72,
- 0x86, 0x81, 0xea, 0x2, 0xde, 0x64, 0x1, 0x4b,
- 0xb0,
+ 0x3f, 0xf4, 0x2f, 0x81, 0x95, 0xc0, 0x50, 0x72,
+ 0x88, 0x3d, 0x18, 0x7b, 0x20, 0xf4, 0x48, 0x72,
+ 0xe0, 0xe6, 0x20, 0xf4, 0xa, 0xe4, 0x32, 0xf6,
/* U+007B "{" */
- 0x0, 0x77, 0xa0, 0x31, 0x2c, 0x8, 0x39, 0x86,
- 0x18, 0x1f, 0xfc, 0xe9, 0x46, 0x0, 0x80, 0x20,
- 0x1a, 0xa, 0x4, 0x41, 0x3, 0xff, 0x9e, 0xc3,
- 0x2, 0x20, 0xe6, 0x3, 0x12, 0xc0,
+ 0xb, 0xd0, 0x30, 0x61, 0xb4, 0x44, 0x3f, 0xf9,
+ 0xd4, 0x30, 0x20, 0x41, 0xc4, 0x1f, 0xfd, 0x54,
+ 0x43, 0xda, 0xc, 0x18,
/* U+007C "|" */
- 0xfc, 0x7, 0xff, 0x60,
+ 0xf0, 0x7f, 0xf6, 0x0,
/* U+007D "}" */
- 0xbf, 0x10, 0x18, 0x96, 0x0, 0xf1, 0x4, 0x9,
- 0x86, 0x7, 0xff, 0x24, 0x81, 0xd8, 0x58, 0x1,
- 0x80, 0x40, 0x28, 0x98, 0xc, 0x40, 0x88, 0x1f,
- 0xfc, 0xb6, 0x18, 0x78, 0x82, 0x31, 0x2c, 0x0,
+ 0xbc, 0x16, 0xc, 0xe, 0x1e, 0x44, 0x3f, 0xf9,
+ 0xf9, 0x40, 0x20, 0x41, 0x16, 0x1f, 0xfd, 0x44,
+ 0x47, 0xd, 0x83, 0x0,
/* U+007E "~" */
- 0x13, 0xf3, 0x2, 0xcd, 0xc9, 0x25, 0x2c, 0xac,
- 0xed, 0x96, 0x8c, 0xc8, 0x0, 0xbe, 0xc8, 0x0,
+ 0x2f, 0x21, 0x6b, 0xd4, 0x11, 0xda, 0x9e, 0x4a,
+ 0x1, 0xfa, 0x0,
/* U+00B0 "°" */
- 0x0, 0xf7, 0xa0, 0x4e, 0x46, 0x18, 0x4, 0xa8,
- 0xd2, 0x80, 0x20, 0x24, 0x40, 0x10, 0x26, 0x43,
- 0xe4, 0x42, 0x84, 0x5b, 0xac, 0x5, 0x3f, 0x62,
+ 0x3, 0xe8, 0x26, 0x99, 0x82, 0x89, 0x8, 0x10,
+ 0x90, 0xf9, 0x3, 0x82, 0x12, 0x7c, 0xe1, 0x5f,
0x0,
/* U+2022 "•" */
- 0x12, 0x98, 0xd7, 0x3, 0x52, 0x20,
+ 0x28, 0x4a, 0xc3, 0x40, 0x80,
/* U+E004 "" */
- 0x3, 0x9e, 0xf4, 0x81, 0xf9, 0xc2, 0x16, 0x3,
- 0xf5, 0x3, 0x98, 0x1f, 0x10, 0x3b, 0x81, 0xf1,
- 0x3, 0xb8, 0x1f, 0x70, 0x31, 0x60, 0x7c, 0x73,
- 0x53, 0x1, 0xfc, 0x65, 0x60, 0x7e, 0x57, 0x7f,
- 0x68, 0x40, 0x97, 0xa8, 0x81, 0x17, 0xa8, 0xa,
- 0x7, 0xf9, 0x54, 0x7, 0xff, 0x1, 0x1, 0xff,
- 0xc2,
+ 0xe, 0x7d, 0x7, 0xf3, 0x1, 0xc3, 0xf4, 0x1c,
+ 0x87, 0xff, 0x7, 0xf, 0xfe, 0xe, 0x1f, 0x61,
+ 0xc8, 0x7e, 0xd5, 0x61, 0xfe, 0xa2, 0x1f, 0x9b,
+ 0xfa, 0xc, 0xf2, 0x1c, 0xf0, 0x20, 0xff, 0x32,
+ 0x1f, 0xfc, 0x4, 0x3f, 0xf8, 0x40,
/* U+E011 "" */
- 0xdf, 0xff, 0xf0, 0xd9, 0x3, 0xff, 0x87, 0x80,
- 0xff, 0xe2, 0x1c, 0xc0, 0xff, 0xe0, 0xd8, 0x68,
- 0x1f, 0xfc, 0x2, 0x80, 0x1f, 0xf9, 0x8d, 0xfe,
- 0xc0, 0x7f, 0xf3, 0x5b, 0xc, 0x40, 0xff, 0xe0,
- 0x43, 0x4, 0x3, 0xff, 0x82, 0xd0, 0x60, 0x7f,
- 0xf0, 0x12, 0x61, 0x40, 0xff, 0xe0, 0x58, 0xeb,
- 0x3, 0xc0,
+ 0xff, 0xfe, 0x22, 0x1f, 0xfc, 0x4c, 0x3f, 0xf8,
+ 0xba, 0x1f, 0xfc, 0x1a, 0x10, 0x7f, 0xf0, 0x50,
+ 0xbf, 0x93, 0xfc, 0x1f, 0xfc, 0xd5, 0x18, 0x7f,
+ 0xf0, 0x62, 0x20, 0xff, 0xe0, 0xa8, 0x43, 0xff,
+ 0x80, 0xac, 0x83, 0xff, 0x81, 0x46, 0x43, 0xc0,
/* U+E01B "" */
- 0x3, 0x20, 0x38, 0x90, 0x1e, 0x5e, 0xf2, 0x1,
- 0xec, 0x60, 0x75, 0x2, 0xe0, 0x30, 0x8, 0x40,
- 0x90, 0x18, 0xa0, 0x39, 0x1, 0x26, 0x48, 0x4,
- 0x68, 0x9, 0x1, 0xa6, 0xc8, 0xc, 0x2, 0xa4,
- 0xf, 0x2c, 0x4, 0x6f, 0x40, 0x71, 0xd5, 0x1,
- 0x34, 0x7, 0xd8, 0x80, 0x64, 0x2d, 0x60, 0x19,
- 0x1, 0x19, 0xc0, 0x14, 0xd8, 0x9, 0x1, 0xc4,
- 0x80, 0xc4, 0xd, 0x40, 0x20, 0x1c, 0x80, 0x88,
- 0xc, 0xb5, 0x80, 0xe, 0xb9, 0x81, 0xe2, 0x80,
- 0xe4, 0x40, 0xcb, 0xf9, 0x81, 0x6e, 0x1f, 0xf2,
- 0x80, 0x88, 0x0, 0x93, 0x10, 0x12, 0x2, 0xc4,
- 0xa, 0x8a, 0x0, 0xec, 0x40, 0x21, 0x2, 0x64,
- 0x80, 0xfc, 0xc0, 0x90, 0xa0, 0x7f, 0x72, 0x3,
- 0x84, 0x4, 0x7f, 0x26, 0x43, 0x21, 0xa2, 0x2,
- 0x93, 0x0,
+ 0xc, 0x87, 0xff, 0x5, 0xec, 0x27, 0xc8, 0x74,
+ 0x16, 0xc, 0x10, 0x64, 0x39, 0xe, 0x42, 0x50,
+ 0x69, 0x41, 0x21, 0xaf, 0x40, 0x82, 0x83, 0xe7,
+ 0xd, 0x68, 0x7b, 0x90, 0x94, 0x1f, 0x61, 0x20,
+ 0x7a, 0x6, 0x43, 0x58, 0x4b, 0x4, 0x87, 0xff,
+ 0x12, 0x2, 0xc, 0x29, 0xc, 0xf4, 0xb, 0xb4,
+ 0x3e, 0x43, 0x90, 0xe7, 0xe4, 0x2f, 0xf, 0xcc,
+ 0x14, 0x19, 0x20, 0xf6, 0x1a, 0x20, 0xbc, 0x82,
+ 0xc, 0x87, 0xf9, 0x9, 0x20, 0xfe, 0xc2, 0xc4,
+ 0x37, 0x94, 0x4, 0xa, 0xa, 0xc,
/* U+E026 "" */
- 0x3, 0xf9, 0x20, 0x1f, 0xfc, 0x69, 0x0, 0x7f,
- 0xf1, 0x59, 0x26, 0x7, 0xff, 0x12, 0x0, 0x80,
- 0x7f, 0xf0, 0xe0, 0x1a, 0x1, 0xff, 0xc1, 0x2c,
- 0x12, 0xc, 0x81, 0xff, 0xc0, 0x80, 0x3f, 0x0,
- 0x80, 0x7f, 0xc9, 0x0, 0xf2, 0x40, 0x3f, 0xd0,
- 0xf, 0xd0, 0xf, 0xe6, 0x40, 0xfc, 0x58, 0x1f,
- 0xa0, 0x1b, 0x60, 0x1a, 0x1, 0xf4, 0x3, 0x92,
- 0x1, 0xd0, 0xe, 0x2c, 0xe, 0x90, 0x7, 0x32,
- 0x6, 0x80, 0x7a, 0xd0, 0x1e, 0xe0, 0x49, 0x0,
- 0xf3, 0x60, 0x3c, 0x50, 0x8, 0x7, 0xff, 0x12,
- 0x0,
+ 0xf, 0xe5, 0x7, 0xff, 0x1a, 0x81, 0xff, 0xc5,
+ 0x40, 0x87, 0xff, 0x12, 0x4, 0x1f, 0xfc, 0x38,
+ 0x34, 0x1f, 0xfc, 0x24, 0x32, 0x1f, 0xfc, 0x18,
+ 0x1e, 0x4, 0x1f, 0xf2, 0x83, 0xca, 0xf, 0xf4,
+ 0x1f, 0xa0, 0xfe, 0x43, 0xfc, 0x87, 0xe8, 0x37,
+ 0x83, 0x41, 0xf4, 0x1c, 0xa0, 0xe8, 0x3c, 0x87,
+ 0x50, 0x39, 0xe, 0x83, 0xd4, 0xf, 0x61, 0x28,
+ 0x3c, 0xa0, 0xf9, 0x4, 0x1f, 0xfc, 0x48,
/* U+E045 "" */
- 0x3, 0xe2, 0x7, 0xff, 0x2, 0xe0, 0x3f, 0xfe,
- 0x6c, 0x81, 0xfc, 0xc1, 0x98, 0x81, 0xf5, 0x90,
- 0x68, 0xc4, 0xe, 0xa9, 0x20, 0x54, 0x62, 0x5,
- 0x52, 0x50, 0x25, 0x46, 0x62, 0xa4, 0xa0, 0x72,
- 0xa0, 0x84, 0x94, 0xf, 0x95, 0x0, 0xa8, 0x1f,
- 0xca, 0xaa, 0x7, 0xfc, 0xa8, 0x1e,
+ 0xf, 0xfe, 0x45, 0x87, 0xff, 0xcd, 0xf, 0xf2,
+ 0xb, 0xf, 0xd5, 0x11, 0x87, 0xa5, 0x43, 0x18,
+ 0x69, 0x50, 0x4c, 0x69, 0x2a, 0xe, 0x60, 0x95,
+ 0x7, 0xcc, 0x6, 0xf, 0xe6, 0x60, 0xff, 0x98,
+ 0x3c,
/* U+E04D "" */
- 0x3, 0xff, 0x91, 0xb0, 0xf, 0xfb, 0x14, 0x7,
- 0xfb, 0x17, 0x0, 0xfe, 0xc5, 0xc0, 0x3f, 0xb1,
- 0x70, 0xf, 0xec, 0x41, 0xb7, 0xf3, 0x24, 0x1,
- 0x2f, 0xec, 0x70, 0xd, 0xff, 0xea, 0xe, 0x18,
- 0x81, 0xfe, 0x38, 0x62, 0x7, 0xf8, 0xe1, 0x88,
- 0x1f, 0xe3, 0x86, 0x3, 0xfe, 0x3a, 0x81, 0xe0,
+ 0xf, 0xfe, 0x47, 0x83, 0xfe, 0xc4, 0x3f, 0xd8,
+ 0xc1, 0xfd, 0x8c, 0x1f, 0xd8, 0xc1, 0xfd, 0x85,
+ 0x5f, 0x90, 0xcb, 0xfd, 0x98, 0x3f, 0xfa, 0x6,
+ 0x61, 0xff, 0xc0, 0xcc, 0x3f, 0xf8, 0x19, 0x87,
+ 0xff, 0x3, 0x30, 0xff, 0xe0, 0x70, 0x78,
/* U+E054 "" */
- 0x3, 0xff, 0x91, 0xf0, 0x1f, 0xfc, 0x6, 0x70,
- 0x1f, 0xf4, 0x67, 0x1, 0xff, 0x46, 0x70, 0x1f,
- 0xf4, 0x67, 0x0, 0x76, 0xfe, 0x20, 0xe1, 0x92,
- 0xfe, 0x0, 0x4a, 0xff, 0xfb, 0x0, 0xc4, 0xf,
- 0xc7, 0xc, 0x40, 0xfc, 0x70, 0xc4, 0xf, 0xc7,
- 0xc, 0x40, 0xfe, 0xc3, 0x10, 0x3f, 0xd7, 0x10,
- 0x38,
+ 0xf, 0xfe, 0x47, 0x83, 0xff, 0x80, 0x98, 0x7f,
+ 0xd2, 0x61, 0xff, 0x49, 0x87, 0xfd, 0x26, 0x6,
+ 0xbf, 0x5, 0x9a, 0xff, 0x6, 0xbf, 0xf8, 0x18,
+ 0x7f, 0xb3, 0xf, 0xf6, 0x61, 0xfe, 0xcc, 0x3f,
+ 0xd9, 0x87, 0xfd, 0x61, 0xe0,
/* U+E05D "" */
- 0x3, 0xff, 0x90, 0xa8, 0x1f, 0xf2, 0xaa, 0x81,
- 0xfc, 0xa8, 0x5, 0x40, 0xf9, 0x50, 0x42, 0x4a,
- 0x7, 0x2a, 0x33, 0x15, 0x25, 0x2, 0x54, 0x62,
- 0x5, 0x52, 0x50, 0x68, 0xc4, 0xe, 0xa9, 0x21,
- 0x98, 0x81, 0xf5, 0x90, 0x19, 0x3, 0xf9, 0x81,
- 0xff, 0xf3, 0xb8, 0xf, 0x0,
+ 0xf, 0xfe, 0x43, 0x7, 0xfc, 0xcc, 0x1f, 0xcc,
+ 0x6, 0xf, 0x98, 0x25, 0x41, 0xcc, 0x69, 0x2a,
+ 0x9, 0x8c, 0x34, 0xa8, 0x11, 0x87, 0xa5, 0x45,
+ 0x87, 0xea, 0x84, 0x3f, 0xc8, 0x7f, 0xfc, 0xec,
+ 0x3c,
/* U+E08E "" */
- 0x0, 0x6d, 0xc4, 0xc, 0xd2, 0xcc, 0x5, 0xf4,
- 0xd, 0x7d, 0x40, 0x9f, 0x4, 0xe, 0xde, 0x20,
- 0x7f, 0xff, 0xc0, 0xff, 0xe7, 0x9d, 0xbc, 0x42,
- 0x4, 0xf8, 0x20,
+ 0xa, 0xb0, 0x72, 0xf8, 0x17, 0x6, 0xb9, 0xf,
+ 0xc8, 0x3f, 0xc1, 0xff, 0xff, 0xf, 0xfe, 0x8f,
+ 0xf8, 0x8, 0x7e, 0x40,
/* U+E09A "" */
- 0x3, 0xcf, 0x30, 0x3f, 0xf8, 0x10, 0xc0, 0x3f,
- 0xcb, 0x1, 0x64, 0x7, 0xce, 0x90, 0x23, 0x58,
- 0x1c, 0xa0, 0x1f, 0x44, 0x6, 0xa0, 0x7f, 0x50,
- 0x22, 0x7, 0xfc, 0x40, 0x30, 0x3f, 0xe6, 0x7,
- 0xff, 0xf8, 0x83, 0x40, 0xff, 0xa1, 0xc0, 0x7f,
- 0xf0, 0x76, 0xff, 0xe2, 0x13, 0xed, 0xa2, 0x7c,
- 0x7, 0xa1, 0x80, 0x78,
-
- /* U+E0AC "" */
- 0xdf, 0xff, 0xf0, 0xd9, 0x3, 0xff, 0x87, 0x80,
- 0xff, 0xe2, 0x1c, 0xc0, 0xff, 0xe0, 0xd8, 0x70,
- 0x1f, 0xfc, 0x14, 0x7, 0xff, 0xe9, 0x81, 0xff,
- 0xc0, 0x20, 0x47, 0xfe, 0x63, 0x7f, 0xb0, 0x1f,
- 0xfc, 0xd6, 0xc3, 0x1, 0xff, 0xc1, 0x81, 0x8a,
- 0x7, 0xfc, 0x43, 0x81, 0x81, 0xff, 0x12, 0x7c,
- 0x20, 0x3f, 0xf8, 0x1c, 0x85, 0x0, 0xf0,
-
- /* U+E0AF "" */
- 0x3, 0x9a, 0x3, 0xfb, 0x54, 0x7, 0xfa, 0xa0,
- 0x7, 0x90, 0x3a, 0xa0, 0x2c, 0x40, 0xb0, 0xa8,
- 0xe1, 0x90, 0x2, 0x43, 0x3, 0x85, 0x63, 0x17,
- 0x0, 0x1c, 0x8, 0x2e, 0x1, 0x8d, 0x0, 0xe0,
- 0x1e, 0x80, 0x19, 0x3, 0xb1, 0x2, 0xc4, 0xb,
- 0x16, 0x86, 0x18, 0x8c, 0x5c, 0x0, 0x50, 0x88,
- 0xb8, 0x5, 0x52, 0x55, 0x60, 0x19, 0x25, 0x0,
- 0x80, 0xe5, 0x40, 0xfc, 0xa8, 0x10,
-
- /* U+E0ED "" */
- 0x2, 0xb0, 0xf, 0x46, 0x7, 0x24, 0x3, 0xcb,
- 0x80, 0x5f, 0x81, 0xff, 0xc5, 0xf7, 0x0, 0xff,
- 0xe0, 0xc0, 0x3f, 0xfa, 0x9b, 0x7f, 0xc4, 0x8,
- 0x9f, 0xf8, 0xf, 0xfe, 0x69, 0x38, 0xf, 0xf1,
- 0xdb, 0x1, 0xff, 0xeb, 0x3f, 0xe0, 0x3b, 0x6f,
- 0xf8, 0x88, 0x9, 0xff, 0x84,
-
- /* U+E10B "" */
- 0x2, 0x27, 0xf8, 0xe, 0xfb, 0x7f, 0x72, 0x1,
- 0x8f, 0xff, 0x8c, 0x1, 0x50, 0x1f, 0xd5, 0x2,
- 0x5c, 0xf, 0xe4, 0x1d, 0x1e, 0xdf, 0xe8, 0x32,
- 0x9, 0x7f, 0xc1, 0x0, 0x98, 0xf, 0xae, 0x3,
- 0x32, 0x80, 0xf2, 0x20, 0x64, 0x10, 0x1e, 0x44,
- 0xd, 0x78, 0x1f, 0x5c, 0x7, 0xff, 0x22, 0x4f,
- 0xe2, 0x2, 0xa8, 0xdf, 0xf4, 0x50,
-
- /* U+E11C "" */
- 0x3b, 0xff, 0xe7, 0x48, 0x1f, 0xd0, 0x81, 0xff,
- 0xc1, 0xb7, 0xf1, 0x2, 0x4b, 0xf3, 0x3, 0xff,
- 0xfe, 0x7, 0xff, 0x91, 0x2f, 0xcc, 0xa, 0xdf,
- 0xc4, 0x10, 0x3f, 0xea, 0x40, 0xfe, 0x80,
-
- /* U+E12C "" */
- 0x3, 0xff, 0x82, 0x60, 0x1f, 0xfc, 0x13, 0x99,
- 0x3, 0xfe, 0x38, 0x52, 0x7, 0xf8, 0xe1, 0x50,
- 0x1f, 0xe3, 0x85, 0x40, 0x62, 0x7, 0x1c, 0x2a,
- 0x3, 0x5c, 0x40, 0x8e, 0x15, 0x1, 0xdc, 0x62,
- 0xe, 0x15, 0x1, 0xe5, 0x46, 0x58, 0x54, 0x7,
- 0xe5, 0x45, 0x15, 0x1, 0xfe, 0x54, 0x54, 0x7,
- 0xff, 0x1, 0x74, 0x7, 0xf0,
-
- /* U+E140 "" */
- 0x3, 0xfd, 0x79, 0x3, 0x1f, 0x78, 0xc4, 0x1,
- 0xc3, 0xaa, 0x31, 0x2c, 0x2a, 0xa, 0x8d, 0x82,
- 0xa0, 0x25, 0x40, 0x54, 0x7, 0x2b, 0x48, 0x8,
-
- /* U+E141 "" */
- 0x3, 0x88, 0x1c, 0xb4, 0x2, 0x54, 0x50, 0xa,
- 0x8c, 0x42, 0xa3, 0x10, 0x14, 0x52, 0x5, 0x45,
- 0x20, 0x4a, 0x8c, 0x40, 0x95, 0x18, 0x81, 0x2a,
- 0x28, 0x19, 0x68,
-
- /* U+E142 "" */
- 0x4, 0xe, 0x99, 0x1, 0xa8, 0xa8, 0x8, 0xe1,
- 0x50, 0x11, 0xc2, 0xa0, 0x23, 0x45, 0x2, 0x34,
- 0x50, 0x7, 0xa, 0x81, 0xc2, 0xa0, 0x14, 0x54,
- 0x5, 0x32, 0x3, 0x0,
-
- /* U+E143 "" */
- 0x3, 0x24, 0x3, 0xe5, 0x69, 0x1, 0xca, 0x80,
- 0xa8, 0x9, 0x51, 0xb0, 0x54, 0x15, 0x18, 0x96,
- 0x15, 0x71, 0x88, 0x3, 0x87, 0xbc, 0x81, 0x8f,
- 0xa0,
-
- /* U+E150 "" */
- 0x3, 0x9d, 0xfe, 0xcc, 0xf, 0xe5, 0xe2, 0x29,
- 0xc, 0xf0, 0xf, 0x3a, 0x27, 0xd6, 0xbd, 0x2e,
- 0x81, 0x94, 0x3d, 0x81, 0xcb, 0x35, 0x40, 0xa8,
- 0xc0, 0x6a, 0x6, 0x89, 0x41, 0x8a, 0x6, 0x28,
- 0xe, 0xa3, 0x8c, 0x10, 0x1f, 0xfc, 0x4, 0x81,
- 0x10, 0x3f, 0xf8, 0x38, 0x10, 0xc0, 0xff, 0xe0,
- 0x90, 0xc3, 0x3, 0x8a, 0xec, 0xc, 0x43, 0x24,
- 0x7, 0xad, 0xbb, 0x1, 0x81, 0xa1, 0x81, 0xe5,
- 0xa7, 0x5, 0x20, 0x62, 0x10, 0x3e, 0x70, 0x71,
- 0xc0, 0x51, 0x88, 0x1f, 0xa9, 0x48, 0x1, 0x41,
- 0xa1, 0x3, 0x3e, 0x92, 0x81, 0x9d, 0xf, 0x7f,
- 0xa0, 0x74, 0xf, 0x2f, 0x10, 0x11, 0x9e, 0x1,
- 0x80,
-
- /* U+E156 "" */
- 0x3, 0xff, 0x80, 0xf9, 0x3, 0xc7, 0xb4, 0x31,
- 0x3, 0x1c, 0x11, 0xc3, 0x10, 0x7, 0xc, 0x41,
- 0xc3, 0x12, 0xc3, 0x10, 0x23, 0x86, 0xc1, 0x88,
- 0x1c, 0x60, 0x8, 0x40, 0xf1, 0x80, 0x21, 0x3,
- 0x8e, 0x1b, 0x6, 0x20, 0x47, 0xc, 0x4b, 0xc,
- 0x41, 0xc3, 0x10, 0x7, 0xc, 0x50, 0xc4, 0xc,
- 0x70, 0x4f, 0x90, 0x3c, 0x7b,
-
- /* U+E176 "" */
- 0xb, 0xff, 0xfe, 0xe, 0x20, 0x7f, 0xf0, 0x89,
- 0x50, 0x3f, 0xf8, 0x37, 0x2, 0x7, 0xff, 0x4a,
- 0xf0, 0x40, 0xff, 0xe0, 0x94, 0xe0, 0x1f, 0xfc,
- 0x19, 0x60, 0x1f, 0xfd, 0x86, 0x7, 0xfc, 0x80,
- 0xc5, 0x81, 0xfc, 0xc0, 0xf4, 0x82, 0x7e, 0x90,
- 0x7, 0xcf, 0x6f, 0x98, 0x1d, 0xb7, 0xff, 0xc,
- 0x1, 0x3f, 0xfc, 0x30, 0x0,
-
- /* U+E1D9 "" */
- 0x0, 0x40, 0x7d, 0x10, 0x6, 0x80, 0x31, 0xfa,
- 0x0, 0x20, 0x3e, 0x88, 0x3, 0x40, 0x18, 0xfd,
- 0x0, 0x10, 0x1f, 0x44, 0x1, 0xa0, 0xc, 0x7e,
- 0x80,
-
- /* U+E1FA "" */
- 0x3, 0x1f, 0xfc, 0xc0, 0xff, 0xe0, 0x12, 0x0,
- 0x48, 0xf, 0xfe, 0x1, 0xd8, 0x86, 0xc6, 0x7,
- 0xfd, 0x7f, 0x21, 0xff, 0x0, 0x24, 0x12, 0x8,
- 0x80, 0xff, 0xb6, 0x3b, 0x2, 0x3, 0xff, 0xa3,
- 0x68, 0xc, 0x71, 0x3, 0xfc, 0x90, 0xf, 0xfe,
- 0x59, 0xc4, 0xf, 0xf2, 0x40, 0x3f, 0xf8, 0xb6,
- 0x80, 0xac, 0x12, 0xd0, 0x1f, 0xfc, 0x14, 0x81,
- 0x2b, 0x1, 0xfd, 0xb1, 0x80,
-
- /* U+E210 "" */
- 0x3, 0xe7, 0xfb, 0x20, 0x3f, 0xe5, 0x0, 0x1a,
- 0x7, 0xfd, 0x80, 0xff, 0xe4, 0xb0, 0x3e, 0x20,
- 0x5c, 0xa, 0xc0, 0x3d, 0xb3, 0x80, 0x60, 0x12,
- 0x1, 0xe4, 0x40, 0x60, 0x32, 0x77, 0xfa, 0x82,
- 0x4, 0x7e, 0x8, 0x44, 0x4, 0xa8, 0x1e, 0x22,
- 0xb0, 0x3c, 0x90, 0xf, 0xab, 0x4, 0xe, 0x34,
- 0x8, 0xc4, 0x82, 0x6a, 0x4, 0x42, 0xfe, 0xcf,
- 0x80, 0xe1, 0x40, 0x10, 0xf, 0xa0, 0x6, 0x1,
- 0xfe, 0x40, 0x71, 0xe4, 0xf, 0xfe, 0x14, 0x3,
- 0xff, 0x88, 0x40, 0xc8, 0xf, 0xfa, 0x30, 0xa,
- 0x81, 0xe0,
-
- /* U+E238 "" */
- 0x3, 0xd1, 0x81, 0xfe, 0xcd, 0x1, 0xfd, 0x48,
- 0x60, 0x7e, 0x48, 0x3, 0x1, 0xfb, 0x1, 0x32,
- 0x7, 0x30, 0x80, 0xd9, 0x1, 0x1a, 0x7, 0xd5,
- 0x80, 0xa4, 0x30, 0x10, 0xa, 0x10, 0x43, 0xc0,
- 0xe, 0x2, 0xa1, 0x89, 0x0, 0x9, 0x50, 0x8,
- 0x30, 0x38, 0x86, 0x6, 0xe0, 0x66, 0x85, 0x0,
- 0x82, 0x20, 0x65, 0x18, 0x8, 0x3, 0x10, 0xe,
- 0xb0, 0x14, 0xd, 0xa1, 0x0, 0x5e, 0x40, 0x73,
- 0xdf, 0xb4, 0x20, 0x40,
-
- /* U+E28F "" */
- 0x3b, 0xff, 0xec, 0x29, 0x4b, 0xf8, 0xb2, 0x2d,
- 0xfd, 0x0, 0xed, 0x0, 0xff, 0x89, 0x1, 0xfe,
- 0x3a, 0x13, 0xcc, 0xd, 0xb7, 0xea, 0x6, 0x4b,
- 0xf8, 0xd, 0x4f, 0xb7, 0xa0, 0x1c, 0xf8, 0x1f,
- 0xfc, 0xcf, 0x40, 0xff, 0xeb, 0x11, 0xb7, 0xee,
- 0x2, 0x93, 0xff, 0x33, 0x8a, 0xff, 0x8a, 0xc0,
-
- /* U+E2DA "" */
- 0x3, 0xe3, 0x37, 0xec, 0xc0, 0xff, 0xae, 0x64,
- 0x1, 0x9d, 0x1, 0xfb, 0x23, 0x7f, 0xd0, 0x56,
- 0x7, 0xa9, 0x59, 0x1, 0x9f, 0x30, 0x81, 0x8a,
- 0x34, 0xb, 0x81, 0xb8, 0xe0, 0x6a, 0x20, 0x1f,
- 0xc5, 0x12, 0x2, 0x41, 0x1, 0xfe, 0xe1, 0x89,
- 0x48, 0xb4, 0x6, 0x40, 0x66, 0x8, 0xa8, 0x2,
- 0xe0, 0x52, 0xd1, 0x0, 0xc1, 0x7, 0x0, 0xa8,
- 0x9, 0xf1, 0x80, 0x70, 0xc0, 0x1d, 0x50, 0x1e,
- 0xbc, 0x14, 0x48, 0x8, 0xa0, 0x80, 0xf8, 0xe1,
- 0xc0, 0xf1, 0xb9, 0x1, 0x9e, 0x10, 0x81, 0xe3,
- 0xd, 0xff, 0x41, 0x58, 0x1f, 0x9e, 0x64, 0x1,
- 0x7d, 0x1, 0x0,
-
- /* U+E2DC "" */
- 0x3, 0xf4, 0x80, 0x3f, 0xf8, 0x75, 0xb5, 0x3,
- 0xff, 0x83, 0x90, 0x5, 0x80, 0xff, 0x1c, 0x40,
- 0xc7, 0x1, 0xf8, 0xe2, 0x7, 0x8f, 0x20, 0x72,
- 0xc0, 0x7f, 0xb2, 0x2, 0x74, 0xf, 0xfe, 0x5,
- 0x60, 0x50, 0xf, 0xfe, 0x4, 0x2, 0x6c, 0x7,
- 0xff, 0x1, 0xb0, 0x1f, 0xae, 0xca, 0x7, 0xff,
- 0x9, 0x92, 0x60, 0x7f, 0xfd, 0x36, 0xc4, 0x1,
- 0xdb, 0x1, 0x0,
-
- /* U+E2E3 "" */
- 0x6c, 0x7, 0xff, 0x16, 0x50, 0x3f, 0xf9, 0x6,
- 0xe6, 0x16, 0xdf, 0x52, 0x6, 0xc8, 0xc6, 0x9,
- 0xf9, 0x62, 0x1, 0x1, 0xa8, 0x1f, 0xe8, 0x1,
- 0x81, 0x90, 0x1f, 0xe6, 0x0, 0xc0, 0x6, 0x1,
- 0xff, 0xc2, 0x7f, 0xb0, 0x1f, 0xfc, 0x13, 0xff,
- 0xa8, 0x1f, 0xfd, 0x39, 0x3f, 0xf8, 0x60, 0x45,
- 0xbf, 0xfe, 0x18, 0x1f, 0xfc, 0x90,
-
- /* U+E30B "" */
- 0x2, 0x9f, 0xb3, 0x3, 0xfe, 0x3d, 0x80, 0x32,
- 0x81, 0xfe, 0xe0, 0x18, 0x12, 0x60, 0x7e, 0x24,
- 0x34, 0xc0, 0x50, 0xf, 0xc8, 0x1, 0x4, 0xf,
- 0xfe, 0x1c, 0x10, 0xf, 0xfe, 0x1, 0x0, 0xfb,
- 0x3, 0xff, 0x80, 0x80, 0xfe, 0xc0, 0x7e, 0xa0,
- 0x7e, 0x38, 0xf, 0x96, 0x20, 0x7c, 0x79, 0x3,
- 0xc7, 0x7f, 0x10, 0x3b, 0x10, 0x3f, 0xd9, 0x12,
- 0x2, 0xc4, 0xf, 0xf5, 0xd8, 0x80, 0xb1, 0x3,
- 0xff, 0x8b, 0x80, 0xff, 0xe0, 0x4b, 0x0, 0x88,
- 0x1f, 0xf1, 0x48, 0x7, 0xff, 0x18, 0x9c,
-
- /* U+E322 "" */
- 0x1, 0x7f, 0xff, 0xe1, 0x50, 0x24, 0x80, 0x9f,
- 0xfe, 0x0, 0x48, 0x6, 0xbb, 0x7f, 0xf0, 0x28,
- 0x1f, 0xff, 0xf0, 0x3f, 0xfc, 0xfe, 0x4f, 0xfe,
- 0x7, 0x3, 0x22, 0x9b, 0xff, 0xe0, 0x22, 0x86,
- 0xc0, 0x3f, 0xf8, 0x9b, 0x9, 0x80, 0xff, 0xe1,
- 0x13, 0x0,
-
- /* U+E32A "" */
- 0x3, 0xff, 0x88, 0x88, 0x1f, 0xfc, 0x2, 0xe6,
- 0xa4, 0xf, 0x27, 0x77, 0xed, 0x19, 0x40, 0x74,
- 0xf6, 0x22, 0x7, 0xb0, 0x11, 0xec, 0xc, 0x5a,
- 0x20, 0x4c, 0xb, 0x1, 0x95, 0x4d, 0x10, 0xc,
- 0xa, 0x81, 0xaf, 0xac, 0xe, 0xa0, 0x48, 0x1,
- 0xe2, 0x81, 0xe4, 0x40, 0x20, 0x2c, 0xa8, 0x1f,
- 0x40, 0x26, 0x2, 0x8a, 0x7, 0xd0, 0x81, 0x13,
- 0x2a, 0x7, 0xc9, 0x81, 0xde, 0x14, 0x7, 0x8d,
- 0x3, 0xc5, 0x40, 0x3c, 0xf0, 0x1f, 0xc8, 0xc,
- 0xb4, 0x3, 0xfa, 0xb, 0xbf, 0x52, 0x7, 0xfb,
- 0x24, 0x20, 0x7f, 0xf0, 0x0,
-
- /* U+E335 "" */
- 0x2, 0x57, 0xf6, 0x60, 0x75, 0xa4, 0x0, 0xcc,
- 0x40, 0x44, 0x7, 0x8f, 0x5, 0x81, 0xf8, 0xb4,
- 0x7, 0xfa, 0xf0, 0x3f, 0xc4, 0xf, 0xfe, 0x6,
- 0x3, 0xfc, 0x90, 0xf, 0xf7, 0x14, 0xf, 0xc9,
- 0x2, 0xa0, 0x79, 0x50, 0x26, 0x7, 0xb0, 0x18,
- 0x81, 0xff, 0xc0, 0xd6, 0xf3, 0x3, 0x8a, 0x5c,
- 0x7, 0x96, 0xda, 0x1, 0xe6, 0x4e, 0xe0, 0x40,
-
- /* U+E33E "" */
- 0x3, 0x1b, 0xa9, 0x3, 0xe7, 0x91, 0x59, 0x1,
- 0xe8, 0x2f, 0xa2, 0x81, 0xcc, 0x44, 0x14, 0xc,
- 0xf, 0x20, 0x24, 0x7, 0xb8, 0x1f, 0x70, 0xf,
- 0xb1, 0xbf, 0xb0, 0x7d, 0xc0, 0x3f, 0xe8, 0x7,
- 0xff, 0x4d, 0x64, 0x7, 0xfa, 0x9a, 0x7, 0xff,
- 0x2e, 0x9a, 0x7, 0xf9, 0x64, 0x7, 0xff, 0x4e,
- 0x1, 0xff, 0x40,
-
- /* U+E374 "" */
- 0x76, 0xff, 0xd9, 0x2f, 0xf8,
-
- /* U+E3E4 "" */
- 0xb6, 0x20, 0xd, 0xb2, 0x53, 0x0, 0xd2, 0x80,
- 0xff, 0xff, 0x81, 0xff, 0xcd,
-
- /* U+E40A "" */
- 0x3, 0xfc, 0xa8, 0x1f, 0xcb, 0xb0, 0x3f, 0xa6,
- 0x20, 0x7e, 0x3a, 0x1, 0xfc, 0xf1, 0x3, 0xf1,
- 0xcc, 0xf, 0xd1, 0x81, 0xe5, 0x98, 0x1e, 0xb4,
- 0x40, 0xe5, 0xd0, 0x1c, 0x6d, 0x1, 0xe5, 0x90,
- 0x1f, 0x0,
-
- /* U+E415 "" */
- 0x3, 0x9d, 0x3, 0xfd, 0x90, 0x1f, 0xfd, 0xd7,
- 0x6e, 0x62, 0xde, 0xc9, 0x62, 0x12, 0xeb, 0xfe,
- 0x43, 0xfe, 0x3, 0xff, 0xc8,
-
- /* U+E425 "" */
- 0x3, 0xde, 0x81, 0xff, 0xca, 0x70, 0xf, 0x54,
- 0x4, 0xe2, 0x3, 0x8a, 0xa4, 0x4, 0x18, 0xe,
- 0x38, 0x61, 0x4, 0x3, 0xe2, 0xc2, 0x21, 0x81,
- 0xfb, 0xc, 0xc0, 0xff, 0x30, 0x58, 0x20, 0x56,
- 0x1, 0x30, 0x70, 0xa0, 0x48, 0x81, 0x71, 0x98,
- 0x68, 0xf, 0x34, 0x50, 0xa2, 0xb0, 0x34, 0x81,
- 0xc0, 0x2a, 0x27, 0xf9, 0x8c, 0x40, 0x97, 0x64,
- 0x1, 0x9c, 0x80,
-
- /* U+E438 "" */
- 0x3, 0xff, 0x91, 0x98, 0x17, 0x60, 0x56, 0x80,
- 0xd0, 0x90, 0xa, 0x10, 0x4, 0x98, 0xc, 0xca,
- 0x0, 0x89, 0x0, 0xe1, 0x81, 0x99, 0x40, 0x19,
- 0x60, 0x20, 0x80, 0x6a, 0x38, 0xc, 0x28, 0x2,
- 0x10, 0x1a, 0x8, 0x2, 0xe, 0x1, 0x88, 0x6,
- 0x30, 0x80, 0xb4, 0x40, 0x16, 0x80, 0xd1, 0x81,
- 0x34, 0x4, 0xa0, 0x12, 0xdb, 0xff, 0x85, 0x45,
- 0x27, 0xff, 0x84, 0xa0, 0x5, 0x80, 0x72, 0x36,
- 0x0, 0xe0, 0x8, 0x2, 0x40, 0x86, 0x9, 0x2,
- 0x8, 0x1f, 0x10, 0x3c, 0x41, 0x3, 0x3e, 0x3,
- 0xa1, 0xf8, 0x7, 0x3, 0xff, 0x92, 0xbf, 0xff,
- 0xe0, 0x80, 0x58, 0xf, 0xfe, 0xa, 0xc0,
-
- /* U+E456 "" */
- 0x3, 0xff, 0xa1, 0x0, 0xff, 0xe1, 0x9c, 0x6,
- 0x76, 0xff, 0x33, 0x80, 0xb2, 0x5f, 0xc4, 0x14,
- 0x6, 0xff, 0xf2, 0x15, 0x1, 0xff, 0xc1, 0xa8,
- 0xf, 0xfe, 0xd, 0x40, 0x69, 0x40, 0xff, 0xe1,
- 0x14, 0x7, 0xff, 0x32, 0xf0, 0x3a, 0x81, 0xff,
- 0xc2, 0xa8, 0xf, 0xfe, 0xd, 0x42, 0xdf, 0xcc,
- 0xc, 0x80, 0x25, 0xf8, 0x81, 0xb0, 0xf, 0xff,
- 0xc0, 0x47, 0x1, 0xff, 0xc3, 0x38, 0xf, 0xfe,
- 0x0,
-
- /* U+E457 "" */
- 0x3, 0xff, 0xa5, 0x0, 0xc4, 0xf, 0xf8, 0xe0,
- 0x2f, 0x80, 0x4b, 0x7e, 0x67, 0x0, 0xe7, 0x8,
- 0xd2, 0xf1, 0x5, 0x3, 0x8e, 0x1b, 0xff, 0x21,
- 0x50, 0x2, 0x8e, 0x3, 0xf5, 0x40, 0x78, 0xe0,
- 0x3d, 0x50, 0x1d, 0x2d, 0x1c, 0x7, 0xff, 0x0,
- 0xa4, 0xa7, 0x1, 0xff, 0xc2, 0x54, 0xe0, 0x2b,
- 0xc0, 0xf5, 0x0, 0xa9, 0xc0, 0x7f, 0x54, 0x4,
- 0xa9, 0xc2, 0x90, 0x35, 0x42, 0xdd, 0xc9, 0x61,
- 0xc0, 0xc8, 0x2, 0x5c, 0x41, 0xc4, 0xd, 0x80,
- 0x7f, 0xf6, 0x38, 0xc, 0x70, 0x1f, 0x8e, 0x30,
- 0xc, 0x70, 0x1f, 0x8e, 0x80,
-
- /* U+E458 "" */
- 0x3, 0xff, 0xa1, 0x0, 0xff, 0xe1, 0x9c, 0x6,
- 0x76, 0xff, 0x33, 0x80, 0xb2, 0x5f, 0xc4, 0x14,
- 0x6, 0xff, 0xf2, 0x11, 0x1, 0xff, 0xc1, 0x8c,
- 0xf, 0x8d, 0xe0, 0x51, 0x81, 0xa5, 0x2, 0xc0,
- 0x62, 0x7, 0x14, 0x0, 0xa0, 0x3f, 0xf9, 0x17,
- 0x81, 0xd0, 0xf, 0xfe, 0x14, 0x60, 0x47, 0x81,
- 0xfa, 0x31, 0x6f, 0xe6, 0x6, 0x60, 0x12, 0xfc,
- 0x40, 0xd8, 0x7, 0xff, 0xe0, 0x23, 0x80, 0xff,
- 0xe1, 0x9c, 0x7, 0xff, 0x0,
-
- /* U+E493 "" */
- 0x3, 0xef, 0xf0, 0x1f, 0xfc, 0x12, 0x6, 0x20,
- 0x7e, 0x28, 0x5, 0x3, 0x50, 0x8, 0x81, 0xbd,
- 0xf9, 0x81, 0x9e, 0xf7, 0x81, 0x32, 0x0, 0x81,
- 0xe2, 0x0, 0xb0, 0x10, 0xe, 0x32, 0x8, 0x1d,
- 0x0, 0x30, 0x31, 0xcd, 0xb1, 0x3, 0x30, 0x12,
- 0x0, 0xa0, 0x1a, 0x1, 0x48, 0x2, 0x40, 0x48,
- 0xc, 0x80, 0x90, 0x19, 0x1, 0x20, 0x32, 0x2,
- 0x40, 0x52, 0x0, 0xa0, 0x1a, 0x1, 0x48, 0x0,
- 0xc0, 0xc7, 0x48, 0xc4, 0xc, 0xc0, 0x40, 0x38,
- 0xb6, 0x20, 0x74, 0x0, 0xc8, 0x2, 0x7, 0x88,
- 0x2, 0xc0, 0xbd, 0xf9, 0x81, 0x9e, 0xf7, 0x81,
- 0x8a, 0x1, 0x40, 0xd4, 0x2, 0x20, 0x7e, 0x20,
- 0x62, 0x7, 0x80,
-
- /* U+E49D "" */
- 0x3, 0xf8, 0x9f, 0x72, 0x7, 0x9e, 0xd4, 0x1,
- 0x88, 0x1c, 0xa0, 0x11, 0xc3, 0x10, 0x31, 0x80,
- 0x63, 0x86, 0x20, 0xe, 0x1a, 0x81, 0x1c, 0x10,
- 0x38, 0x62, 0xa8, 0x11, 0xec, 0xe1, 0x88, 0x1f,
- 0x8e, 0x18, 0x81, 0xf8, 0xe1, 0x88, 0x1f, 0x8e,
- 0x18, 0xbe, 0x40, 0xe3, 0x86, 0x21, 0xc, 0x55,
- 0x7, 0xc, 0x40, 0x1c, 0x35, 0x7, 0xc, 0x40,
- 0xc6, 0x1, 0xd8, 0x81, 0xca, 0x1, 0x1e, 0x40,
- 0xf3, 0xda, 0xa0,
-
- /* U+E49E "" */
- 0x3, 0xf9, 0x81, 0xff, 0xc0, 0xd4, 0x5, 0xdb,
- 0xf2, 0x4a, 0x19, 0x3f, 0x80, 0x31, 0xbf, 0xfc,
- 0x8e, 0x3, 0xfd, 0xb0, 0xf, 0xf9, 0x81, 0xff,
- 0xc0, 0x60, 0x7f, 0xf0, 0x36, 0x0, 0xdf, 0xfe,
- 0x47, 0x6, 0x4f, 0xe0, 0xc, 0x5d, 0xbf, 0x24,
- 0xa0, 0x7f, 0xb5, 0x0,
-
- /* U+E4AD "" */
- 0x30, 0xf, 0xb7, 0xf, 0x10, 0x3f, 0x8e, 0x60,
- 0x7f, 0xa5, 0x3, 0xfc, 0xba, 0x3, 0xff, 0x8e,
- 0xba, 0x3, 0xe9, 0x40, 0xf8, 0xe6, 0x7, 0xcf,
- 0x10, 0x3e,
-
- /* U+E4AE "" */
- 0xf8, 0xf, 0xa1, 0x3, 0xe3, 0x98, 0x1f, 0x3c,
- 0x40, 0xfa, 0xc0, 0x3e, 0x5d, 0x1, 0xff, 0xc7,
- 0x5d, 0x1, 0xfe, 0xb0, 0xf, 0xf3, 0xc4, 0xf,
- 0xe3, 0x98,
-
- /* U+E4B9 "" */
- 0x3, 0x89, 0x80, 0xc4, 0xc0, 0x7e, 0x5f, 0x6b,
- 0x92, 0xfb, 0x5d, 0x1, 0xee, 0x7, 0x5a, 0x3,
- 0xb8, 0x1f, 0xfc, 0xee, 0x7, 0xff, 0x3, 0x81,
- 0xa7, 0xd4, 0xf, 0xf5, 0xfd, 0x41, 0x61, 0xb0,
- 0x1f, 0xe4, 0x81, 0x10, 0x3f, 0xf8, 0x64, 0xf,
- 0xed, 0xb4, 0x8d, 0xb0, 0x1f, 0xdb, 0x77, 0xed,
- 0xb8, 0xf, 0xfe, 0x61, 0x3, 0xff, 0x8c, 0x46,
- 0x41, 0xc9, 0xfe, 0x61, 0x60, 0x7, 0xa, 0xdf,
- 0xfa, 0x82, 0x40, 0x4f, 0x10, 0x3f, 0xc7, 0x40,
- 0x0,
-
- /* U+E4C3 "" */
- 0x3b, 0xff, 0xe7, 0x48, 0x11, 0x40, 0x68, 0x40,
- 0x8e, 0xb0, 0xf, 0xc8, 0x2, 0x3, 0xf3, 0x22,
- 0x1, 0xfd, 0xba, 0x3, 0xf9, 0x20, 0x1f, 0x97,
- 0xb5, 0xe0, 0x1c, 0x68, 0x19, 0xc0, 0x34, 0x6,
- 0xfa, 0x58, 0x19, 0xe, 0x82, 0x81, 0x1, 0xc4,
- 0x9, 0x1, 0xc8, 0x20, 0x24, 0x10, 0x14, 0x11,
- 0x3, 0x20, 0xc, 0x70, 0xbf, 0x56, 0x0, 0x80,
- 0x3b, 0xf9, 0x81, 0x52, 0x7, 0xf4,
-
- /* U+E4DB "" */
- 0xff, 0xfc, 0x7, 0xff, 0xfc, 0xf, 0xfe, 0x18,
-
- /* U+E4DE "" */
- 0x0, 0xb6, 0xc4, 0x5d, 0xaa, 0x6, 0x3c, 0x9d,
- 0x52, 0x13, 0x22, 0x2, 0xe4, 0x6, 0x74, 0xe,
- 0xdc, 0xa3, 0x6f, 0xff, 0x2, 0x4, 0x18, 0xe9,
- 0x77, 0x28, 0x74, 0x38, 0x13, 0x3, 0x98, 0x2,
- 0xc0, 0xe5, 0x80, 0xec, 0xc3, 0xc0, 0x65, 0xff,
- 0xff, 0x3, 0x1, 0x89, 0xff, 0xe0, 0x81, 0x2d,
- 0xbf, 0xf8, 0x1c, 0xe, 0x5d, 0x1, 0x4e, 0x40,
- 0xfc, 0xa5, 0x20, 0x22, 0xe0, 0x7f, 0x35, 0x80,
- 0xa8, 0xa0, 0x7f, 0x5e, 0x6, 0xd4, 0xe, 0x5b,
- 0x7f, 0xf0, 0x38, 0xf0, 0x13, 0xff, 0xc2, 0x6d,
- 0x49, 0x7f, 0xf9, 0x95, 0x80,
-
- /* U+E502 "" */
- 0x7f, 0xff, 0xf1, 0x54, 0x4, 0xff, 0xf0, 0xc4,
- 0x7, 0x6f, 0xfe, 0x18, 0x1f, 0xff, 0xf0, 0x3f,
- 0xff, 0xe0, 0x71, 0xb7, 0xff, 0x86, 0x2, 0x4,
- 0xbf, 0xf8, 0x62, 0x3f, 0xf8, 0xf, 0x2f, 0xf9,
- 0x1, 0xe4, 0xbd, 0x80, 0xf0,
-
- /* U+E50F "" */
- 0x2, 0xbf, 0x10, 0x34, 0x44, 0xa0, 0x19, 0xc,
- 0x10, 0x1f, 0x10, 0x3f, 0xf8, 0x94, 0x81, 0xf2,
- 0x3, 0xff, 0x98, 0x40, 0xc4, 0x5, 0x3, 0xb8,
- 0x48, 0x7, 0x16, 0x40, 0xfb, 0x81, 0xfc, 0x80,
- 0xfb, 0x18, 0x7, 0x24, 0xe, 0x90, 0x65, 0x0,
-
- /* U+E51B "" */
- 0x3, 0xb6, 0xe0, 0x3f, 0xc4, 0xf0, 0x1f, 0xef,
- 0xf8, 0xf, 0xe5, 0x7f, 0xa9, 0x0, 0x40, 0xd6,
- 0x90, 0x12, 0xd2, 0xe2, 0x3, 0x23, 0x7f, 0xb2,
- 0x68, 0x90, 0xa5, 0x64, 0x9d, 0x1a, 0xc3, 0x5,
- 0x1a, 0x7, 0xd1, 0x21, 0xa2, 0x81, 0xfd, 0xc4,
- 0x21, 0x1, 0xfc, 0x82, 0x60, 0x81, 0xff, 0xc0,
- 0x60, 0x81, 0x2e, 0x80, 0xf1, 0x8, 0xf, 0xe4,
- 0x15, 0x14, 0xf, 0xee, 0x39, 0x46, 0x81, 0xf4,
- 0x45, 0xa, 0x56, 0x40, 0x46, 0xb1, 0xc0, 0xb2,
- 0x37, 0xfb, 0x23, 0x88, 0x1a, 0xd2, 0x20, 0x15,
- 0xc4, 0x0,
-
- /* U+E565 "" */
- 0x3, 0xc6, 0x10, 0x3f, 0xcb, 0x63, 0xd8, 0x80,
- 0xf3, 0xf4, 0x81, 0x1b, 0xd8, 0x9, 0xe0, 0x1f,
- 0xd3, 0xc6, 0x7, 0xff, 0x5, 0x81, 0xff, 0xcd,
- 0x58, 0xf, 0xfe, 0x2, 0xa4, 0xf, 0xf9, 0x51,
- 0xc0, 0xf4, 0x20, 0x15, 0x1c, 0xc, 0x41, 0x78,
- 0xba, 0x38, 0x18, 0xa0, 0x68, 0xd0, 0x70, 0x39,
- 0x50, 0xa, 0x80, 0xe0, 0x7a, 0x92, 0x0, 0xaf,
- 0x3, 0xc8, 0x8e, 0x4, 0x80, 0xfa, 0x0, 0x30,
- 0xf, 0xe8, 0x40, 0x9c, 0x3, 0xe8, 0xc0, 0xe7,
- 0x88, 0x11, 0xcc, 0xf, 0x8e, 0xae, 0xe2, 0x6,
-
- /* U+E57E "" */
- 0x3, 0xfd, 0x8, 0x1f, 0xf5, 0x0, 0xf5, 0x3,
- 0xfa, 0xa0, 0x19, 0x26, 0x3, 0xea, 0x80, 0x8d,
- 0x46, 0x1, 0xd5, 0x1, 0x98, 0xa5, 0x97, 0xfc,
- 0x80, 0xe8, 0xc4, 0x14, 0xf, 0xfa, 0x84, 0x8,
- 0x1f, 0xf1, 0x2, 0x60, 0x7f, 0xc4, 0x9, 0x81,
- 0xff, 0x50, 0x81, 0x7f, 0xc8, 0xe, 0x8c, 0x41,
- 0x40, 0xd5, 0x1, 0x98, 0xa5, 0x90, 0x3a, 0xa0,
- 0x23, 0x51, 0x80, 0x7d, 0x50, 0xc, 0x93, 0x1,
- 0xfd, 0x40, 0x3d, 0x40, 0x80,
-
- /* U+E580 "" */
- 0x3, 0xff, 0x8c, 0x58, 0x1f, 0xc7, 0x1, 0xfc,
- 0x70, 0x1f, 0xc7, 0x1, 0xa0, 0xf, 0xec, 0x7,
- 0x36, 0x3, 0xfe, 0x80, 0x7f, 0xf5, 0xe0, 0xfe,
- 0xc0, 0x74, 0x60, 0x63, 0x80, 0xcc, 0xf, 0x1c,
- 0x7, 0xfc, 0x70, 0x1f, 0xf1, 0x60, 0x60,
-
- /* U+E58C "" */
- 0x3, 0x24, 0x3, 0xe3, 0x68, 0xf, 0xb8, 0xc,
- 0x7, 0x42, 0x0, 0xc0, 0x22, 0xc0, 0xcc, 0x80,
- 0xe0, 0x7b, 0x84, 0x40, 0xf1, 0x5c, 0xf, 0xdd,
- 0x1, 0xf9, 0x1, 0xfe, 0x20, 0x7e, 0x34, 0xf,
- 0xd1, 0xa0, 0x3c, 0x90, 0x58, 0x6, 0x94, 0x9,
- 0xff, 0x98, 0x0,
-
- /* U+E58E "" */
- 0x3, 0x24, 0x3, 0xf5, 0xa2, 0x7, 0xb0, 0xe,
- 0x7, 0x42, 0x0, 0xc0, 0x22, 0xc0, 0xcc, 0x80,
- 0xe0, 0x7b, 0x84, 0x77, 0x1, 0x29, 0x5c, 0x22,
- 0x23, 0x83, 0xa1, 0x34, 0x78, 0x84, 0x5, 0x1e,
- 0x64, 0x1, 0x11, 0xe3, 0x78, 0x34, 0x6c, 0x21,
- 0xd1, 0x1a, 0x42, 0x2, 0x34, 0x82, 0xc0, 0x34,
- 0xa0, 0x4f, 0xfc, 0xc0, 0x0,
-
- /* U+E58F "" */
- 0x2, 0xbb, 0x20, 0x1f, 0xfc, 0x6, 0x89, 0x36,
- 0x3, 0xfe, 0xc0, 0x6c, 0x97, 0xc0, 0x59, 0x1,
- 0x95, 0xbf, 0x60, 0x4, 0xf, 0xfe, 0x9, 0x20,
- 0xc0, 0xff, 0xe2, 0x46, 0x6, 0x7f, 0xec, 0x7,
- 0xff, 0x11, 0x1, 0x50, 0x3f, 0xf8, 0x14, 0x9,
- 0x1, 0xff, 0xc0, 0xdf, 0xd8, 0xf, 0xfe, 0x12,
- 0x3, 0xff, 0x86, 0xaa, 0x3, 0xff, 0x85, 0x5,
- 0x0, 0x88, 0x18, 0xa0, 0x31, 0x0, 0x6d, 0x20,
- 0x32, 0xb4, 0x4, 0x81, 0x24, 0x7, 0xe4, 0x5,
- 0x7e, 0x3, 0xff, 0x8c,
-
- /* U+E594 "" */
- 0x3, 0xff, 0x9f, 0x0, 0xff, 0x20, 0x33, 0x60,
- 0x3f, 0xad, 0x84, 0xd0, 0x6c, 0x40, 0x75, 0x40,
- 0x51, 0x80, 0x31, 0x1, 0x92, 0x0, 0x60, 0x30,
- 0x12, 0x3, 0xa0, 0xa4, 0x80, 0x69, 0xd1, 0x3,
- 0x89, 0x24, 0x8, 0x56, 0x29, 0x4, 0x1, 0x8,
- 0x61, 0x0, 0xfb, 0x80, 0x63, 0x84, 0x49, 0x81,
- 0x97, 0x38, 0xb0, 0x37, 0x11, 0x1, 0x24, 0x14,
- 0x90, 0xe0, 0xc, 0x16, 0x1, 0x7e, 0x20, 0xb,
- 0x2, 0x74, 0x3f, 0x13, 0x28, 0x4, 0xc, 0x9,
- 0x64, 0x1d, 0xda, 0x0, 0x92, 0x20, 0x23, 0x74,
- 0x40, 0x18, 0x15, 0x56, 0x1, 0x8b, 0x21, 0x50,
- 0x35, 0x6d, 0xec, 0x8b, 0xdb, 0x50, 0x3d, 0x3c,
- 0x9, 0x4, 0xf0, 0xf, 0xe7, 0x76, 0x56, 0x7,
- 0x0,
-
- /* U+E599 "" */
- 0x3, 0xf5, 0x3, 0xff, 0x85, 0x53, 0x3, 0xff,
- 0x80, 0x49, 0xf0, 0x3f, 0xf8, 0x6, 0x48, 0xf,
- 0xb7, 0xc0, 0x15, 0xd5, 0x3, 0xfa, 0xa, 0x38,
- 0xb4, 0x8a, 0xb0, 0xd1, 0x83, 0x45, 0xa3, 0xbd,
- 0xd, 0x2c, 0x2, 0x8a, 0x31, 0xa, 0x8e, 0x28,
- 0x1c, 0x40, 0xe4, 0x18, 0x1f, 0x10, 0x39, 0x6,
- 0x7, 0x51, 0x46, 0x21, 0x51, 0xc5, 0x0, 0xd1,
- 0x68, 0xef, 0x43, 0x4b, 0xc, 0x38, 0xb1, 0x15,
- 0x61, 0xa3, 0xb, 0xf0, 0x7, 0x75, 0x40, 0xfe,
- 0x80, 0x78, 0xc9, 0x1, 0xff, 0xc0, 0x24, 0xf8,
- 0x1f, 0xfc, 0x1a, 0x98, 0x1e,
-
- /* U+E5A8 "" */
- 0x3, 0xf3, 0x60, 0x3f, 0xf8, 0xb6, 0x80, 0xff,
- 0xe9, 0x3c, 0x6, 0xd8, 0x6, 0xb4, 0x7, 0x8b,
- 0x3, 0xf2, 0x40, 0x3c, 0xeb, 0xa, 0xfe, 0xa8,
- 0x29, 0x40, 0xf2, 0x12, 0xa0, 0xa, 0xc0, 0xc0,
- 0xfc, 0x98, 0x1e, 0x68, 0xf, 0xee, 0x7, 0xee,
- 0x7, 0x6c, 0x61, 0x1, 0xf9, 0x0, 0xd8, 0xc0,
- 0xff, 0xe3, 0xec, 0x61, 0x1, 0xf9, 0x0, 0xd8,
- 0xc0, 0xdc, 0xf, 0xdc, 0xf, 0xe4, 0xc0, 0xf3,
- 0x40, 0x7e, 0x62, 0x54, 0x1, 0x58, 0x18, 0x1e,
- 0x90, 0x82, 0xbf, 0xaa, 0x6, 0x70, 0x3a, 0x64,
- 0x5, 0xb0, 0x8, 0xfc, 0x7, 0x88, 0x1f, 0xf1,
- 0x3, 0xfe, 0xb4, 0x7, 0xf0,
-
- /* U+E5A9 "" */
- 0x3, 0x29, 0xbf, 0xda, 0x20, 0x3c, 0xfd, 0x64,
- 0xc, 0x5d, 0xec, 0x2, 0xf0, 0x8, 0xb7, 0x88,
- 0x14, 0xeb, 0x0, 0x37, 0xe9, 0x36, 0xf4, 0x80,
- 0xd0, 0xdc, 0x80, 0xfc, 0xb5, 0x30, 0x64, 0x1,
- 0x5d, 0xfb, 0x54, 0x1, 0x60, 0x32, 0xf5, 0x10,
- 0x5, 0x5e, 0x80, 0xf6, 0x2, 0x4d, 0x90, 0x16,
- 0x3, 0xd1, 0x4f, 0x64, 0x5f, 0x14, 0x3, 0xea,
- 0xc0, 0xf3, 0xa0, 0x7f, 0x95, 0xfd, 0x90, 0x1f,
- 0xfc, 0xe, 0x80, 0x1e, 0x7, 0xff, 0x2, 0x90,
- 0x6, 0x81, 0xff, 0xc1, 0xe0, 0x38, 0x1f, 0xfc,
- 0x23, 0x20, 0x81, 0xf0,
-
- /* U+E5F1 "" */
- 0x17, 0xff, 0x30, 0x80, 0xc9, 0x0, 0xf4, 0x16,
- 0x80, 0xff, 0xe0, 0xe5, 0x0, 0xf9, 0x81, 0xe7,
- 0x0, 0xe7, 0x80, 0xd1, 0x46, 0x7, 0x40, 0x3e,
- 0x20, 0x81, 0x30, 0xd0, 0x14, 0x74, 0xe, 0x80,
- 0xc0, 0x11, 0xee, 0x6, 0x44, 0x4, 0x0, 0x69,
- 0x3, 0x96, 0x9, 0x0, 0x52, 0x80, 0xfd, 0x0,
- 0xff, 0xe0, 0xb2, 0x7, 0xff, 0x6, 0x1, 0xff,
- 0xc8, 0x79, 0x82, 0x7, 0xfa, 0x39, 0x0,
-
- /* U+E5FA "" */
- 0x3, 0x3b, 0xfd, 0xa1, 0x3, 0xcf, 0xc4, 0x4,
- 0x5e, 0x20, 0x67, 0x0, 0x4b, 0xac, 0x34, 0x81,
- 0x18, 0x17, 0x68, 0xa7, 0x90, 0x19, 0x0, 0xa0,
- 0x7e, 0x48, 0x7, 0x95, 0xfe, 0xa9, 0x2d, 0x20,
- 0x80, 0x7a, 0x80, 0x95, 0xa0, 0x14, 0x93, 0x0,
- 0x6c, 0x20, 0x78, 0x90, 0x21, 0x6f, 0x8, 0x1e,
- 0xc0, 0xa1, 0x5a, 0x3, 0xf2, 0x8, 0x41, 0x40,
- 0xfe, 0xc0, 0x44, 0x10, 0x3f, 0x88, 0x13, 0x20,
- 0x7f, 0xf4, 0xbf, 0x1, 0xff, 0xc0, 0x64, 0xc0,
- 0x7f, 0xa0,
-
- /* U+E606 "" */
- 0x3, 0xd7, 0xe2, 0xe, 0xf4, 0xf, 0xd5, 0x23,
- 0xa3, 0x94, 0x18, 0x1f, 0x21, 0x6a, 0x2, 0xad,
- 0x30, 0x3f, 0xb6, 0xc0, 0x7f, 0xf0, 0x89, 0xc0,
- 0x7f, 0xf0, 0x4f, 0xf8, 0xf, 0xfe, 0x9, 0x4b,
- 0x1, 0xff, 0xc2, 0xb7, 0x1, 0xff, 0xc2, 0xb7,
- 0x1, 0xfe, 0x30, 0x7, 0x9, 0x0, 0xc6, 0x40,
- 0x5b, 0x18, 0x5, 0x73, 0x0, 0xb6, 0x32, 0x54,
- 0x3b, 0xfb, 0x41, 0x2, 0xa5, 0xea, 0x76, 0x46,
- 0xfb, 0x64, 0x8d, 0xe3, 0x40, 0x27, 0xd2, 0x2f,
- 0x81, 0xb1, 0x9e, 0xf1, 0x99, 0x97, 0x52, 0xf7,
- 0xf3, 0x32, 0xa, 0xd8, 0xd1, 0x5b, 0x18, 0x5,
- 0xb1, 0x90,
-
- /* U+E60C "" */
- 0x3, 0xfe, 0x48, 0x7, 0xfd, 0x60, 0x1f, 0xfd,
- 0xf7, 0x80, 0xff, 0x38, 0x7, 0xf9, 0xc3, 0x80,
- 0xfc, 0xe1, 0xc0, 0x7e, 0x70, 0x1f, 0xfe, 0x0,
- 0x80, 0x14, 0xbf, 0x8e, 0x6, 0x5b, 0xf4, 0x7,
- 0xc, 0x40, 0xfe, 0x38, 0x62, 0x7, 0xf1, 0xd0,
- 0x81, 0xe0,
-
- /* U+E64A "" */
- 0xfe, 0x3, 0x96, 0xf4, 0x81, 0xff, 0x3a, 0x42,
- 0xc0, 0x62, 0x0, 0x81, 0x50, 0x3a, 0x1, 0x30,
- 0x14, 0x8, 0x81, 0xc4, 0xb, 0x80, 0x60, 0x44,
- 0xe, 0xc0, 0x48, 0x80, 0xa0, 0x38, 0x18, 0xb0,
- 0x37, 0x0, 0xb0, 0x39, 0xa9, 0x80, 0xe3, 0x40,
- 0x1f, 0x4, 0xac, 0xf, 0x95, 0x2, 0x7b, 0xfb,
- 0x42, 0x7, 0x26, 0x7, 0xc5, 0xea, 0x7, 0x70,
- 0x3f, 0xca, 0x81, 0xff, 0xc4, 0x40, 0x7f, 0xf1,
- 0x40,
-
- /* U+E68A "" */
- 0x3, 0xe5, 0x8, 0x1f, 0xf3, 0xd5, 0xec, 0x40,
- 0x7d, 0x3c, 0x20, 0x46, 0xe6, 0x5, 0x7b, 0x3,
- 0xf1, 0x9e, 0x14, 0x7, 0x88, 0x1e, 0x60, 0x78,
- 0xec, 0x60, 0x7f, 0xc7, 0x11, 0x28, 0x1f, 0xcb,
- 0x1, 0x96, 0x20, 0x78, 0xf0, 0x3c, 0x68, 0x11,
- 0x0, 0x68, 0x1e, 0x30, 0xf, 0xf3, 0xa0, 0x78,
- 0x82, 0x7, 0x64, 0x7, 0x90, 0xa0, 0x44, 0x80,
- 0x12, 0x60, 0x54, 0x30, 0x2d, 0x88, 0x6c, 0xa0,
- 0x11, 0x1, 0x0, 0xff, 0xa0, 0x13, 0x40, 0x7f,
- 0x52, 0x6, 0xa8, 0xf, 0xaa, 0x3, 0xd6, 0x1,
- 0x8e, 0x40, 0x7e, 0x7e, 0x3d, 0x84, 0xc,
-
- /* U+E6A1 "" */
- 0x3, 0xff, 0x9d, 0x79, 0x3, 0xff, 0x85, 0x90,
- 0xc8, 0xf, 0xf8, 0xe3, 0x30, 0xa8, 0xf, 0xe3,
- 0x8c, 0x67, 0x1a, 0xc0, 0xf9, 0x61, 0x58, 0x3,
- 0x8c, 0x80, 0x39, 0x51, 0x90, 0x1d, 0x8b, 0xa0,
- 0x4e, 0x80, 0x20, 0x7c, 0xc2, 0xa0, 0x16, 0x40,
- 0x5b, 0x6a, 0x5, 0xa0, 0x2, 0x40, 0x62, 0x73,
- 0x2, 0x24, 0x7, 0xf1, 0xe8, 0xf, 0xff, 0x26,
- 0xc0, 0x31, 0xc8, 0xf, 0xe2, 0x40, 0x71, 0x3,
- 0x80,
-
- /* U+E6A5 "" */
- 0xb, 0xa0, 0xb, 0xa0, 0x3f, 0xf9, 0x27, 0x89,
- 0x6a, 0xe, 0x7a, 0x5, 0x21, 0xb, 0x90, 0x3f,
- 0x10, 0x3f, 0xfb, 0x98, 0xf, 0xd8, 0xe0, 0x3d,
- 0x88, 0x38, 0xd, 0x88, 0x11, 0x3, 0x10, 0x3f,
- 0xf8, 0x0,
-
- /* U+E6B5 "" */
- 0x2, 0x7f, 0xf9, 0x81, 0xea, 0x7, 0xa8, 0x1c,
- 0x48, 0xf, 0x12, 0x3, 0x20, 0x3f, 0x50, 0x35,
- 0x3, 0xf2, 0x2, 0x24, 0x7, 0xe2, 0x40, 0x28,
- 0x1f, 0xea, 0x1, 0x1, 0xfe, 0x40, 0x90, 0x1f,
- 0xe2, 0x54, 0xf, 0xfe, 0x5, 0x9f, 0xff, 0xf0,
- 0x20, 0x1e, 0xd8, 0x7, 0xff, 0x9b, 0x6c, 0x4b,
- 0x6c, 0x6, 0x27, 0x0, 0x27, 0x0,
-
- /* U+E6C0 "" */
- 0x3f, 0xff, 0xf0, 0x5c, 0x3, 0xff, 0x83, 0x0,
- 0xf9, 0x90, 0x3f, 0xf8, 0x31, 0x81, 0xff, 0xea,
- 0xb8, 0xe, 0x9c, 0x81, 0xd8, 0xe0, 0x28, 0xd1,
- 0x3, 0x9b, 0x1c, 0x23, 0x34, 0xf, 0xa3, 0x20,
- 0x96, 0x3, 0xfa, 0x30, 0x70, 0x1f, 0xf4, 0x8c,
- 0x7, 0xff, 0x5, 0x81, 0xf4, 0x3, 0xff, 0x83,
- 0x0,
-
- /* U+E6C3 "" */
- 0x3f, 0xff, 0xf0, 0x5c, 0x3, 0xff, 0x83, 0x0,
- 0xf9, 0x81, 0xff, 0xc1, 0x91, 0x80, 0xff, 0xa3,
- 0x7, 0x1, 0xfd, 0x19, 0x4, 0xb0, 0x1f, 0x36,
- 0x38, 0x46, 0x70, 0x1e, 0xc7, 0x1, 0x46, 0x48,
- 0xe, 0xb8, 0xe, 0x9c, 0x81, 0xff, 0xea, 0x8c,
- 0xf, 0xfe, 0xb, 0x20, 0x7a, 0x1, 0xff, 0xc1,
- 0x80,
-
- /* U+E6E8 "" */
- 0x3, 0xf3, 0x60, 0x3f, 0xf8, 0xb6, 0x80, 0xff,
- 0xe0, 0x10, 0x3f, 0xf8, 0xb3, 0x10, 0x2d, 0x80,
- 0x6d, 0xc0, 0xea, 0x28, 0x2, 0xd8, 0x80, 0x66,
- 0x1, 0xc7, 0xc3, 0xb2, 0x46, 0xc2, 0xfb, 0x3,
- 0xf6, 0x20, 0x63, 0x80, 0xff, 0x40, 0x3f, 0x40,
- 0x3a, 0xd2, 0xc, 0xf, 0xc8, 0x5, 0xa4, 0xac,
- 0x7, 0xf8, 0x80, 0x49, 0xbf, 0x40, 0x40, 0xfc,
- 0x40, 0x7e, 0x80, 0x6a, 0x7, 0xea, 0x7, 0xf3,
- 0x20, 0x78, 0xb0, 0x3f, 0xd8, 0x81, 0x8e, 0x3,
- 0xff, 0x80, 0x80, 0xc8, 0xf, 0xfe, 0xf, 0x3,
- 0x70, 0x3f, 0xf8, 0x2f, 0xec, 0xec, 0xf, 0xfe,
- 0x15, 0xd9, 0x40, 0xff, 0xe1, 0xf2, 0x58, 0xf,
- 0xc0,
-
- /* U+E70D "" */
- 0x3, 0x19, 0xbf, 0x6a, 0x80, 0xfd, 0x33, 0x9,
- 0x2, 0xb8, 0x81, 0xcd, 0xdf, 0x5a, 0xdd, 0x98,
- 0x7, 0x3d, 0xc, 0xd9, 0xc, 0xd4, 0x8, 0xe0,
- 0x56, 0x64, 0x9e, 0x44, 0x5a, 0x14, 0x9a, 0x80,
- 0x5c, 0x5, 0x21, 0xa2, 0x81, 0xa0, 0x7e, 0xa2,
- 0x4, 0x50, 0x60, 0x4b, 0x81, 0x30, 0x87, 0x3,
- 0xff, 0x8c, 0xc1, 0x3, 0xfc, 0x40, 0x22, 0x10,
- 0x1f, 0x98, 0x43, 0x60, 0x70, 0xd8, 0x42, 0xc6,
- 0x8a, 0x13, 0x10, 0xe4, 0xf7, 0xa7, 0x16, 0x58,
- 0xa, 0x39, 0x3, 0xe7, 0x4, 0x0, 0x99, 0xd0,
- 0x81, 0x2b, 0x6, 0x3, 0x48, 0xf, 0x7f, 0x54,
- 0x71, 0x3, 0x9f, 0x84, 0x9, 0x5c, 0x40, 0x80,
-
- /* U+E70E "" */
- 0x3, 0xf8, 0x81, 0xff, 0xc0, 0xda, 0x3, 0xfc,
- 0x48, 0x12, 0x3, 0xf8, 0xa0, 0x88, 0x1f, 0xcf,
- 0x7a, 0x7, 0xca, 0xf9, 0x18, 0xf, 0xbd, 0x40,
- 0x45, 0x81, 0xfb, 0x90, 0x28, 0xc0, 0xf1, 0x4,
- 0x4, 0x33, 0xd0, 0x38, 0x81, 0x2d, 0xa, 0x2,
- 0xf9, 0x1, 0xcf, 0x70, 0x3b, 0x1, 0x62, 0x4,
- 0x51, 0x0, 0xc6, 0x23, 0x81, 0x2b, 0xbd, 0x26,
- 0xc0, 0x72, 0x8c, 0xa0, 0x80, 0xf8, 0xb9, 0xbe,
- 0x80, 0x7f, 0xf0, 0x8, 0x1f, 0xfd, 0x3b, 0x0,
- 0x80,
-
- /* U+E717 "" */
- 0x3, 0xc9, 0x98, 0x7, 0xff, 0x6, 0x46, 0x68,
- 0xf, 0xfe, 0x6, 0x22, 0xa0, 0x3e, 0x7c, 0x81,
- 0x30, 0x80, 0xb5, 0x2, 0x21, 0x1, 0xc4, 0x8,
- 0x81, 0x3a, 0x24, 0x2c, 0x86, 0x8b, 0x85, 0x81,
- 0x50, 0xba, 0x65, 0x2e, 0x88, 0xd0, 0x55, 0xe4,
- 0x3b, 0x59, 0xe, 0xe4, 0x1, 0xff, 0xd7, 0x55,
- 0xe4, 0x3b, 0x59, 0xe, 0xe4, 0x2, 0xa1, 0x74,
- 0xca, 0x5d, 0x31, 0xa0, 0xe8, 0x90, 0xb2, 0x1e,
- 0x2c, 0x16, 0x3, 0x20, 0x3f, 0x90, 0x19, 0x72,
- 0x4, 0xc2, 0x2, 0xb4, 0x7, 0xec, 0x45, 0x40,
- 0x7f, 0xf0, 0x24, 0x66, 0x80, 0xf0,
-
- /* U+E72A "" */
- 0x5f, 0xff, 0xf0, 0x14, 0x4, 0x81, 0x3, 0xe8,
- 0x3, 0x60, 0xc0, 0x7f, 0xad, 0xa, 0x7, 0xf9,
- 0x20, 0x40, 0x7f, 0xf0, 0x15, 0xfd, 0x50, 0x1f,
- 0x4a, 0x80, 0x2b, 0x0, 0xe4, 0xc0, 0xf3, 0x40,
- 0x6e, 0x7, 0x3e, 0x38, 0x19, 0x1, 0x9c, 0x5,
- 0x1, 0xf9, 0x40, 0x3f, 0x10, 0xa, 0x81, 0x12,
- 0x3, 0x40, 0x1c, 0xb, 0x8, 0x6, 0x48, 0x2e,
- 0xbc, 0xa4, 0x3, 0xac, 0x5, 0x9, 0x40, 0xf9,
- 0xff, 0x98, 0x1a, 0x1, 0xff, 0xc0, 0x80,
-
- /* U+E75A "" */
- 0x3, 0xff, 0x82, 0xa5, 0xc0, 0x7e, 0x2e, 0xef,
- 0x5a, 0x3, 0xd3, 0x7d, 0x11, 0x3, 0xfc, 0xc8,
- 0x11, 0x53, 0x70, 0x3f, 0x9d, 0xfa, 0xb2, 0x7,
- 0xf1, 0x88, 0xf, 0xfe, 0xc9, 0x6c, 0x7, 0xff,
- 0x5, 0x69, 0x0, 0x67, 0xa8, 0x1e, 0xa0, 0x7a,
- 0xc2, 0x80, 0xff, 0xe0, 0xa0, 0x3f, 0xf8, 0x48,
- 0xf, 0xfb, 0x1, 0x18, 0x10, 0x1a, 0x81, 0x8f,
- 0xda, 0x1, 0x50, 0x8, 0xc0, 0xf1, 0x20, 0x0,
-
- /* U+E75F "" */
- 0x3, 0xff, 0x99, 0x40, 0xff, 0xe1, 0xd4, 0x7,
- 0xff, 0xa, 0xa0, 0x3f, 0xf8, 0x55, 0x1, 0x99,
- 0x0, 0x58, 0x9f, 0xc8, 0xe, 0x98, 0x96, 0x80,
- 0x7f, 0xd8, 0x6c, 0x18, 0xf, 0xf8, 0xc0, 0x10,
- 0x81, 0xff, 0x18, 0x2, 0x10, 0x3f, 0xec, 0x36,
- 0xc, 0x27, 0xf2, 0x3, 0xa6, 0x25, 0xa0, 0x1d,
- 0x50, 0x19, 0x90, 0x5, 0x81, 0xea, 0x80, 0xff,
- 0xe2, 0x54, 0x7, 0xff, 0x12, 0x81, 0xfc,
-
- /* U+E769 "" */
- 0x3, 0xe2, 0x7, 0xff, 0x2, 0xe0, 0x3f, 0xfb,
- 0x44, 0x80, 0x12, 0x3, 0xe7, 0xb1, 0xd, 0xa0,
- 0x3d, 0x0, 0xf1, 0x40, 0x68, 0x7, 0xe8, 0x6,
- 0x60, 0x7e, 0x2c, 0x4, 0x3, 0xfd, 0x40, 0x30,
- 0x3f, 0xc5, 0x9b, 0x7f, 0xf8, 0x4, 0x92, 0xc2,
- 0x47, 0x4b, 0x80, 0xe4, 0xf, 0x3, 0x80,
-
- /* U+E7AE "" */
- 0x3, 0xff, 0x80, 0x99, 0x3, 0xff, 0x82, 0x6d,
- 0x4c, 0x7, 0xff, 0x2, 0x64, 0x5, 0x0, 0xfe,
- 0x7d, 0x81, 0xcc, 0x81, 0xe5, 0xa0, 0x1f, 0xfc,
- 0x3a, 0x40, 0xfc, 0x88, 0x1c, 0x40, 0xfe, 0xb4,
- 0x0, 0xcb, 0x45, 0x1, 0xf9, 0x81, 0x9a, 0x47,
- 0x0, 0xff, 0xe0, 0x16, 0x2, 0x1a, 0x56, 0x80,
- 0x19, 0x3, 0x40, 0x32, 0xd4, 0xb2, 0x20, 0x1e,
- 0x82, 0x81, 0xff, 0xc3, 0x71, 0x1, 0xfb, 0x6c,
- 0x6, 0x60, 0x7d, 0x1, 0x3c,
-
- /* U+E81B "" */
- 0x3, 0xeb, 0xff, 0xc8, 0xf, 0x92, 0x2, 0x78,
- 0x40, 0x3f, 0xae, 0xdc, 0x40, 0xff, 0xfa, 0x1a,
- 0x40, 0xff, 0xe1, 0x34, 0xc0, 0xff, 0xe1, 0x2e,
- 0x80, 0xff, 0xfd, 0xed, 0xea, 0x2e, 0xdc, 0x4a,
- 0x13, 0xe0, 0x22, 0x78, 0x1,
-
- /* U+E81C "" */
- 0x3, 0xe9, 0x6f, 0xa0, 0x1f, 0xa3, 0x4b, 0xce,
- 0x83, 0xff, 0x31, 0xff, 0x83, 0x3, 0xff, 0xf7,
- 0x78, 0x1f, 0xfc, 0x3b, 0x80, 0xff, 0xe2, 0x10,
- 0x3f, 0xfe, 0x98, 0xf, 0xb6, 0xf0, 0x30, 0xf,
- 0xc4, 0xf8, 0x1,
-
- /* U+E8DD "" */
- 0x7, 0x6e, 0x2, 0xa4, 0xf8, 0x2, 0x3, 0x90,
- 0x24, 0x7, 0x50, 0x80, 0xf1, 0x18, 0xf, 0x95,
- 0xfe, 0xdf, 0xc8, 0xa, 0x62, 0x7, 0xff, 0xdf,
- 0x63, 0x1f, 0x40, 0x4, 0x80, 0x13, 0x0,
-
- /* U+E917 "" */
- 0x5f, 0xff, 0xf0, 0x14, 0x4, 0x81, 0x3, 0xe8,
- 0x3, 0x60, 0xc0, 0x7f, 0xb6, 0xa, 0x7, 0xf8,
- 0x90, 0x40, 0x7f, 0xf0, 0x15, 0xfd, 0x50, 0x1f,
- 0x4a, 0x80, 0x2b, 0x0, 0xe4, 0xea, 0x15, 0x86,
- 0x80, 0xdc, 0x22, 0x16, 0x1, 0xc0, 0xc8, 0x28,
- 0x12, 0x10, 0x80, 0xf4, 0x12, 0x8e, 0x7, 0x88,
- 0x2d, 0x84, 0x26, 0x3, 0x40, 0x1c, 0x1, 0xe,
- 0x1, 0x92, 0x7, 0xc2, 0xe1, 0x1, 0xd6, 0x1,
- 0xa5, 0x3, 0xe7, 0xfe, 0x60, 0x68, 0x7, 0xff,
- 0x2, 0x0,
-
- /* U+E91C "" */
- 0x3, 0xdf, 0xd8, 0xf, 0xcc, 0x8, 0xa0, 0x3e,
- 0x80, 0x68, 0x7, 0x98, 0x1c, 0x48, 0xe, 0xa0,
- 0x7a, 0x1, 0x91, 0x3, 0xc8, 0xd, 0xc0, 0xfd,
- 0x0, 0xb4, 0x9f, 0xbc, 0xa1, 0xbd, 0xbb, 0x79,
- 0x20, 0x1c, 0x90, 0xf, 0x13, 0xc0, 0x7e, 0xdb,
- 0x80, 0xfd, 0x27, 0xa8, 0x1e, 0x6f, 0xe0, 0x3f,
- 0xf8, 0xa0,
-
- /* U+E95F "" */
- 0x3, 0x26, 0x7, 0xfa, 0xca, 0xed, 0x30, 0x31,
- 0x0, 0xa2, 0x48, 0x80, 0x88, 0x1e, 0x48, 0x5,
- 0x43, 0x3, 0x44, 0x1, 0xa4, 0x80, 0x56, 0x60,
- 0x60, 0xa2, 0x86, 0x8c, 0x8c, 0x28, 0x5, 0x60,
- 0x81, 0x81, 0xe4, 0x6, 0x60, 0x10, 0x1f, 0xa4,
- 0x8, 0x7, 0xf3, 0x2c, 0x81, 0xfd, 0xc7, 0x3,
- 0xf8, 0xc3, 0x0, 0xfe, 0x65, 0x90, 0x3c, 0xb6,
- 0x11, 0xb6, 0x3, 0x12, 0x2, 0x26, 0x0,
-
- /* U+E96B "" */
- 0x1, 0x37, 0xcc, 0x2, 0xdf, 0xa9, 0x2, 0xcc,
- 0x23, 0x2c, 0xa5, 0x2b, 0x20, 0xcb, 0xd7, 0xa4,
- 0x6b, 0xda, 0xc6, 0x8a, 0x60, 0x79, 0x80, 0x79,
- 0x83, 0x3, 0x2c, 0x38, 0x48, 0x1, 0x28, 0xc2,
- 0x1f, 0xa8, 0x4f, 0x60, 0xd, 0x8d, 0x0, 0xf0,
- 0x8, 0xc2, 0x7d, 0x8, 0x1f, 0xf4, 0x80, 0x3f,
- 0xed, 0xb4, 0x8d, 0xb0, 0x1f, 0x13, 0xfe, 0x3,
- 0xee, 0xc0, 0xf3, 0xe0, 0x7e, 0x88, 0xc, 0xa0,
- 0x1f, 0xea, 0x80, 0x2a, 0x7, 0xff, 0x2d, 0xc9,
- 0xcc, 0x3, 0x93, 0xc4, 0x9b, 0xe2, 0x0, 0xb7,
- 0xe2, 0x98, 0x1f, 0xfc, 0x1c, 0x0,
-
- /* U+E99D "" */
- 0x3, 0xf1, 0x3, 0xff, 0x83, 0x3e, 0xc6, 0x7,
- 0xe3, 0x7b, 0x0, 0x67, 0x80, 0x65, 0x72, 0x3,
- 0xe7, 0xe9, 0x2a, 0x80, 0xff, 0x96, 0x3, 0xe2,
- 0x80, 0xff, 0xe0, 0xbf, 0xe4, 0x7, 0xfd, 0x35,
- 0x70, 0xf, 0xfe, 0x75, 0x1f, 0x99, 0x80, 0x62,
- 0x6, 0x40, 0x72, 0x2, 0x20, 0x81, 0xff, 0xc1,
- 0x61, 0x1, 0xff, 0xc1, 0xe2, 0x81, 0x20, 0x39,
- 0x0, 0x28, 0x16, 0x2, 0xff, 0xd0, 0x4, 0x2,
- 0x84, 0xf, 0xe6, 0x80, 0xd8, 0xf, 0xca, 0x1,
- 0xee, 0x80, 0xe9, 0x40, 0xfd, 0x69, 0x7, 0x98,
- 0x1f, 0xe5, 0x7c, 0x20, 0x70,
-
- /* U+E9A0 "" */
- 0x3, 0xff, 0x82, 0x64, 0x10, 0x3f, 0xf8, 0x59,
- 0xb6, 0x3, 0xff, 0x81, 0x78, 0x94, 0x30, 0x3f,
- 0xd5, 0x0, 0xcc, 0x70, 0x3f, 0xd9, 0xbb, 0x1,
- 0xff, 0xc1, 0x72, 0x4c, 0xf, 0xfe, 0xda, 0xdb,
- 0xff, 0x85, 0xc0, 0x89, 0xff, 0xe1, 0x80, 0x44,
- 0x7f, 0xff, 0xc0, 0xa, 0x6, 0x8, 0x1f, 0xe2,
- 0x8, 0xc, 0x38, 0x1f, 0xee, 0x30, 0x6, 0x8f,
- 0xdb, 0xf7, 0x2d, 0x1, 0x56, 0x9, 0xfc, 0x14,
- 0x3, 0x88, 0xff, 0xf0, 0x1f, 0x8b, 0x3, 0xf4,
- 0x20, 0x40,
-
- /* U+E9AB "" */
- 0x3, 0xf2, 0xff, 0xa8, 0x1f, 0xd0, 0x25, 0x14,
- 0x80, 0x7f, 0xae, 0xc8, 0x7, 0xff, 0x6, 0x50,
- 0x3f, 0xfa, 0x5f, 0x1, 0xff, 0xd7, 0x7b, 0x7c,
- 0x46, 0xd5, 0x0, 0x4f, 0xe0, 0x4, 0xc0, 0x1a,
- 0xf, 0xff, 0xf1, 0x4, 0x36, 0x40, 0x7e, 0x45,
- 0x80, 0x86, 0xb0, 0x3c, 0xa8, 0x80, 0x59, 0x4c,
- 0xc0, 0xa5, 0x14, 0xe, 0xb4, 0x60, 0x13, 0x15,
- 0x1, 0xe4, 0x46, 0xd0, 0x4, 0x7, 0xf8, 0x98,
- 0xf, 0x0,
-
- /* U+EA70 "" */
- 0x94, 0x48, 0x1, 0x58, 0x19, 0x40, 0x90, 0x24,
- 0x0, 0xb0, 0x16, 0xac, 0xf, 0xfe, 0x5, 0x20,
- 0x7f, 0xf0, 0x90, 0x1f, 0xfd, 0xac, 0x4b, 0x60,
- 0x20, 0x7c, 0x81, 0x0, 0x48, 0x60, 0x3e, 0x84,
- 0xe, 0x88, 0xf, 0xda, 0x80, 0x99, 0x81, 0xfe,
- 0x40, 0x19, 0x3, 0x5a, 0x3, 0xff, 0x84, 0x90,
- 0xf, 0xff, 0xf8, 0x1f, 0x80,
-
- /* U+EA7A "" */
- 0x3, 0x1d, 0xb5, 0x3, 0x2f, 0xec, 0x4e, 0x5f,
- 0xe0, 0x22, 0x7f, 0x0, 0x2a, 0xf, 0xb7, 0xd0,
- 0x70, 0x31, 0xec, 0x6c, 0x3, 0xff, 0xfe, 0x7,
- 0xff, 0x14, 0xc4, 0x2d, 0x1, 0xfc, 0xc8, 0x6c,
- 0x7, 0xdf, 0x6f, 0xa0, 0x21, 0x93, 0xfc, 0x18,
-
- /* U+EAAC "" */
- 0x5f, 0xff, 0xf0, 0x14, 0x4, 0x81, 0x3, 0xe8,
- 0x3, 0x60, 0xc0, 0x7f, 0xbf, 0xe, 0x7, 0xff,
- 0x33, 0xff, 0xf0, 0x1f, 0xfc, 0xa7, 0x0, 0xff,
- 0xe0, 0x46, 0x40, 0xff, 0x50, 0x10, 0xf, 0xf2,
- 0x0, 0x80, 0xfe, 0x20, 0x62, 0x7, 0xe2, 0x40,
- 0x9, 0x1, 0xfd, 0xa4, 0x60, 0x3f, 0xe6, 0xc0,
- 0x7e, 0xdb, 0xfc, 0x2, 0x2, 0x7f, 0xc2, 0x0,
-
- /* U+EAD7 "" */
- 0x5b, 0x7f, 0xf0, 0xa8, 0xa4, 0xff, 0xf0, 0x94,
- 0x0, 0xb0, 0xe, 0x46, 0xc0, 0x1c, 0x1, 0x1,
- 0x88, 0x21, 0x82, 0x40, 0x82, 0x6, 0xe0, 0x8,
- 0x1e, 0x20, 0x81, 0x9f, 0x1, 0xd0, 0xfc, 0x3,
- 0x81, 0xff, 0xc9, 0x5f, 0xff, 0xf0, 0x40, 0x2c,
- 0x7, 0xff, 0x5, 0x60,
-
- /* U+EC99 "" */
- 0x32, 0xdf, 0xfe, 0xc, 0x1d, 0xa5, 0xff, 0xc1,
- 0x70, 0xaf, 0xff, 0xa8, 0x78, 0x10, 0x3f, 0xf9,
- 0xdf, 0x0, 0x78, 0xf, 0xfe, 0x19, 0x40, 0x7f,
- 0xf0, 0xd4, 0x3, 0xff, 0x86, 0xf0, 0x1f, 0xfd,
- 0xf, 0x80, 0xf9, 0xdb, 0xfd, 0x0, 0xc6, 0x14,
- 0xbf, 0x88, 0x11, 0xa0,
-
- /* U+EF5F "" */
- 0x7f, 0xff, 0xf1, 0x30, 0x81, 0x2f, 0xfe, 0x19,
- 0x60, 0xdb, 0xff, 0xc2, 0x80, 0x7f, 0xf6, 0x4e,
- 0x60, 0x7f, 0xf1, 0x48, 0x1f, 0xfc, 0x7, 0xff,
- 0x60, 0x3f, 0xf8, 0x10, 0x1c, 0xc1, 0x60, 0x7f,
- 0xf0, 0x69, 0x80, 0x7f, 0xf1, 0x28, 0x60, 0x7f,
- 0xf1, 0xe, 0x80, 0x7f, 0xf0, 0xce, 0xce, 0xc0,
- 0x8f, 0xff, 0x1, 0x41, 0xe4, 0x0, 0xa4, 0xf8,
- 0xe, 0x68, 0x30, 0x42, 0xdb, 0xc4, 0xd, 0x5b,
- 0x52, 0x40, 0x79, 0xe2, 0x6, 0x77, 0xec, 0x3,
- 0xf1, 0x3, 0x40, 0xa3, 0x5, 0x80,
-
- /* U+EFC6 "" */
- 0x3, 0xfe, 0x77, 0x54, 0x7, 0xff, 0x3, 0x44,
- 0x55, 0x80, 0x7f, 0xa9, 0x7b, 0xd0, 0xd0, 0x1f,
- 0xc9, 0x21, 0xb, 0xe, 0x7, 0xe2, 0x8, 0x18,
- 0x86, 0x7, 0xfb, 0x81, 0xf3, 0xff, 0xec, 0x27,
- 0x60, 0x5f, 0x40, 0x3f, 0xe8, 0x7, 0xff, 0x89,
- 0x64, 0x7, 0xff, 0xe, 0x9a, 0x7, 0xff, 0x56,
- 0x9a, 0x7, 0xff, 0xd, 0x64, 0x7, 0xff, 0x8a,
- 0x1, 0xff, 0x40, 0x38,
-
- /* U+F001 "" */
- 0x3, 0xff, 0xb0, 0xaf, 0xa0, 0x7f, 0xf0, 0xb,
- 0xde, 0xa0, 0x80, 0xfe, 0x53, 0xe8, 0x40, 0xff,
- 0x9d, 0xf5, 0x81, 0xff, 0xc2, 0xd1, 0x1, 0xff,
- 0xc5, 0x20, 0x7f, 0x92, 0x1, 0xff, 0xc3, 0x77,
- 0xd2, 0x7, 0xfc, 0x66, 0xf1, 0x1, 0xff, 0xc0,
- 0x5f, 0x32, 0x7, 0xff, 0xc, 0x81, 0xff, 0xf6,
- 0x2d, 0x88, 0x1f, 0xfc, 0x3b, 0xa4, 0x20, 0x3f,
- 0xf8, 0x4d, 0x1, 0xf3, 0xdf, 0x80, 0xff, 0xe1,
- 0xd8, 0x40, 0xfe, 0x68, 0xe, 0xa8, 0xf, 0x70,
- 0x3a, 0xe9, 0x17, 0xa4, 0x3, 0xc8, 0xf, 0x16,
- 0xc8, 0x5, 0x84, 0x2, 0xc4, 0xf, 0xfe, 0x0,
-
- /* U+F008 "" */
- 0xc4, 0x4f, 0xff, 0xf8, 0x0, 0xe, 0x3f, 0x30,
- 0x3f, 0xf8, 0x1b, 0x39, 0xd, 0x11, 0x3f, 0xfc,
- 0x1, 0x23, 0x1, 0x21, 0x1, 0xff, 0xc0, 0x92,
- 0x3, 0xff, 0x95, 0xbb, 0x3, 0xff, 0x81, 0xfb,
- 0x0, 0x95, 0xc, 0xdf, 0xe0, 0x16, 0xa0, 0x4,
- 0x84, 0x29, 0x3f, 0x0, 0x4a, 0x0, 0x90, 0x85,
- 0x27, 0xe0, 0x9, 0x40, 0x25, 0x43, 0x37, 0xf8,
- 0x5, 0xa8, 0x3, 0x76, 0x7, 0xff, 0x3, 0xf6,
- 0x3, 0xff, 0x95, 0x21, 0x1, 0xff, 0xc0, 0x92,
- 0x0, 0xd1, 0x13, 0xff, 0xc0, 0x12, 0x30, 0x7e,
- 0x60, 0x7f, 0xf0, 0x36, 0x72,
-
- /* U+F00B "" */
- 0xdf, 0xe8, 0x2f, 0xff, 0xf6, 0x20, 0x64, 0x10,
- 0x1f, 0xf1, 0x3, 0xff, 0xb8, 0x40, 0xcc, 0x20,
- 0x3f, 0xe3, 0xbf, 0xd4, 0x5f, 0xff, 0xed, 0x9f,
- 0xe8, 0x2f, 0xff, 0xf6, 0x20, 0x64, 0x10, 0x1f,
- 0xf1, 0x3, 0xff, 0xb8, 0x40, 0xcc, 0x20, 0x3f,
- 0xe3, 0xbf, 0xd4, 0x5f, 0xff, 0xed, 0x9f, 0xe8,
- 0x2f, 0xff, 0xf6, 0x20, 0x64, 0x10, 0x1f, 0xf1,
- 0x3, 0xff, 0xb8, 0x40, 0xcc, 0x20, 0x3f, 0xe2,
-
- /* U+F00C "" */
- 0x3, 0xff, 0x88, 0xbb, 0x3, 0xff, 0x88, 0xa8,
- 0x8c, 0xf, 0xfe, 0x12, 0xa0, 0x50, 0xf, 0xfe,
- 0xa, 0xa0, 0x68, 0x7, 0xff, 0x1, 0x50, 0x34,
- 0x61, 0xf4, 0x7, 0xca, 0x81, 0xa3, 0xe, 0xa,
- 0x80, 0xe5, 0x40, 0xd1, 0x80, 0x80, 0x55, 0x1,
- 0x2a, 0x6, 0x8c, 0xa, 0x1, 0xaa, 0xa, 0x81,
- 0xa3, 0x3, 0x38, 0x6, 0xb2, 0x81, 0xab, 0x3,
- 0xce, 0x81, 0x98, 0x1a, 0xa0, 0x3f, 0x2a, 0x7,
- 0xd5, 0x1, 0xfe, 0x54, 0xe, 0xa8, 0xf, 0xfe,
- 0x2, 0xa0, 0x55, 0x1, 0xff, 0xc2, 0x54, 0x54,
- 0x7, 0xf8,
-
- /* U+F00D "" */
- 0x12, 0x81, 0xf1, 0xac, 0x56, 0xb0, 0x1c, 0x72,
- 0x8d, 0x0, 0x38, 0x8, 0xe0, 0x2d, 0x40, 0x8e,
- 0x7, 0x1, 0xa2, 0xa0, 0x47, 0x60, 0x1b, 0x10,
- 0xa8, 0x11, 0x3, 0x62, 0x4, 0xa8, 0x1e, 0xc4,
- 0xe, 0x60, 0x71, 0x20, 0x38, 0xe0, 0x38, 0xe0,
- 0x31, 0xc0, 0x7c, 0x70, 0x3, 0x80, 0xda, 0x81,
- 0x1c, 0x30, 0x1b, 0x15, 0x40, 0x8d, 0x20, 0x58,
- 0x80, 0x54, 0x8, 0xe2, 0x31, 0x3, 0x2a, 0x14,
-
- /* U+F011 "" */
- 0x3, 0xf9, 0x10, 0x3f, 0xf8, 0xbe, 0xe0, 0x3f,
- 0xf8, 0x30, 0x81, 0xc4, 0x4, 0x20, 0x78, 0xf7,
- 0xc0, 0xfa, 0xbc, 0x40, 0xee, 0x0, 0x81, 0xf2,
- 0x1, 0x80, 0xd0, 0x80, 0x80, 0x7d, 0x40, 0xa8,
- 0x2, 0xc0, 0x46, 0x7, 0xca, 0x80, 0x48, 0x28,
- 0x2, 0xc0, 0xfe, 0x48, 0x3, 0x84, 0x2, 0x81,
- 0xff, 0x70, 0x8, 0x10, 0x8, 0xf, 0xf9, 0x1,
- 0xff, 0xd4, 0x20, 0x8, 0x1f, 0x88, 0x4, 0x6,
- 0xdf, 0x80, 0xc8, 0xc, 0x80, 0x50, 0x3f, 0xe8,
- 0x1, 0x8a, 0x0, 0xc0, 0x3f, 0x99, 0x1, 0x41,
- 0x60, 0x1c, 0x3, 0xe7, 0x0, 0x22, 0x2, 0x10,
- 0xf, 0x20, 0x25, 0x60, 0x15, 0x3, 0x62, 0x0,
- 0xdf, 0xea, 0x80, 0xb0, 0x1e, 0xcc, 0xf, 0xe5,
- 0xc8, 0x1f, 0x4c, 0xc0, 0xe5, 0x68, 0xf, 0xf1,
- 0x9f, 0xf5, 0x40, 0x78,
-
- /* U+F013 "" */
- 0x3, 0xfc, 0x40, 0xff, 0xe2, 0x2f, 0xdb, 0xc0,
- 0x3f, 0xf8, 0x44, 0xc, 0x40, 0xff, 0xe1, 0x60,
- 0x33, 0x20, 0x7e, 0x7e, 0xbe, 0x80, 0xc7, 0x47,
- 0xe8, 0x11, 0x81, 0x40, 0x3f, 0x38, 0x13, 0x1,
- 0x0, 0xff, 0xe2, 0x40, 0x8, 0xf, 0x19, 0x4,
- 0xf, 0x90, 0x80, 0x71, 0xcd, 0xb3, 0x3, 0x9a,
- 0xe, 0x81, 0xb8, 0x1a, 0x1, 0x9c, 0x3, 0xf1,
- 0x3, 0x88, 0x1f, 0xfc, 0x12, 0x7, 0x10, 0x3e,
- 0x74, 0xd, 0xc0, 0xd0, 0xc, 0xe0, 0x8, 0x7,
- 0x1c, 0xda, 0xb0, 0x39, 0xa0, 0x80, 0xf1, 0x90,
- 0x80, 0xf9, 0x8, 0x7, 0xff, 0x12, 0x0, 0x30,
- 0x28, 0x7, 0xe7, 0x2, 0x60, 0x4f, 0x57, 0xd0,
- 0x18, 0xe8, 0xfd, 0x3, 0x88, 0x16, 0x3, 0x32,
- 0x7, 0xff, 0x4, 0x81, 0x88, 0x1f, 0xfc, 0x25,
- 0xfb, 0x78, 0x7, 0xc0,
-
- /* U+F015 "" */
- 0x3, 0xfc, 0x98, 0x19, 0xc6, 0x7, 0xff, 0x6,
- 0xd4, 0xe4, 0x4, 0x70, 0xf, 0xfe, 0x6, 0x40,
- 0x59, 0x1, 0xff, 0xc2, 0x3c, 0x83, 0x0, 0x58,
- 0x7, 0xff, 0x1, 0x60, 0xf, 0x3c, 0x1, 0x81,
- 0xff, 0x4a, 0x2, 0x4b, 0x8e, 0x40, 0xff, 0xab,
- 0x1, 0x5e, 0x63, 0x2c, 0x80, 0x90, 0x18, 0xe4,
- 0xe, 0x78, 0x81, 0x59, 0x60, 0xa, 0xc0, 0x2c,
- 0x42, 0xcf, 0x10, 0x39, 0xd7, 0x40, 0x4a, 0x28,
- 0x7, 0x5d, 0x3, 0xf2, 0xcf, 0x0, 0x4e, 0x89,
- 0x16, 0x1, 0xfe, 0x39, 0xf2, 0x9a, 0xed, 0x20,
- 0x1f, 0xfc, 0x18, 0x35, 0x3, 0xff, 0xab, 0x3f,
- 0x80, 0xff, 0xff, 0x81, 0xf3, 0x3, 0x88, 0x11,
- 0x3, 0x30, 0x30,
-
- /* U+F019 "" */
- 0x3, 0xf2, 0x58, 0xf, 0xfe, 0x1b, 0xb7, 0x30,
- 0x3f, 0xf8, 0x5c, 0xd, 0xc0, 0xff, 0xff, 0x81,
- 0xff, 0xd7, 0x7b, 0x4c, 0xc, 0xf6, 0x98, 0x1f,
- 0x13, 0x1, 0xe2, 0x60, 0x3e, 0x70, 0xf, 0xf4,
- 0x60, 0x7c, 0xe8, 0x1f, 0xab, 0x3, 0xf9, 0x50,
- 0x3d, 0x50, 0x1f, 0xf2, 0xa0, 0x6a, 0x80, 0xf3,
- 0x93, 0xca, 0x80, 0xaa, 0x4f, 0x38, 0xdf, 0xbb,
- 0xd8, 0xfb, 0x7e, 0x80, 0x7e, 0xd2, 0x30, 0x1f,
- 0xfc, 0x54, 0x80, 0x7f, 0xf2, 0x8e, 0x15, 0x80,
- 0x20, 0x7f, 0xf0, 0xe, 0x15, 0x83, 0xbf, 0xff,
- 0xe3, 0x60,
-
- /* U+F01C "" */
- 0x3, 0x1d, 0xff, 0xfd, 0x0, 0xfe, 0xc4, 0xf,
- 0xf9, 0xc0, 0x3e, 0xa0, 0x1b, 0xff, 0x10, 0xc8,
- 0x1c, 0x90, 0x29, 0x3f, 0xdc, 0x7, 0x3, 0xa8,
- 0xa, 0x7, 0xf8, 0xb0, 0x60, 0x15, 0x1, 0x40,
- 0xff, 0xe0, 0x42, 0x19, 0x9, 0x2, 0x40, 0x3f,
- 0xf8, 0x3c, 0x7, 0x10, 0x1, 0x92, 0x60, 0x78,
- 0xc9, 0x52, 0xa, 0x20, 0x1b, 0xd1, 0x1, 0xdd,
- 0xbc, 0x40, 0x10, 0x3f, 0x40, 0x32, 0x20, 0x7d,
- 0xc0, 0xfc, 0x7f, 0xd4, 0xf, 0xff, 0xf8, 0xf,
- 0x40, 0xff, 0xe4, 0x26,
-
- /* U+F020 "" */
- 0x3, 0xfb, 0xf0, 0x1f, 0xfc, 0x24, 0x1, 0x1,
- 0xff, 0xc1, 0x80, 0x38, 0x1f, 0xf4, 0xe4, 0x2,
- 0xf0, 0xb, 0x40, 0x13, 0xb0, 0x3c, 0xfc, 0x4,
- 0x80, 0x40, 0xbf, 0xf1, 0x10, 0xf, 0x24, 0x3,
- 0xc5, 0x1, 0x3b, 0x66, 0x8, 0x18, 0x82, 0x4,
- 0x52, 0x88, 0x60, 0x66, 0x30, 0x12, 0xff, 0xc,
- 0x6, 0xc1, 0x1, 0xfc, 0x40, 0xc8, 0xf, 0xf2,
- 0x40, 0x31, 0x40, 0x44, 0x80, 0xc4, 0x22, 0x48,
- 0x10, 0x2d, 0x0, 0xd8, 0x5d, 0x94, 0x60, 0x3f,
- 0x94, 0x3, 0x44, 0x7, 0xf9, 0xb0, 0x6, 0xc0,
- 0x7f, 0xf0, 0x20, 0x8, 0x7, 0x0,
-
- /* U+F021 "" */
- 0x3, 0xff, 0x8b, 0xbf, 0x1, 0xe7, 0x7f, 0xb4,
- 0x20, 0x44, 0xf, 0x3f, 0x10, 0x11, 0x7a, 0x90,
- 0x40, 0xeb, 0x0, 0xc4, 0xc, 0xb2, 0x3, 0xaa,
- 0x0, 0xaf, 0xdf, 0xa1, 0x1, 0x48, 0x13, 0x40,
- 0x25, 0x40, 0x67, 0xa8, 0x1e, 0x80, 0x2b, 0x3,
- 0xb7, 0xd0, 0xe, 0x60, 0x12, 0x1, 0xe2, 0x9,
- 0x1, 0xdc, 0x4, 0x3, 0xe2, 0x7, 0xe9, 0xf8,
- 0x81, 0xf6, 0xff, 0xf0, 0x1f, 0xfd, 0xcf, 0xff,
- 0x60, 0x3e, 0x3f, 0xa0, 0x1f, 0x88, 0x1f, 0x40,
- 0x18, 0xe, 0x24, 0x10, 0x1e, 0x48, 0x1, 0x1,
- 0xd3, 0x7a, 0x7, 0x3a, 0x2, 0x1, 0xeb, 0x90,
- 0x19, 0x68, 0x1, 0x30, 0x23, 0x40, 0x1b, 0xfb,
- 0x7a, 0x40, 0x2a, 0x7, 0x2c, 0x80, 0xc4, 0xd,
- 0x28, 0x1c, 0x41, 0xb9, 0x90, 0x25, 0x3b, 0x3,
- 0x10, 0x40, 0x8c, 0xdf, 0xd5, 0x81, 0xe0,
-
- /* U+F026 "" */
- 0x3, 0xff, 0x8a, 0x7f, 0x1, 0xe3, 0x80, 0xf8,
- 0xe0, 0x25, 0x26, 0xc0, 0x6a, 0xde, 0x3, 0xff,
- 0xd6, 0x40, 0xfe, 0xdf, 0xe6, 0x7, 0xf4, 0x60,
- 0x7f, 0x46, 0x7, 0xf4, 0x86,
-
- /* U+F027 "" */
- 0x3, 0xf3, 0x80, 0x7f, 0xf0, 0x24, 0x30, 0x3f,
- 0xe8, 0xc0, 0xff, 0xe0, 0x46, 0x7, 0xed, 0xfe,
- 0x60, 0x79, 0x90, 0x40, 0xff, 0xa6, 0x40, 0x7f,
- 0xf0, 0x28, 0x80, 0x7f, 0xf0, 0x10, 0x20, 0x7f,
- 0xf0, 0x10, 0x20, 0x7f, 0xf0, 0x28, 0x80, 0x7f,
- 0xf0, 0x1d, 0x55, 0xbc, 0x7, 0xd1, 0x5, 0x26,
- 0xc0, 0x7f, 0xf0, 0x8e, 0x3, 0xff, 0x84, 0x70,
- 0x1f, 0xfc, 0x23, 0xf8, 0xe,
-
- /* U+F028 "" */
- 0x3, 0xff, 0x88, 0xb2, 0x3, 0xff, 0x90, 0x4a,
- 0xb0, 0x3f, 0xc7, 0xf0, 0x1e, 0x70, 0x44, 0x7,
- 0xe3, 0x80, 0xf3, 0x81, 0xd1, 0x40, 0xf8, 0xe0,
- 0x3e, 0xaf, 0x4, 0xc5, 0xa, 0x4d, 0x80, 0xfd,
- 0x89, 0x51, 0x2, 0x15, 0xbc, 0x7, 0xcd, 0xc,
- 0x11, 0xc, 0x30, 0x3f, 0xf8, 0x12, 0xa1, 0x5,
- 0x14, 0x60, 0x3f, 0xf8, 0x14, 0x40, 0xc2, 0x4,
- 0x30, 0x3f, 0xf8, 0x8, 0x10, 0x3f, 0xf9, 0x8,
- 0x10, 0x3f, 0xf9, 0x14, 0x40, 0xc2, 0x8, 0x32,
- 0x7, 0xfd, 0x2a, 0x10, 0x51, 0x86, 0xcf, 0xf3,
- 0x3, 0xcd, 0xc, 0x11, 0xc, 0x30, 0x3a, 0x30,
- 0x3e, 0xc4, 0xa8, 0x81, 0x1, 0xf4, 0x60, 0x7a,
- 0xbc, 0x13, 0x14, 0xf, 0xd2, 0x18, 0x19, 0xc0,
- 0xa8, 0xa0, 0x7f, 0x9c, 0x3, 0xce, 0x88, 0x80,
- 0xff, 0xe3, 0x12, 0xac, 0x8,
-
- /* U+F03E "" */
- 0x5f, 0xff, 0xf1, 0x95, 0x3, 0xff, 0x8d, 0x40,
- 0xa6, 0x60, 0x7f, 0xf1, 0x23, 0x31, 0x1, 0xff,
- 0xc3, 0x40, 0x58, 0xf, 0x20, 0x3f, 0x50, 0x2a,
- 0x7, 0x3b, 0x80, 0xf9, 0xd7, 0x88, 0x19, 0xc0,
- 0x70, 0x1f, 0x28, 0x7, 0x38, 0x4, 0x70, 0x1f,
- 0x3d, 0x0, 0x38, 0x7, 0x16, 0x7, 0x38, 0x1c,
- 0x70, 0xf, 0xfe, 0x2, 0x80, 0x4e, 0x1, 0xff,
- 0xc1, 0xc0, 0x7f, 0xf1, 0xf4, 0x9f, 0xfc, 0x24,
- 0x6, 0x4d, 0xff, 0xf0, 0x88, 0xa, 0x7, 0xff,
- 0x1a, 0x80,
-
- /* U+F043 "" */
- 0x3, 0xff, 0x91, 0xf8, 0xf, 0xf9, 0x80, 0x80,
- 0x7f, 0xa8, 0x6, 0x7, 0xf2, 0x20, 0x4c, 0xf,
- 0xd0, 0xd, 0x0, 0xfa, 0x10, 0x3a, 0x1, 0xc5,
- 0x81, 0xe6, 0x40, 0xdc, 0xf, 0xd8, 0xa, 0x10,
- 0x3f, 0xa8, 0x2c, 0xf, 0xf2, 0x34, 0xf, 0xfe,
- 0x5, 0x40, 0x7f, 0xf0, 0x11, 0xa, 0x1, 0xfc,
- 0x40, 0x16, 0x7, 0xf9, 0x6, 0x20, 0x1f, 0x97,
- 0x1, 0x1c, 0x3, 0xee, 0x88, 0x74, 0xf8, 0x6,
- 0x28, 0x62, 0x15, 0xf0, 0x8, 0xe0, 0x2c, 0xc0,
- 0xf3, 0xc0, 0x74, 0xf6, 0x45, 0xf0, 0x8,
-
- /* U+F048 "" */
- 0x51, 0x81, 0xf1, 0x62, 0x38, 0x7, 0x8e, 0x90,
- 0x7, 0xe5, 0x80, 0x10, 0x3e, 0x54, 0xf, 0xf3,
- 0xa0, 0x7f, 0x9c, 0x3, 0xfd, 0x20, 0xf, 0xf4,
- 0x60, 0x7f, 0xcc, 0xf, 0xfe, 0xd6, 0x3, 0xff,
- 0x80, 0x70, 0x1f, 0xfc, 0x3, 0xc8, 0x1f, 0xfc,
- 0xc, 0x40, 0xff, 0xe0, 0x64, 0x7, 0xff, 0x2,
- 0xa0, 0x3f, 0xf8, 0x15, 0x8f, 0xbf, 0x1, 0xf4,
- 0xe8,
-
- /* U+F04B "" */
- 0xd, 0x1, 0xff, 0xc3, 0xb2, 0xe2, 0x7, 0xff,
- 0x5, 0x0, 0x3a, 0x81, 0xff, 0xc5, 0x5d, 0x81,
- 0xff, 0xc5, 0x99, 0x1, 0xff, 0xc4, 0x36, 0x88,
- 0x1f, 0xfc, 0x45, 0xa0, 0x1f, 0xfc, 0x57, 0xd0,
- 0x1f, 0xfc, 0x5b, 0x44, 0xf, 0xfe, 0x22, 0xc4,
- 0xf, 0xfe, 0x2a, 0x3, 0xff, 0x8a, 0x80, 0xff,
- 0xe1, 0xac, 0x40, 0xff, 0xe0, 0x9b, 0x44, 0xf,
- 0xfe, 0xb, 0xc8, 0xf, 0xfe, 0xa, 0xd0, 0xf,
- 0xfe, 0x9, 0xb4, 0x40, 0xff, 0xe0, 0xcc, 0x80,
- 0xff, 0xe0, 0xae, 0xc0, 0xff, 0x20, 0x7, 0x50,
- 0x3f, 0xf8, 0x16, 0x5c, 0x40, 0xff, 0xe0, 0x80,
-
- /* U+F04C "" */
- 0xe, 0x4c, 0x40, 0xce, 0x4c, 0x45, 0x8d, 0xec,
- 0x40, 0x58, 0xde, 0xc5, 0x1, 0xe4, 0x1, 0x1,
- 0xe4, 0x7, 0xdc, 0xf, 0xee, 0x7, 0xff, 0xfc,
- 0xf, 0xff, 0xf8, 0x1f, 0xff, 0xde, 0x7, 0xf7,
- 0xa0, 0x72, 0x60, 0x28, 0x1c, 0x98,
-
- /* U+F04D "" */
- 0xe, 0x4f, 0xfe, 0xb, 0x22, 0xc6, 0xff, 0xf8,
- 0x33, 0x14, 0x7, 0xff, 0x11, 0x1, 0xff, 0xc5,
- 0xe0, 0x7f, 0xff, 0xc0, 0xff, 0xff, 0x81, 0xff,
- 0xff, 0x3, 0xf7, 0xa0, 0x7f, 0xf0, 0xd3,
-
- /* U+F051 "" */
- 0xc, 0x81, 0xf2, 0x8d, 0xa6, 0x40, 0x7a, 0x39,
- 0xc0, 0x56, 0x7, 0xff, 0x2, 0x30, 0x3f, 0xf8,
- 0x12, 0x0, 0xff, 0xe0, 0x3a, 0x7, 0xff, 0x1,
- 0x50, 0x3f, 0xf8, 0xb, 0x10, 0x3f, 0xe2, 0x7,
- 0xff, 0x6a, 0x90, 0x3f, 0xd9, 0x1, 0xfe, 0xc4,
- 0xf, 0xe3, 0x88, 0x1f, 0xc7, 0x10, 0x3f, 0x8e,
- 0x3, 0xf5, 0xb, 0x1, 0xfc, 0x7d, 0x3, 0xed,
- 0xf8,
-
- /* U+F052 "" */
- 0x3, 0xf8, 0x81, 0xff, 0xc5, 0xbb, 0xa0, 0x3f,
- 0xf8, 0x55, 0x0, 0xa4, 0xf, 0xfe, 0x4, 0x40,
- 0x6c, 0x40, 0xff, 0x36, 0x3, 0xd8, 0xf, 0xe7,
- 0x0, 0xfd, 0x80, 0xf9, 0x40, 0x3f, 0x8e, 0x3,
- 0x95, 0x3, 0xfe, 0x34, 0x8, 0xd0, 0x3f, 0xf8,
- 0x2a, 0x80, 0xe0, 0x7f, 0xf0, 0xd2, 0x2, 0x7,
- 0xff, 0x10, 0x8a, 0x7, 0xff, 0xc, 0xb0, 0xbf,
- 0xff, 0xe1, 0xe0, 0x17, 0xff, 0xfe, 0x21, 0x8,
- 0xf, 0xfe, 0x22, 0x3, 0xff, 0x8d, 0xc0, 0xff,
- 0xe3, 0x70, 0x80, 0xff, 0xe2, 0x20,
-
- /* U+F053 "" */
- 0x3, 0xff, 0x8c, 0xbc, 0x3, 0xe5, 0x43, 0x40,
- 0x72, 0xa0, 0x4c, 0xc, 0xa8, 0x16, 0x20, 0x4a,
- 0x81, 0x62, 0x4, 0xa8, 0x16, 0x20, 0x4a, 0x81,
- 0x62, 0x4, 0xa8, 0x16, 0x20, 0x68, 0x5, 0x48,
- 0x1d, 0x0, 0xa9, 0x3, 0x95, 0x2, 0xc4, 0xe,
- 0x54, 0xb, 0x10, 0x39, 0x50, 0x2c, 0x40, 0xe5,
- 0x40, 0xb1, 0x3, 0x95, 0x2, 0xc4, 0xe, 0x54,
- 0x9, 0x81, 0xe5, 0x43, 0x40, 0x7c, 0xbc, 0x0,
-
- /* U+F054 "" */
- 0x3, 0xfe, 0x3a, 0x81, 0xfb, 0x95, 0x80, 0xf9,
- 0x0, 0x38, 0xf, 0x46, 0x0, 0xe0, 0x3d, 0x18,
- 0x3, 0x80, 0xf4, 0x60, 0xe, 0x3, 0xd1, 0x80,
- 0x38, 0xf, 0x46, 0x0, 0xe0, 0x3d, 0x8, 0x2,
- 0xc0, 0xe8, 0x40, 0x16, 0x6, 0x8c, 0x1, 0xc0,
- 0x68, 0xc0, 0x1c, 0x6, 0x8c, 0x1, 0xc0, 0x68,
- 0xc0, 0x1c, 0x6, 0x8c, 0x1, 0xc0, 0x72, 0x0,
- 0x70, 0x1e, 0xe5, 0x60, 0x3e, 0x3a, 0x81, 0xf8,
-
- /* U+F067 "" */
- 0x3, 0xe4, 0xd8, 0xf, 0xfe, 0x1d, 0x92, 0x3,
- 0xff, 0x82, 0x40, 0x88, 0x1f, 0xff, 0xf0, 0x32,
- 0x96, 0xe8, 0x4, 0xed, 0xe8, 0x2b, 0x4b, 0x80,
- 0x8a, 0x5c, 0xd8, 0xf, 0xfe, 0x32, 0x3, 0xff,
- 0x88, 0x6f, 0xdb, 0x80, 0x96, 0xdd, 0xd0, 0x2,
- 0x70, 0x1c, 0x4f, 0x1, 0xff, 0xf2, 0x20, 0x44,
- 0xf, 0xfe, 0x11, 0x1, 0x80, 0xf8,
-
- /* U+F068 "" */
- 0x77, 0x6f, 0xfe, 0x15, 0x11, 0x13, 0xff, 0xc2,
- 0x4c, 0xf, 0xfe, 0x32, 0x3, 0xff, 0x88, 0x80,
-
- /* U+F06E "" */
- 0x3, 0xe7, 0x77, 0xf6, 0x84, 0xf, 0xfe, 0x4,
- 0xf1, 0x10, 0x22, 0xf6, 0x20, 0x3f, 0x1c, 0xc0,
- 0x3d, 0xfd, 0x48, 0x36, 0x80, 0xf2, 0xc4, 0x5,
- 0x85, 0x34, 0x99, 0x0, 0x58, 0xc, 0x68, 0x13,
- 0x40, 0xc, 0xb4, 0x29, 0x0, 0x70, 0x16, 0x3,
- 0x40, 0x2e, 0x1, 0x41, 0x40, 0x8d, 0x10, 0xc,
- 0x81, 0x24, 0xc0, 0x98, 0x60, 0x64, 0x8c, 0xf,
- 0x2d, 0x40, 0xff, 0xe0, 0x66, 0x7, 0x88, 0x1e,
- 0x20, 0x7d, 0xa0, 0x19, 0x4, 0x80, 0x77, 0xc,
- 0xc, 0xd0, 0xc0, 0x68, 0x2b, 0x0, 0x71, 0x14,
- 0x8, 0xc0, 0x6, 0x81, 0x34, 0x27, 0xec, 0x45,
- 0x20, 0xe, 0x3, 0x2c, 0x40, 0x58, 0x40, 0x96,
- 0x40, 0x16, 0x3, 0xc7, 0x40, 0xf, 0x7f, 0x52,
- 0xd, 0xa0, 0x3f, 0x9f, 0xa8, 0x81, 0x17, 0x72,
- 0x3, 0x80,
-
- /* U+F070 "" */
- 0x5, 0x1, 0xff, 0xcc, 0xd6, 0x80, 0xff, 0xe6,
- 0xac, 0x40, 0xff, 0xe4, 0xf2, 0xe, 0x40, 0x14,
- 0xdf, 0xda, 0x10, 0x3f, 0xd9, 0x80, 0xb5, 0xeb,
- 0x20, 0x45, 0xec, 0x40, 0x7f, 0x4a, 0x1, 0x0,
- 0x5b, 0xfa, 0x90, 0x6d, 0x1, 0xfc, 0xb1, 0x2,
- 0x84, 0x10, 0xb2, 0x0, 0xb0, 0x1f, 0xc7, 0x30,
- 0x19, 0xb6, 0xec, 0x52, 0x0, 0xe0, 0x3d, 0xe0,
- 0x9, 0x0, 0x24, 0x0, 0x8c, 0x50, 0x23, 0x40,
- 0xd4, 0x3a, 0x1, 0xe2, 0x7, 0x50, 0xc0, 0xc9,
- 0x0, 0x90, 0x5, 0xc8, 0x39, 0x1, 0x88, 0x1f,
- 0x60, 0x26, 0x6, 0xe0, 0x56, 0x1, 0xc4, 0xe,
- 0xc0, 0x50, 0xc, 0x40, 0xcf, 0x1, 0x6a, 0x6,
- 0x68, 0xd, 0x80, 0xd0, 0xc, 0x79, 0x5, 0x81,
- 0x18, 0x7, 0x1a, 0x4, 0xd0, 0x1d, 0x98, 0x18,
- 0xe0, 0x3e, 0x58, 0xa, 0xd1, 0x3, 0x4a, 0x7,
- 0xff, 0x4, 0xf6, 0x1, 0x6f, 0xd8, 0x2, 0xc4,
- 0x1e, 0x80, 0xfe, 0x9e, 0x22, 0x0, 0xd0, 0x7,
- 0x30, 0x15, 0x81, 0xfe, 0x77, 0x7f, 0x50, 0x34,
- 0x80, 0x12, 0x0, 0xff, 0xe4, 0xbc, 0x40, 0xff,
- 0xe6, 0x1d, 0x20,
-
- /* U+F071 "" */
- 0x3, 0xfe, 0xb9, 0x1, 0xff, 0xc8, 0xa8, 0xd2,
- 0x7, 0xff, 0x18, 0xa0, 0x28, 0x7, 0xff, 0x1b,
- 0x81, 0x92, 0x1, 0xff, 0xc4, 0x44, 0xe, 0x80,
- 0x7f, 0xf1, 0x20, 0x1e, 0x2c, 0xf, 0xfe, 0x13,
- 0x20, 0x7d, 0x0, 0xff, 0xe1, 0x40, 0xf, 0xf8,
- 0xa, 0x1, 0xff, 0xc0, 0x80, 0x7f, 0x98, 0x1f,
- 0xf1, 0x60, 0x44, 0x1, 0x3, 0x50, 0x3f, 0xd0,
- 0xf, 0xfe, 0x2, 0x20, 0x7e, 0x48, 0x6, 0x60,
- 0x18, 0x1d, 0xc0, 0xfd, 0x0, 0xff, 0xe1, 0x14,
- 0x7, 0x99, 0x3, 0x8e, 0xca, 0x7, 0xa0, 0x1e,
- 0x80, 0x7d, 0x32, 0x3, 0xc5, 0x81, 0xa0, 0x1f,
- 0x34, 0x28, 0x1f, 0x40, 0x33, 0x3, 0xff, 0x8f,
- 0x0, 0x50, 0x3f, 0x32, 0x28, 0x1f, 0x99, 0x8,
- 0xf, 0xed, 0xd0, 0x1f, 0xc8, 0x10, 0x3f, 0xf9,
- 0x24, 0x68, 0xdf, 0xff, 0x1e, 0xa0,
-
- /* U+F074 "" */
- 0x3, 0xff, 0x86, 0x90, 0xf, 0xfe, 0x35, 0xa4,
- 0x7, 0xff, 0x1e, 0xa1, 0xff, 0x30, 0x3d, 0xbf,
- 0x1, 0x54, 0x7, 0x46, 0x6, 0xc4, 0xf, 0x50,
- 0x3d, 0x10, 0xa, 0x40, 0xfa, 0x7d, 0xa2, 0x3,
- 0x8, 0x80, 0x4c, 0x5, 0x18, 0x26, 0xe1, 0x46,
- 0xc0, 0x1b, 0x10, 0x11, 0x81, 0xc7, 0x57, 0x0,
- 0x28, 0x2, 0x56, 0x7, 0xc5, 0x40, 0xa, 0x81,
- 0x34, 0x7, 0xe3, 0x40, 0x1a, 0x40, 0x9b, 0x1,
- 0xf1, 0xc0, 0x58, 0xe8, 0x2, 0x43, 0x2, 0x26,
- 0xe0, 0x58, 0x60, 0xd8, 0x80, 0x8c, 0x7d, 0xa2,
- 0x3, 0x10, 0x40, 0x4c, 0x5, 0x18, 0x1e, 0xa4,
- 0x6, 0x20, 0x7d, 0x0, 0xe8, 0x80, 0xd8, 0x81,
- 0xeb, 0xff, 0x30, 0x3d, 0xbf, 0x1, 0x54, 0x7,
- 0xff, 0x16, 0xa0, 0x3f, 0xf8, 0x96, 0x90, 0x0,
-
- /* U+F077 "" */
- 0x3, 0xe3, 0x48, 0x1f, 0xfc, 0x23, 0x96, 0x20,
- 0x7f, 0xf0, 0xe, 0x2, 0xc4, 0xf, 0xf1, 0xc0,
- 0x76, 0x20, 0x7e, 0x38, 0x9, 0x81, 0x62, 0x7,
- 0x8e, 0x2, 0x91, 0x40, 0xb1, 0x3, 0x1c, 0x5,
- 0x18, 0x54, 0xb, 0x10, 0x7, 0x1, 0x46, 0x4,
- 0xa8, 0x16, 0x23, 0x81, 0x46, 0x7, 0x2a, 0x5,
- 0x83, 0x1, 0x18, 0x1f, 0x2a, 0x1, 0xa, 0xeb,
- 0x3, 0xf9, 0x57, 0x40,
-
- /* U+F078 "" */
- 0x11, 0x1, 0xff, 0x28, 0x2, 0xba, 0xc0, 0xfe,
- 0x55, 0xd0, 0xc0, 0x46, 0x7, 0xca, 0x80, 0x43,
- 0x81, 0x46, 0x7, 0x2a, 0x5, 0x81, 0xc0, 0x51,
- 0x81, 0x2a, 0x5, 0x88, 0x3, 0x80, 0xa3, 0xa,
- 0x81, 0x62, 0x6, 0x38, 0xa, 0x45, 0x2, 0xc4,
- 0xf, 0x1c, 0x4, 0xc0, 0xb1, 0x3, 0xf1, 0xc0,
- 0x76, 0x20, 0x7f, 0x8e, 0x2, 0xc4, 0xf, 0xfe,
- 0x1, 0xcf, 0x10, 0x3e,
-
- /* U+F079 "" */
- 0x3, 0x3c, 0x40, 0xff, 0xe5, 0x48, 0x38, 0x80,
- 0x4e, 0x4f, 0xcc, 0xf, 0xa3, 0x2, 0xc4, 0x48,
- 0x6f, 0xf4, 0x60, 0x74, 0x60, 0x76, 0x30, 0xf,
- 0xf7, 0x3, 0x36, 0x4, 0x1, 0x1, 0x97, 0xff,
- 0x80, 0xfe, 0x38, 0x2, 0x80, 0x81, 0xff, 0xc4,
- 0x7b, 0x0, 0xce, 0xe0, 0x3f, 0xf8, 0xa4, 0xf,
- 0x20, 0x3f, 0xfd, 0xf9, 0x81, 0xd9, 0x81, 0xff,
- 0xc4, 0x86, 0x30, 0x2c, 0x60, 0x1f, 0x29, 0x3c,
- 0xcd, 0x1, 0x0, 0x32, 0x18, 0x1f, 0x16, 0xfd,
- 0x30, 0xc0, 0x79, 0xc0, 0x38, 0x81, 0xff, 0x1c,
- 0x6, 0x70, 0xf, 0x6f, 0xff, 0xc4, 0x1c, 0x1,
- 0xc0, 0x3f, 0xf9, 0x27, 0xd8, 0x6,
-
- /* U+F07B "" */
- 0x5f, 0xfd, 0x0, 0xff, 0xa8, 0x1f, 0x38, 0x7,
- 0xff, 0x1d, 0xd9, 0x3e, 0x60, 0x7f, 0xc9, 0xbf,
- 0xa5, 0x3, 0xff, 0x8e, 0x80, 0xff, 0xff, 0x81,
- 0xff, 0xff, 0x3, 0xff, 0xa5, 0x40, 0xff, 0xe3,
- 0x50,
-
- /* U+F093 "" */
- 0x3, 0xf8, 0x81, 0xff, 0xc6, 0xba, 0x81, 0xff,
- 0xc4, 0xa8, 0x2a, 0x7, 0xff, 0xa, 0xa0, 0x25,
- 0x40, 0xff, 0xe0, 0x54, 0x7, 0x2a, 0x7, 0xfa,
- 0xa0, 0x3e, 0x54, 0xf, 0xd5, 0x1, 0xfc, 0xa8,
- 0x1f, 0x20, 0x3f, 0xe4, 0x7, 0xdf, 0x68, 0xe,
- 0xda, 0xe0, 0x7e, 0x26, 0x3, 0x89, 0x80, 0xff,
- 0xff, 0x81, 0xfe, 0x72, 0x71, 0x3, 0xc6, 0x4e,
- 0x71, 0xbe, 0xba, 0x4b, 0xa, 0xdf, 0x40, 0x3c,
- 0xfe, 0xd4, 0xcc, 0xf, 0xfe, 0x9, 0x4b, 0x10,
- 0x3f, 0xf9, 0x7, 0xa, 0xc0, 0x10, 0x3f, 0xf8,
- 0x7, 0xa, 0xc1, 0xdf, 0xff, 0xf1, 0xb0,
-
- /* U+F095 "" */
- 0x3, 0xff, 0x86, 0x99, 0x3, 0xff, 0x8d, 0x66,
- 0xf5, 0x1, 0xff, 0xc2, 0x60, 0x65, 0x40, 0xff,
- 0xe1, 0x40, 0x3f, 0xf8, 0xe8, 0xf, 0x10, 0x3f,
- 0xf8, 0x3c, 0xf, 0x30, 0x3f, 0xf8, 0x38, 0xf,
- 0x10, 0x3f, 0xf8, 0x2e, 0x81, 0xd8, 0xf, 0xfe,
- 0x12, 0xa0, 0x64, 0x7, 0xff, 0xf, 0x81, 0x30,
- 0x3f, 0xf8, 0x69, 0x0, 0xa8, 0x1f, 0xfc, 0x23,
- 0x40, 0x99, 0x3, 0xe2, 0x7, 0xb8, 0x11, 0x80,
- 0x71, 0x9f, 0x30, 0x23, 0xc8, 0x17, 0x3, 0x2b,
- 0x98, 0x8, 0x83, 0xc0, 0x6a, 0x40, 0xd5, 0x1,
- 0xd7, 0xc0, 0x35, 0x40, 0x71, 0x3, 0xff, 0x81,
- 0x50, 0x1e, 0x40, 0x7f, 0x97, 0x40, 0x7d, 0x80,
- 0xfc, 0x6d, 0x1, 0xfc, 0x80, 0xf2, 0xb9, 0x1,
- 0xff, 0x59, 0x17, 0x7a, 0x80, 0xff, 0x80,
-
- /* U+F0AF "" */
- 0x6, 0xc0, 0x3f, 0xf8, 0x72, 0xc8, 0x0, 0x77,
- 0xff, 0x20, 0x22, 0x60, 0x14, 0x9f, 0x84, 0x19,
- 0x6c, 0x50, 0x11, 0xb7, 0x80, 0xfc, 0x40, 0xff,
- 0xf2, 0x7b, 0x78, 0xf, 0x2a, 0x40, 0x8a, 0x58,
- 0xf, 0xb2, 0x3, 0xff, 0x89, 0x39, 0x3, 0xff,
- 0xfe, 0x36, 0xf2, 0x1b, 0x78, 0x18, 0x9, 0xf0,
- 0x2, 0x7c, 0x0, 0x80,
-
- /* U+F0C4 "" */
- 0x0, 0x9b, 0x1, 0xff, 0xc2, 0xb5, 0x23, 0xa0,
- 0x3c, 0xf6, 0x31, 0x10, 0x1a, 0x81, 0xd6, 0x12,
- 0x89, 0x83, 0xe8, 0x6, 0x5, 0x50, 0x13, 0x40,
- 0x10, 0x40, 0x75, 0x40, 0x4e, 0x2, 0x1c, 0xc0,
- 0x8, 0xa8, 0x9, 0xc0, 0x1c, 0x3, 0x20, 0x2d,
- 0x20, 0x27, 0x0, 0x8e, 0x20, 0x72, 0x2, 0x70,
- 0xe, 0x3b, 0xe0, 0x3c, 0xe0, 0x1f, 0xc5, 0x1,
- 0xd4, 0xf, 0xc9, 0xd4, 0x7, 0x62, 0x7, 0xad,
- 0x44, 0x7, 0xd8, 0x81, 0xa2, 0x3, 0x9d, 0x3,
- 0x62, 0x4, 0xc1, 0xf4, 0x7, 0x58, 0xd, 0x88,
- 0x19, 0x4, 0x6, 0x38, 0xd, 0x88, 0x21, 0xcc,
- 0x0, 0x80, 0x38, 0xd, 0x8f, 0x0, 0xc8, 0x48,
- 0x4, 0x70, 0x1c, 0x71, 0x0, 0xe8, 0x1c, 0x7d,
- 0xae, 0x40,
-
- /* U+F0C5 "" */
- 0x3, 0xa6, 0xde, 0x62, 0x81, 0xf9, 0x93, 0xee,
- 0x16, 0x3, 0xff, 0x8a, 0x70, 0x1f, 0xfc, 0x53,
- 0x66, 0xc8, 0x7, 0xfb, 0xfa, 0xb2, 0x48, 0xf,
- 0xc9, 0x71, 0x3, 0xff, 0x80, 0x6d, 0xdc, 0xf,
- 0xff, 0xf8, 0x1f, 0xff, 0xf0, 0x3f, 0xf8, 0x64,
- 0x10, 0x3f, 0xe4, 0x6, 0x9b, 0xff, 0xfa, 0x1,
- 0x9f, 0xff, 0x40, 0x3f, 0xf8, 0xbc, 0xe, 0xad,
- 0xff, 0xa3, 0x3, 0x80,
-
- /* U+F0C7 "" */
- 0xe, 0x4f, 0xe6, 0xc0, 0x6b, 0x1b, 0xfe, 0x91,
- 0x40, 0x90, 0x1f, 0xfc, 0x5, 0x40, 0xcf, 0xff,
- 0xe0, 0xa, 0x81, 0xff, 0xc4, 0x50, 0xf, 0xfe,
- 0x23, 0x3, 0xff, 0xb0, 0xa4, 0xfe, 0x3, 0xe2,
- 0xdf, 0xf0, 0x1f, 0xfd, 0x1b, 0xe8, 0x1f, 0xfc,
- 0x18, 0x82, 0x80, 0x7f, 0xf0, 0x8, 0x11, 0x3,
- 0xff, 0x81, 0xc0, 0xb8, 0x1f, 0xfc, 0x5, 0xa6,
- 0x40, 0x7f, 0xf0, 0x4b, 0x20, 0x7d, 0x40, 0xff,
- 0xe1, 0xd0,
-
- /* U+F0C9 "" */
- 0xff, 0xff, 0x8a, 0xc0, 0xff, 0xe2, 0xf4, 0x4f,
- 0xff, 0x13, 0x5d, 0xbf, 0xf8, 0x88, 0xf, 0xfe,
- 0xc5, 0xdb, 0xff, 0x88, 0x90, 0x9f, 0xfe, 0x26,
- 0x3, 0xff, 0x8b, 0xff, 0xff, 0x19, 0x81, 0xff,
- 0xd8, 0xbb, 0x7f, 0xf1, 0x12, 0x13, 0xff, 0xc4,
- 0xc0, 0x7f, 0xf1, 0x78,
-
- /* U+F0E0 "" */
- 0x5f, 0xff, 0xf1, 0x95, 0x3, 0xff, 0x8d, 0x40,
- 0xff, 0xe4, 0x40, 0x3f, 0xf8, 0xd1, 0xe0, 0x3f,
- 0xf8, 0x99, 0xf1, 0xd0, 0x1f, 0xfc, 0x5, 0xc7,
- 0x19, 0xd8, 0x7, 0xfa, 0x57, 0x80, 0xa5, 0x78,
- 0x81, 0xe3, 0x9d, 0x80, 0x72, 0xef, 0x20, 0x32,
- 0xcf, 0xa0, 0x3f, 0x59, 0x68, 0x95, 0xa9, 0x40,
- 0xff, 0x9e, 0x7b, 0x1e, 0x60, 0x7f, 0xf0, 0x4e,
- 0xd8, 0x81, 0xff, 0xc4, 0x24, 0x7, 0xff, 0x46,
- 0x81, 0xff, 0xc6, 0xa0,
-
- /* U+F0E7 "" */
- 0x2, 0x29, 0x62, 0x7, 0xd7, 0x5b, 0xb5, 0x3,
- 0xc8, 0xf, 0x10, 0x3f, 0xf8, 0x34, 0xe, 0x20,
- 0x7c, 0x40, 0xe6, 0x7, 0x98, 0x1e, 0x20, 0x7a,
- 0x81, 0xee, 0x7, 0xb7, 0xf9, 0x2, 0x7, 0xff,
- 0x5, 0x81, 0xfe, 0x28, 0x10, 0x3f, 0xdc, 0x1,
- 0x3, 0xf9, 0x90, 0x1b, 0xfc, 0xc0, 0xd0, 0xf,
- 0xc8, 0xa, 0x1, 0xfc, 0x40, 0x16, 0x7, 0xe2,
- 0x5, 0x0, 0xfe, 0x40, 0x12, 0x1, 0xfd, 0x80,
- 0x40, 0x3f, 0xc8, 0x32, 0x7, 0xf1, 0x1, 0x0,
- 0xff, 0x15, 0x40, 0xf8,
-
- /* U+F0EA "" */
- 0x3, 0x9c, 0x20, 0x7f, 0x8a, 0x56, 0x8f, 0x25,
- 0x10, 0x3d, 0xad, 0x8b, 0xa2, 0xdb, 0x10, 0x3f,
- 0xf8, 0xac, 0xf, 0xf3, 0xa0, 0x7f, 0xf1, 0x53,
- 0x7e, 0x3, 0xfd, 0x2c, 0x9c, 0x40, 0xff, 0x3d,
- 0xff, 0x21, 0xc8, 0x1f, 0x88, 0x1f, 0xb1, 0x3,
- 0xff, 0x8b, 0x88, 0x1f, 0xfc, 0x22, 0x6a, 0x7,
- 0xff, 0x0, 0x8d, 0xa8, 0x7, 0xff, 0x2, 0x7f,
- 0xb0, 0x1f, 0xfe, 0xa2, 0x7, 0xff, 0x17, 0x7f,
- 0x80, 0xff, 0xf2, 0x30, 0x3c, 0xc9, 0xfe, 0x5c,
-
- /* U+F0F3 "" */
- 0x3, 0xf1, 0x3, 0xff, 0x88, 0xb6, 0x1, 0xff,
- 0xc3, 0xc0, 0x81, 0xff, 0xc1, 0x7d, 0x80, 0xf4,
- 0x81, 0xfd, 0x60, 0x1c, 0xb1, 0x3, 0xe6, 0x80,
- 0xfd, 0x80, 0xfa, 0x1, 0xfe, 0x60, 0x72, 0x3,
- 0xfe, 0xa0, 0x71, 0x3, 0xfe, 0x20, 0x77, 0x3,
- 0xff, 0xae, 0x80, 0xff, 0xe0, 0x20, 0x31, 0x3,
- 0xff, 0x81, 0x80, 0xa0, 0x1f, 0xfc, 0x16, 0x1,
- 0x30, 0x3f, 0xf8, 0x58, 0x50, 0x3f, 0xf8, 0x65,
- 0xa0, 0x3f, 0xf8, 0x8a, 0xff, 0xff, 0xc4, 0x20,
- 0x7a, 0xff, 0x88, 0x1f, 0xfc, 0x8, 0x4, 0x88,
- 0x1f, 0xfc, 0x3, 0xa5, 0xa0, 0x3e,
-
- /* U+F11C "" */
- 0x5f, 0xff, 0xf2, 0x28, 0xa0, 0x7f, 0xf2, 0x13,
- 0x0, 0x5b, 0x4, 0xd0, 0x6c, 0x83, 0x60, 0x9b,
- 0x0, 0xe0, 0x14, 0x81, 0x24, 0x24, 0x84, 0x81,
- 0x24, 0x7, 0xff, 0x41, 0xfe, 0x1b, 0xe1, 0xfb,
- 0xf, 0xc3, 0x7e, 0x3, 0xe7, 0xa8, 0xba, 0xb,
- 0x92, 0x6c, 0x3, 0xfb, 0x96, 0x19, 0x20, 0xc9,
- 0xe0, 0x3f, 0xb9, 0x61, 0x92, 0xc, 0x9e, 0x3,
- 0xf9, 0xea, 0x2e, 0x82, 0xe4, 0x9b, 0x0, 0xf9,
- 0xfe, 0x1b, 0xff, 0xe1, 0xbf, 0x1, 0xff, 0xd0,
- 0x52, 0x4, 0x9f, 0xe1, 0x24, 0x7, 0x16, 0xc1,
- 0x37, 0xfc, 0x13, 0x60, 0x1e, 0x81, 0xff, 0xc8,
- 0x4c,
-
- /* U+F124 "" */
- 0x3, 0xff, 0x8c, 0x98, 0x1f, 0xfc, 0x67, 0xec,
- 0xa0, 0x7f, 0xf0, 0xe7, 0x80, 0x48, 0xf, 0xfe,
- 0x1, 0xbd, 0x81, 0xc8, 0xf, 0xf2, 0xb9, 0x1,
- 0xf4, 0x3, 0xf2, 0xd5, 0x1, 0xf9, 0x10, 0x3c,
- 0xf5, 0x20, 0x7f, 0xb8, 0x1d, 0x3c, 0x20, 0x7f,
- 0xc5, 0x1, 0x2e, 0xc0, 0xff, 0xe1, 0x40, 0x35,
- 0x3, 0xff, 0x88, 0x80, 0xc4, 0xf, 0xfe, 0x1c,
- 0x3, 0xba, 0x27, 0xe0, 0x3e, 0x60, 0x71, 0xbb,
- 0x7a, 0x1, 0xe6, 0x7, 0xff, 0x26, 0x1, 0xff,
- 0xc8, 0x60, 0x7f, 0xf2, 0x68, 0x1f, 0xfc, 0x84,
- 0x40, 0xff, 0xe4, 0x40, 0x3f, 0xf8, 0x8c, 0x8,
- 0x90, 0x1f, 0xfc, 0x42, 0x5, 0x0, 0xff, 0xe3,
- 0x69, 0x90, 0x1f, 0x80,
-
- /* U+F154 "" */
- 0x3, 0x1b, 0xaa, 0x3, 0xdb, 0x83, 0x90, 0x55,
- 0x1, 0xfa, 0xb, 0xb0, 0x40, 0x3f, 0x30, 0x81,
- 0x30, 0x1f, 0x52, 0x40, 0x7f, 0xf0, 0x11, 0xe0,
- 0x7f, 0xf0, 0x3e, 0x20, 0x44, 0xf, 0xfe, 0x1,
- 0xe0, 0x3a, 0x2, 0xb0, 0xa, 0x60, 0x35, 0x80,
- 0x1b, 0x3, 0x98, 0x1e, 0x78, 0x81, 0x1f, 0xb7,
- 0xee, 0x7, 0x12, 0x5b, 0x68, 0x4c, 0x7, 0xff,
- 0x9c, 0x81, 0x88, 0x1f, 0xc9, 0x92, 0x50, 0x8,
-
- /* U+F15B "" */
- 0xdf, 0xfd, 0x87, 0x20, 0x44, 0xf, 0xf6, 0x20,
- 0x7f, 0xf0, 0xb1, 0x3, 0xff, 0x85, 0x88, 0x1f,
- 0xfc, 0x2c, 0x7, 0xe2, 0x3f, 0xe0, 0x3f, 0xbf,
- 0xf0, 0x1f, 0xff, 0xf0, 0x3f, 0xff, 0xe0, 0x7f,
- 0xf4, 0x99, 0x3f, 0xfc, 0x16,
-
- /* U+F1DB "" */
- 0x0, 0xff, 0xff, 0xe1, 0x40, 0x3c, 0x97, 0x0,
- 0x4b, 0x80, 0xfd, 0x2d, 0xc4, 0xad, 0xd0, 0xf,
- 0xff, 0xf8, 0x1f, 0xfc, 0x19, 0x6e, 0x25, 0x6e,
- 0x80, 0x7e, 0x4b, 0x80, 0x25, 0xc0, 0x7e, 0xdf,
- 0xe2, 0x5f, 0xec, 0x7, 0xff, 0xfc, 0xf, 0xfe,
- 0x89, 0xf0, 0x6f, 0xf1, 0x2f, 0xf6, 0xf, 0x90,
- 0x3f, 0xf9, 0x5, 0xbf, 0xfe, 0x31,
-
- /* U+F1E1 "" */
- 0x3, 0xe4, 0xc0, 0xff, 0xe1, 0x6b, 0x30, 0x1f,
- 0x6d, 0xdc, 0x80, 0x3f, 0x6e, 0x84, 0xf0, 0x1e,
- 0x27, 0xde, 0xf, 0xe0, 0x37, 0xf0, 0xf, 0x40,
- 0xf7, 0x1, 0xc0, 0xff, 0xe1, 0x12, 0x3, 0xf9,
- 0x50, 0x34, 0x80, 0x35, 0xa0, 0x27, 0x0, 0xdb,
- 0x0, 0xdb, 0x0, 0xa9, 0x80, 0x13, 0x64, 0x1,
- 0xbc, 0x10, 0x6, 0x3, 0x80, 0xe0, 0x28, 0xa,
- 0x30, 0x11, 0x8, 0x2, 0x4, 0x80, 0x12, 0x40,
- 0x49, 0x0, 0xc9, 0x0, 0xc8, 0x81, 0x62, 0x6,
- 0x3c, 0xd, 0xc0,
-
- /* U+F1EB "" */
- 0x3, 0xfc, 0x49, 0x12, 0x3, 0xff, 0x88, 0x66,
- 0xfb, 0x2e, 0xcf, 0xa1, 0x3, 0xfc, 0xf6, 0x32,
- 0x7, 0xc5, 0xec, 0x60, 0x78, 0xe8, 0x40, 0xff,
- 0xe0, 0x99, 0x88, 0x14, 0xc4, 0x9, 0x4d, 0xff,
- 0x68, 0x80, 0x8e, 0x82, 0xb0, 0x25, 0xab, 0x20,
- 0x71, 0x77, 0x20, 0x27, 0x40, 0x8e, 0xa4, 0xf,
- 0xf8, 0xdc, 0x40, 0xaa, 0x4c, 0x40, 0x94, 0xdf,
- 0xda, 0x20, 0x23, 0x92, 0x51, 0x68, 0x9, 0xea,
- 0xc8, 0x11, 0x77, 0x30, 0x2b, 0x40, 0x7a, 0xc2,
- 0x7, 0xf1, 0x94, 0xf, 0xe8, 0x80, 0x95, 0xda,
- 0xa8, 0x9, 0x40, 0x3f, 0x42, 0x17, 0xa8, 0x99,
- 0x5e, 0x81, 0x80, 0x7f, 0x6b, 0x40, 0x7f, 0x5a,
- 0xc0, 0x7f, 0xc8, 0x8, 0xdf, 0x48, 0x12, 0x3,
- 0xff, 0x89, 0xd0, 0x50, 0xf, 0xfe, 0x41, 0x2,
- 0x40, 0x7f, 0xf2, 0x10, 0x12, 0x3, 0xff, 0x91,
- 0x10, 0x30, 0xf, 0xf0,
-
- /* U+F1F3 "" */
- 0xb7, 0xfd, 0x21, 0x1, 0xe4, 0xbf, 0xcd, 0xaf,
- 0x80, 0x71, 0xff, 0xfb, 0x30, 0xf0, 0x1f, 0xfc,
- 0x23, 0x31, 0x2c, 0x6, 0x7b, 0xe6, 0x7, 0x8e,
- 0x25, 0x40, 0x18, 0x41, 0x94, 0xd, 0xbf, 0x10,
- 0x88, 0x5, 0xfb, 0x14, 0xc0, 0x99, 0x30, 0xa,
- 0x2, 0x80, 0x3c, 0x50, 0x2b, 0xb6, 0x4, 0xf,
- 0x10, 0x3f, 0x88, 0x6c, 0x18, 0x14, 0x7, 0xff,
- 0xc0, 0x21, 0x9a, 0xe6, 0xad, 0xc8, 0xd, 0x60,
- 0xcc, 0xa1, 0x2a, 0x5a, 0xa0, 0x72, 0x40,
-
- /* U+F21C "" */
- 0x27, 0xff, 0x87, 0xb7, 0xff, 0xc, 0xf, 0xfe,
- 0x96, 0x82, 0x6b, 0x7b, 0x41, 0x31, 0x20, 0x7d,
- 0xbd, 0xc8, 0x24, 0x6, 0x93, 0xe0, 0x3f, 0x7b,
- 0x7b, 0x81, 0xf9, 0x93, 0xcc, 0xf, 0xdf, 0x6e,
- 0xe0, 0x7e, 0xfb, 0x77, 0x3, 0xf4, 0x9f, 0x1,
- 0xfb, 0xdb, 0xdc, 0xf, 0xcc, 0x9e, 0x60, 0x60,
-
- /* U+F21D "" */
- 0x27, 0xff, 0x86, 0x3, 0x6f, 0xfe, 0x18, 0x1f,
- 0xfd, 0x8d, 0x4, 0xb7, 0xe8, 0x26, 0x0, 0x48,
- 0x19, 0x6f, 0x42, 0x9, 0x44, 0x6, 0x96, 0xf4,
- 0x3, 0x3e, 0x6, 0xf2, 0x77, 0x3, 0xfc, 0xc9,
- 0xe6, 0x7, 0xfb, 0x7f, 0xd8, 0xc, 0x48, 0xf,
- 0xfe, 0x1e, 0x80, 0x7f, 0xf0, 0xeb, 0x3, 0xff,
- 0x86, 0xb0, 0x1f, 0xfc, 0x3f, 0x42, 0xc8, 0xf,
- 0x96, 0x40, 0x40,
-
- /* U+F21E "" */
- 0x27, 0xff, 0x87, 0xb7, 0xff, 0xc, 0xf, 0xfe,
- 0x96, 0x82, 0x6d, 0xf4, 0x13, 0x12, 0x7, 0xed,
- 0xdc, 0x82, 0x40, 0x66, 0x4f, 0x30, 0x3f, 0x5d,
- 0xba, 0x81, 0xff, 0xff, 0x3, 0xff, 0x90, 0xb2,
- 0x3, 0xe5, 0x90,
-
- /* U+F240 "" */
- 0xe, 0x4f, 0xfe, 0x3b, 0x40, 0x2c, 0x6f, 0xff,
- 0x8f, 0x2b, 0x8, 0xf, 0xfe, 0x56, 0x2, 0x7f,
- 0xff, 0xf1, 0x88, 0x58, 0x9, 0x7f, 0xff, 0xc4,
- 0x3, 0x10, 0x3f, 0xf9, 0x34, 0x81, 0xff, 0xcb,
- 0x68, 0xf, 0xff, 0x26, 0x60, 0x72, 0xff, 0xff,
- 0x88, 0x7, 0xca, 0x4f, 0xfe, 0x31, 0x1, 0x40,
- 0x16, 0xff, 0xf8, 0xc0, 0x12, 0x50, 0x3f, 0xf9,
- 0x26, 0x0,
-
- /* U+F241 "" */
- 0xe, 0x4f, 0xfe, 0x3b, 0x40, 0x2c, 0x6f, 0xff,
- 0x8f, 0x2b, 0x8, 0xf, 0xfe, 0x56, 0x2, 0x7f,
- 0xff, 0xf1, 0x88, 0x58, 0xd, 0xff, 0xff, 0x2,
- 0x1, 0xf1, 0x3, 0xff, 0x93, 0x48, 0x1f, 0xfc,
- 0xb6, 0x80, 0xff, 0xf2, 0x66, 0x7, 0xbf, 0xff,
- 0xe0, 0x40, 0x3f, 0xca, 0x4f, 0xfe, 0x31, 0x1,
- 0x40, 0x16, 0xff, 0xf8, 0xc0, 0x12, 0x50, 0x3f,
- 0xf9, 0x26, 0x0,
-
- /* U+F242 "" */
- 0xe, 0x4f, 0xfe, 0x3b, 0x40, 0x2c, 0x6f, 0xff,
- 0x8f, 0x2b, 0x8, 0xf, 0xfe, 0x56, 0x2, 0x7f,
- 0xff, 0xf1, 0x88, 0x58, 0xd, 0xff, 0xec, 0x7,
- 0xfc, 0x40, 0xff, 0xe4, 0xd2, 0x7, 0xff, 0x2d,
- 0xa0, 0x3f, 0xfc, 0x99, 0x81, 0xef, 0xff, 0x60,
- 0x3f, 0xf8, 0x4a, 0x4f, 0xfe, 0x31, 0x1, 0x40,
- 0x16, 0xff, 0xf8, 0xc0, 0x12, 0x50, 0x3f, 0xf9,
- 0x26, 0x0,
-
- /* U+F243 "" */
- 0xe, 0x4f, 0xfe, 0x3b, 0x40, 0x2c, 0x6f, 0xff,
- 0x8f, 0x2b, 0x8, 0xf, 0xfe, 0x56, 0x2, 0x7f,
- 0xff, 0xf1, 0x88, 0x58, 0xd, 0xff, 0x1, 0xff,
- 0xc3, 0x20, 0x7f, 0xf2, 0x69, 0x3, 0xff, 0x96,
- 0xd0, 0x1f, 0xfe, 0x4c, 0xc0, 0xf7, 0xfc, 0x7,
- 0xff, 0x19, 0x49, 0xff, 0xc6, 0x20, 0x28, 0x2,
- 0xdf, 0xff, 0x18, 0x2, 0x4a, 0x7, 0xff, 0x24,
- 0xc0,
-
- /* U+F244 "" */
- 0xe, 0x4f, 0xfe, 0x3b, 0x40, 0x2c, 0x6f, 0xff,
- 0x8f, 0x2b, 0x8, 0xf, 0xfe, 0x56, 0x2, 0x7f,
- 0xff, 0xf1, 0x88, 0x58, 0xf, 0xfe, 0x61, 0x3,
- 0xff, 0x93, 0x48, 0x1f, 0xfc, 0xb6, 0x80, 0xff,
- 0xf2, 0x66, 0x7, 0xff, 0x45, 0x49, 0xff, 0xc6,
- 0x20, 0x28, 0x2, 0xdf, 0xff, 0x18, 0x2, 0x4a,
- 0x7, 0xff, 0x24, 0xc0,
-
- /* U+F287 "" */
- 0x3, 0xff, 0xb7, 0xbf, 0x10, 0x3f, 0xf8, 0xef,
- 0x61, 0x1, 0x40, 0xff, 0xe3, 0x48, 0x6c, 0x7,
- 0xff, 0x24, 0xb9, 0x69, 0x3, 0x0, 0xff, 0x89,
- 0x1, 0xa8, 0x60, 0x2f, 0xc0, 0x7f, 0x8e, 0xd4,
- 0x2, 0x70, 0xf, 0xfb, 0x10, 0x2e, 0x40, 0x36,
- 0x38, 0x22, 0x7f, 0xc8, 0xe8, 0x0, 0x81, 0xa6,
- 0x23, 0x6f, 0xfa, 0x80, 0x78, 0x10, 0x34, 0xda,
- 0xa0, 0xed, 0xfa, 0x80, 0x58, 0x72, 0x1, 0xb1,
- 0x32, 0xa4, 0x13, 0xf2, 0x3a, 0x80, 0x3b, 0x50,
- 0xe, 0x46, 0x1, 0xfb, 0x10, 0x38, 0x90, 0x1f,
- 0x54, 0x45, 0xfe, 0x60, 0x7f, 0xf1, 0x59, 0xd5,
- 0x1, 0x70, 0x3f, 0xf8, 0xd9, 0x81, 0xff, 0xcd,
- 0x95, 0x1, 0x70, 0x3f, 0xf9, 0x37, 0x69, 0x81,
+ 0xf, 0x3a, 0x1f, 0xfc, 0x8, 0x83, 0xfc, 0xe1,
+ 0x68, 0x7c, 0xc1, 0xd2, 0x1c, 0xc1, 0xf4, 0x86,
+ 0x83, 0xfa, 0xf, 0xfe, 0x32, 0x1f, 0xf2, 0x1f,
+ 0xff, 0xf0, 0x41, 0xff, 0x46, 0x1f, 0xfc, 0x1f,
+ 0xff, 0xe2, 0x7, 0xbe, 0xf, 0xfe, 0x4, 0x41,
0xe0,
- /* U+F293 "" */
- 0x3, 0x3b, 0xfd, 0xa1, 0x3, 0x8f, 0x88, 0x10,
- 0x5e, 0x60, 0x47, 0x1, 0xb9, 0x2, 0x88, 0x7,
- 0x3, 0x8f, 0x3, 0x40, 0x48, 0xf, 0x1c, 0x4,
- 0x49, 0x1, 0x10, 0x26, 0x30, 0x15, 0xc0, 0x2e,
- 0x20, 0x3e, 0x34, 0x1, 0x60, 0x29, 0xc4, 0x78,
- 0x20, 0x6, 0x40, 0xb1, 0xc1, 0xb5, 0x20, 0x8,
- 0x1d, 0x88, 0x8, 0x80, 0xff, 0x30, 0x8, 0xf,
- 0xf5, 0x40, 0x31, 0x3, 0xf5, 0x50, 0x33, 0x88,
- 0x12, 0x1, 0x14, 0x63, 0xe1, 0xc0, 0x12, 0x1,
- 0x63, 0x1, 0xe8, 0xe0, 0x16, 0x0, 0x58, 0x13,
- 0x58, 0x80, 0xc8, 0x81, 0xf6, 0x20, 0x48, 0x70,
- 0x38, 0xe2, 0x5, 0x0, 0x1a, 0x6, 0xe4, 0x9,
- 0xb0, 0x12, 0xf0, 0x82, 0xb, 0xb0, 0x0,
+ /* U+E0AC "" */
+ 0xff, 0xfe, 0x22, 0x1f, 0xfc, 0x4c, 0x3f, 0xf8,
+ 0xba, 0x1f, 0xfc, 0x1a, 0x18, 0x7f, 0xf0, 0x50,
+ 0xff, 0xfd, 0x21, 0xff, 0xc5, 0xfe, 0x4f, 0xf0,
+ 0x7f, 0xf3, 0x54, 0x61, 0xff, 0xc1, 0x84, 0x83,
+ 0xff, 0x82, 0xc2, 0x1f, 0xfc, 0x17, 0x10, 0xff,
+ 0xe0, 0x60, 0x60, 0xf0,
- /* U+F2A1 "" */
- 0x0, 0x6d, 0xc4, 0xc, 0xd2, 0xcc, 0x5, 0xf4,
- 0xd, 0x7d, 0x40, 0x9f, 0x4, 0xe, 0xde, 0x20,
- 0x7f, 0xff, 0x57, 0xf9, 0x1, 0xff, 0xc2, 0x56,
- 0xe4, 0x4, 0x74, 0x9b, 0x10, 0x81, 0x3e, 0x8,
+ /* U+E0AF "" */
+ 0xe, 0x50, 0x7f, 0x72, 0x1f, 0xe9, 0xb, 0xf,
+ 0x48, 0x58, 0x6c, 0x93, 0x34, 0x3b, 0x6, 0x49,
+ 0x8c, 0x16, 0x19, 0x83, 0xa0, 0x30, 0x7a, 0x2,
+ 0x1e, 0xc3, 0x61, 0xb1, 0x46, 0x60, 0xc6, 0x9,
+ 0x24, 0x60, 0xa5, 0x4d, 0x3, 0x2a, 0x2, 0x1c,
+ 0xc1, 0xf9, 0x82,
- /* U+F2A2 "" */
- 0x0, 0x6d, 0xc4, 0xc, 0xd2, 0xcc, 0x5, 0xf4,
- 0xd, 0x7d, 0x40, 0x9f, 0x4, 0xe, 0xde, 0x20,
- 0x7f, 0xf5, 0x57, 0xf9, 0x1, 0xff, 0xc2, 0x72,
- 0x66, 0x6, 0x29, 0x62, 0x6, 0x5b, 0x64, 0x7,
- 0xff, 0x9, 0x5b, 0x90, 0x11, 0xd2, 0x6c, 0x42,
- 0x4, 0xf8, 0x20,
+ /* U+E0ED "" */
+ 0xa, 0x81, 0xe9, 0xe, 0x50, 0x79, 0xc0, 0xf8,
+ 0x1f, 0xe1, 0xd8, 0x3f, 0xf8, 0x30, 0x7f, 0xf5,
+ 0x3f, 0xfe, 0xf, 0xff, 0x5f, 0xe0, 0xff, 0xf6,
+ 0x7e, 0xe, 0xff, 0xf8, 0x10, 0x7f, 0xf0, 0x60,
- /* U+F2A3 "" */
- 0x0, 0x6d, 0xc4, 0xc, 0xd2, 0xcc, 0x5, 0xf4,
- 0xd, 0x7d, 0x40, 0x9f, 0x4, 0xf, 0xb7, 0x72,
- 0x4, 0xe4, 0xcc, 0xf, 0xfe, 0x12, 0xff, 0x20,
- 0x32, 0xff, 0x20, 0x3f, 0xf8, 0x4e, 0x4c, 0xc0,
- 0xc5, 0x2c, 0x40, 0xcb, 0x6c, 0x80, 0xff, 0xe1,
- 0x2b, 0x72, 0x2, 0x3a, 0x4d, 0x88, 0x40, 0x9f,
- 0x4,
+ /* U+E10B "" */
+ 0xf, 0xfe, 0x2f, 0xff, 0xc1, 0x27, 0xff, 0x10,
+ 0x24, 0x3f, 0xa4, 0x2c, 0x3f, 0x91, 0x8e, 0xbf,
+ 0xc6, 0x8b, 0xff, 0x8, 0x2c, 0x3e, 0xb0, 0xc8,
+ 0x87, 0x90, 0xe4, 0x43, 0xc8, 0x75, 0x87, 0xd6,
+ 0x1f, 0xfc, 0x8a, 0xfe, 0xa, 0x65, 0xfe, 0x98,
- /* U+F2BA "" */
- 0x3, 0xff, 0x91, 0xe2, 0x3, 0xfc, 0x5e, 0xa0,
- 0xb, 0xbf, 0xad, 0x49, 0x5d, 0xf4, 0x38, 0x6,
- 0x3, 0x24, 0x6e, 0x44, 0x9, 0x30, 0x8, 0xb,
- 0x7a, 0x5, 0xf9, 0x80, 0x40, 0xd, 0x8c, 0x8,
- 0x81, 0xf4, 0x58, 0x54, 0xe1, 0x42, 0x3c, 0x60,
- 0x4d, 0xa9, 0x38, 0x1, 0x30, 0x86, 0xa0, 0xc8,
- 0x2, 0x9f, 0x8, 0x22, 0x8, 0xe0, 0x3a, 0x3,
- 0xb8, 0x8c, 0x9, 0x82, 0xc2, 0x10, 0x11, 0x5e,
- 0x30, 0x2, 0xe5, 0x70, 0x15, 0xe0, 0x9c, 0x5c,
- 0xa, 0x2c, 0x90, 0x2, 0xab, 0x10, 0xe0, 0x18,
- 0xfe, 0xa0, 0x65, 0x8,
-
- /* U+F2D3 "" */
- 0x3, 0xf1, 0x3, 0xff, 0x82, 0x67, 0xd8, 0xc0,
- 0xfe, 0x7b, 0x18, 0x3, 0x3d, 0x40, 0x46, 0x78,
- 0x40, 0xf9, 0x5c, 0xc6, 0x60, 0x7f, 0xf0, 0xc,
- 0xa0, 0x12, 0xff, 0xe0, 0x81, 0x29, 0xb7, 0xfd,
- 0x40, 0xca, 0x4f, 0xf8, 0x81, 0x9e, 0xdf, 0xf1,
- 0x3, 0x3d, 0xbf, 0xe2, 0x7, 0xff, 0x25, 0xed,
- 0xff, 0x10, 0x33, 0xdb, 0xfe, 0x20, 0x1f, 0x52,
- 0x7f, 0xc5, 0xf0,
-
- /* U+F2D4 "" */
- 0x3, 0xf1, 0x3, 0xff, 0x82, 0x67, 0xd8, 0xc0,
- 0xfe, 0x7b, 0x18, 0x3, 0x3d, 0x40, 0x46, 0x78,
- 0x40, 0xf9, 0x5c, 0xc6, 0x60, 0x7f, 0xf0, 0xc,
- 0xa0, 0x12, 0xff, 0xe0, 0x81, 0x29, 0xb7, 0xfd,
- 0x40, 0xca, 0x4f, 0xf8, 0x81, 0x9e, 0xdf, 0xf1,
- 0x3, 0x89, 0xff, 0x80, 0xff, 0xf5, 0x6a, 0x7,
- 0xff, 0x7, 0x50,
-
- /* U+F2ED "" */
- 0x3, 0x8d, 0xda, 0xb0, 0xf, 0x39, 0x37, 0x44,
- 0xc9, 0xc9, 0x99, 0x8d, 0xe2, 0x7, 0x9b, 0xd1,
- 0x1, 0xff, 0xc6, 0xff, 0xff, 0x8a, 0xc3, 0x93,
- 0xff, 0x84, 0x40, 0x56, 0xff, 0xf8, 0x60, 0x7f,
- 0xf2, 0xe4, 0x0, 0xc8, 0x7, 0x3, 0xff, 0xfe,
- 0x7, 0xff, 0xfc, 0xf, 0xfe, 0x33, 0x1, 0x20,
- 0x6, 0x40, 0x38, 0x13, 0x1, 0x80, 0xff, 0xe1,
- 0x10, 0xe, 0xc6, 0xff, 0xd3, 0x0,
-
- /* U+F304 "" */
- 0x3, 0xff, 0x88, 0xd0, 0x1f, 0xfc, 0x6d, 0x2c,
- 0x3, 0xff, 0x89, 0xc8, 0x7, 0x0, 0xff, 0xe1,
- 0x30, 0x39, 0xc0, 0x3f, 0xf8, 0x11, 0xb0, 0x1c,
- 0xc0, 0xff, 0xbb, 0xb1, 0x81, 0x88, 0x1f, 0xee,
- 0x1, 0x58, 0xc0, 0xb8, 0x1f, 0xdc, 0xc, 0xac,
- 0x63, 0x90, 0x3f, 0x70, 0x3c, 0xac, 0xe0, 0x7f,
- 0x70, 0x3f, 0x20, 0x3f, 0xdc, 0xf, 0xec, 0x7,
- 0xf7, 0x3, 0xfb, 0x10, 0x3f, 0x70, 0x3f, 0xb1,
- 0x3, 0xf7, 0x3, 0xfb, 0x10, 0x3f, 0x70, 0x3f,
- 0xb1, 0x3, 0xf4, 0x3, 0xfb, 0x10, 0x3f, 0x88,
- 0x1f, 0xb1, 0x3, 0xfc, 0xc0, 0xfb, 0x10, 0x3f,
- 0xe2, 0x7, 0xb1, 0x3, 0xff, 0x8d, 0x88, 0x1f,
- 0xfc, 0x1b, 0x2e, 0xfc, 0x40, 0xff, 0xe0, 0x80,
-
- /* U+F40B "" */
- 0x3, 0xff, 0x87, 0x0, 0xfc, 0x90, 0xf, 0xd0,
- 0xf, 0xc8, 0x81, 0xfa, 0x1, 0xf9, 0x10, 0x3f,
- 0x40, 0x7, 0xfa, 0x84, 0x40, 0xf7, 0x10, 0xf,
- 0x14, 0x84, 0xf, 0x41, 0x0, 0xf1, 0x43, 0x7f,
- 0x10, 0x10, 0xf, 0xc5, 0x1, 0xfa, 0x1, 0xf8,
- 0xa0, 0x3f, 0x40, 0x3f, 0x24, 0x3, 0xf4, 0x3,
+ /* U+E11C "" */
+ 0x3f, 0xfc, 0xc1, 0xfe, 0x83, 0xff, 0x85, 0x5f,
+ 0x83, 0x2f, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xc8,
+ 0xbf, 0xc1, 0x57, 0xe0, 0xff, 0xe1, 0x41, 0xfe,
0x80,
- /* U+F55A "" */
- 0x3, 0xcf, 0xff, 0xfe, 0x25, 0x20, 0x74, 0x80,
- 0x3f, 0xf8, 0x8a, 0x1, 0xa3, 0x3, 0xff, 0x8c,
- 0x80, 0xa3, 0x3, 0xce, 0x81, 0xab, 0x3, 0xf4,
- 0x60, 0x79, 0x45, 0x40, 0x55, 0x10, 0x1e, 0x8c,
- 0xf, 0x92, 0x5, 0x69, 0x4, 0x80, 0x74, 0x60,
- 0x7f, 0x54, 0x12, 0x5, 0x40, 0xf3, 0x3, 0xfe,
- 0xa0, 0x6a, 0x7, 0xcc, 0xf, 0xfa, 0x81, 0xa8,
- 0x1f, 0x46, 0x7, 0xf5, 0x41, 0x20, 0x54, 0xf,
- 0xa3, 0x3, 0xe4, 0x81, 0x5a, 0x41, 0x20, 0x1f,
- 0x46, 0x7, 0x94, 0x54, 0x5, 0x51, 0x1, 0xfa,
- 0x30, 0x3c, 0xe8, 0x1a, 0xb0, 0x3f, 0xd1, 0x81,
- 0xff, 0xc6, 0x40, 0x74, 0x80, 0x3f, 0xf8, 0x86,
+ /* U+E12C "" */
+ 0xf, 0xfe, 0x14, 0x1f, 0xfc, 0x2d, 0xf, 0xfe,
+ 0xe, 0x41, 0xff, 0xc0, 0xc9, 0xf, 0xfb, 0x24,
+ 0x3f, 0xec, 0x90, 0xd6, 0x1d, 0x92, 0x1d, 0x98,
+ 0x59, 0x21, 0xe6, 0x37, 0x24, 0x3f, 0x31, 0x12,
+ 0x1f, 0xe6, 0x24, 0x3f, 0xf8, 0xe, 0x87, 0xf0,
+
+ /* U+E140 "" */
+ 0xf, 0xf5, 0x87, 0xbb, 0x30, 0xd9, 0xb1, 0x83,
+ 0x24, 0x63, 0xc4, 0x84, 0xc0, 0x90, 0xe6, 0x88,
+ 0x40,
+
+ /* U+E141 "" */
+ 0xf, 0xf9, 0xe0, 0x98, 0x80, 0xc6, 0x6, 0x30,
+ 0xa2, 0xd, 0x10, 0x66, 0x30, 0xcc, 0x61, 0x98,
+ 0x83, 0x3c,
+
+ /* U+E142 "" */
+ 0xf, 0xad, 0xd, 0x12, 0x1b, 0x24, 0x36, 0x48,
+ 0x68, 0x83, 0x44, 0x16, 0x48, 0x32, 0x41, 0x12,
+ 0x15, 0xa1, 0x80,
+
+ /* U+E143 "" */
+ 0xc, 0xa0, 0xf9, 0xa2, 0x1c, 0xc0, 0x90, 0x98,
+ 0xf1, 0x23, 0x18, 0x32, 0x73, 0xd, 0x9d, 0x87,
+ 0xb8,
+
+ /* U+E150 "" */
+ 0xe, 0x6f, 0xc8, 0x7f, 0x3c, 0x8a, 0x2e, 0xf,
+ 0x31, 0x7a, 0x9c, 0x30, 0x66, 0x34, 0x39, 0xd5,
+ 0x5, 0x18, 0x68, 0x34, 0xb0, 0x90, 0x72, 0x1d,
+ 0x19, 0x88, 0x7f, 0xf0, 0x14, 0x21, 0xff, 0xc2,
+ 0xc2, 0x43, 0xff, 0x86, 0x88, 0x79, 0xd0, 0xf2,
+ 0x1f, 0xaa, 0xd0, 0x60, 0x84, 0x3c, 0xf6, 0x5,
+ 0x9, 0x7, 0xe6, 0x33, 0x4, 0x61, 0xfd, 0xa,
+ 0x3, 0x1c, 0x1c, 0xea, 0x83, 0x30, 0xff, 0x43,
+ 0x7, 0x9e, 0x43, 0x5c, 0x18,
+
+ /* U+E156 "" */
+ 0xf, 0xfe, 0x3, 0x87, 0xed, 0x46, 0x1e, 0xc4,
+ 0xcc, 0x36, 0x61, 0x66, 0xc, 0xc3, 0xb3, 0xc6,
+ 0x1f, 0x40, 0x83, 0xf4, 0x8, 0x3e, 0xcf, 0x18,
+ 0x76, 0x60, 0xcc, 0x2c, 0xc3, 0x66, 0x26, 0x1e,
+ 0xc5, 0x61, 0xfb, 0x40,
+
+ /* U+E176 "" */
+ 0x1f, 0xff, 0xe1, 0x7, 0xff, 0x16, 0xf, 0xfe,
+ 0xd, 0x87, 0xff, 0x52, 0xc3, 0xff, 0x88, 0xa8,
+ 0x3f, 0xf8, 0x35, 0x7, 0xff, 0x61, 0xf, 0xf9,
+ 0xe, 0x43, 0xf9, 0xf, 0x50, 0x3e, 0xa0, 0x7c,
+ 0xff, 0xc8, 0x77, 0xff, 0xf0, 0xc3, 0xff, 0x8e,
+
+ /* U+E1D9 "" */
+ 0xe, 0xf4, 0x81, 0x40, 0x4f, 0x41, 0xde, 0x90,
+ 0x28, 0x9, 0xe8, 0x3b, 0xd2, 0x5, 0x1, 0x3d,
0x0,
+ /* U+E1FA "" */
+ 0xe, 0xff, 0x21, 0xff, 0xd3, 0xf2, 0x79, 0xf,
+ 0xfa, 0xf2, 0x7f, 0x7, 0x28, 0x90, 0xff, 0xbc,
+ 0xd0, 0x43, 0xff, 0xa3, 0x40, 0xec, 0x3f, 0xe5,
+ 0x7, 0xff, 0x33, 0xf, 0xf9, 0x41, 0xff, 0xc5,
+ 0xa0, 0x54, 0x2a, 0xf, 0xfe, 0xa, 0x85, 0xb0,
+ 0xfe, 0xf2,
+
+ /* U+E210 "" */
+ 0xf, 0x9f, 0x90, 0xff, 0x98, 0x28, 0x3f, 0xec,
+ 0x3f, 0xf9, 0x28, 0x7f, 0xd8, 0x54, 0xf, 0x7c,
+ 0x4, 0xa, 0xf, 0x21, 0x61, 0x95, 0x7d, 0x7,
+ 0xbc, 0x24, 0x84, 0xc1, 0xfa, 0x43, 0xca, 0xf,
+ 0xa4, 0x3f, 0x41, 0xa5, 0x17, 0x7, 0x3f, 0x9c,
+ 0x18, 0xc0, 0x83, 0xe8, 0x8, 0x1f, 0x21, 0xec,
+ 0x3f, 0xf8, 0x70, 0x7f, 0xf2, 0x50, 0xff, 0xa4,
+ 0xc, 0x1e,
+
+ /* U+E238 "" */
+ 0xf, 0x48, 0x7f, 0xb5, 0x7, 0xf4, 0x4, 0x3f,
+ 0x28, 0x18, 0x7e, 0xc2, 0x43, 0xc8, 0x86, 0xd0,
+ 0xd0, 0x7d, 0x20, 0x80, 0x82, 0xa, 0xc, 0xe1,
+ 0x61, 0x42, 0x50, 0x34, 0x4, 0x43, 0xe4, 0x36,
+ 0x19, 0x44, 0x4, 0x43, 0x99, 0x4, 0xc, 0x26,
+ 0x41, 0x6, 0xe0, 0xce, 0x87, 0x3f, 0xa0, 0xc0,
+
+ /* U+E28F "" */
+ 0x3f, 0xfe, 0x21, 0x7f, 0x84, 0x15, 0xfc, 0x1d,
+ 0xc1, 0xff, 0xcc, 0xe0, 0xe4, 0x37, 0xfe, 0x83,
+ 0x2f, 0xf0, 0x68, 0xeb, 0xc1, 0xce, 0x1f, 0xfc,
+ 0xce, 0xf, 0xfe, 0xc7, 0xff, 0x2, 0xf, 0xf9,
+ 0x31, 0xfe, 0x1c,
+
+ /* U+E2DA "" */
+ 0xf, 0xd7, 0xe4, 0x3f, 0xeb, 0x43, 0x5a, 0x1f,
+ 0xb4, 0xbf, 0x44, 0x87, 0xa1, 0xd0, 0xce, 0x41,
+ 0xe4, 0x82, 0xc3, 0x66, 0x1a, 0x20, 0xff, 0x21,
+ 0xc8, 0x87, 0xfb, 0x12, 0x80, 0xa0, 0x64, 0x32,
+ 0x14, 0x81, 0xc2, 0xa8, 0x24, 0x36, 0x9, 0x9,
+ 0xcc, 0x18, 0x85, 0xc8, 0x7a, 0xc0, 0x87, 0x91,
+ 0xf, 0xd9, 0x87, 0xd6, 0x86, 0x72, 0xf, 0xd1,
+ 0x7e, 0x89, 0xf, 0xce, 0x86, 0x74, 0x20,
+
+ /* U+E2DC "" */
+ 0xf, 0xd4, 0xf, 0xfe, 0x1c, 0xa8, 0x3f, 0xf8,
+ 0x3a, 0x7, 0xf, 0xfb, 0xf, 0x61, 0xfd, 0x87,
+ 0xec, 0x3c, 0xe1, 0xfe, 0xd0, 0x98, 0x3f, 0xf8,
+ 0x12, 0x14, 0x1f, 0xfc, 0x8, 0x25, 0x7, 0xff,
+ 0x1, 0x41, 0xfa, 0xf4, 0x1f, 0xfc, 0x24, 0x8,
+ 0x7f, 0xfd, 0x3f, 0x6, 0xfc, 0x10,
+
+ /* U+E2E3 "" */
+ 0x50, 0x7f, 0xf1, 0x68, 0x1f, 0xfc, 0x9b, 0x47,
+ 0xfe, 0x83, 0xb4, 0x90, 0xfc, 0xe1, 0x21, 0xa0,
+ 0xff, 0x40, 0x43, 0x21, 0xfe, 0x42, 0x82, 0x83,
+ 0xff, 0x84, 0xfc, 0x1f, 0xfc, 0x2f, 0xf4, 0x1f,
+ 0xfd, 0x3a, 0xff, 0xe1, 0x86, 0x5f, 0xfe, 0x18,
+ 0x7f, 0xf2, 0x40,
+
+ /* U+E30B "" */
+ 0xa, 0xf9, 0xf, 0xfe, 0x6, 0x85, 0x40, 0xff,
+ 0x60, 0x42, 0x50, 0x7f, 0xdd, 0x85, 0x7, 0xe4,
+ 0x3f, 0xf9, 0x11, 0x7, 0xff, 0xd, 0xd0, 0xff,
+ 0xe0, 0x21, 0xfd, 0x87, 0xe8, 0x3f, 0xb0, 0xf9,
+ 0xc3, 0xfb, 0xf, 0xdf, 0x83, 0xd8, 0x7f, 0xda,
+ 0x1d, 0x87, 0xfd, 0x79, 0xb, 0xf, 0xfe, 0x36,
+ 0x1f, 0xfc, 0xa, 0x83, 0xff, 0x88, 0xa0, 0xff,
+ 0xe5, 0x0,
+
+ /* U+E322 "" */
+ 0x5, 0xff, 0xfc, 0x28, 0x25, 0x7, 0xff, 0x9,
+ 0x41, 0xaf, 0xff, 0xe0, 0x41, 0xff, 0xff, 0xf,
+ 0xff, 0x3f, 0x5f, 0xfc, 0xc, 0x32, 0x2f, 0xff,
+ 0x8, 0x4f, 0x7, 0xff, 0x13, 0xc1, 0xff, 0xc8,
+
+ /* U+E32A "" */
+ 0xf, 0xfe, 0x22, 0x1f, 0xfc, 0x26, 0xe0, 0xf9,
+ 0x57, 0xe9, 0x10, 0xeb, 0xa2, 0x1f, 0x61, 0xb4,
+ 0x39, 0x41, 0x90, 0xb0, 0xcc, 0xb0, 0x48, 0x50,
+ 0x6b, 0x90, 0xe8, 0x24, 0x2c, 0x83, 0xc8, 0x48,
+ 0x5b, 0x7, 0xd0, 0x48, 0x22, 0xf, 0xa0, 0xf9,
+ 0x83, 0xe5, 0x7, 0x70, 0x87, 0xd0, 0x7c, 0xc1,
+ 0xe7, 0xf, 0xe4, 0x33, 0xc1, 0xfd, 0x17, 0xd0,
+ 0x7f, 0xda, 0x83, 0xff, 0x82,
+
+ /* U+E335 "" */
+ 0x9, 0xbe, 0x43, 0xa8, 0x85, 0x61, 0x48, 0x7d,
+ 0x81, 0xf, 0xe5, 0x7, 0xfa, 0xc3, 0xff, 0x97,
+ 0x87, 0xf9, 0x41, 0xfe, 0xc8, 0x3f, 0x28, 0x60,
+ 0xf3, 0x4, 0x87, 0xb0, 0xff, 0xe2, 0xf5, 0xc8,
+ 0x79, 0x78, 0x3c, 0xfe, 0x83, 0xc8, 0x6c, 0x20,
+
+ /* U+E33E "" */
+ 0xe, 0xb8, 0x3f, 0x3a, 0x3a, 0x1e, 0x8b, 0x88,
+ 0x39, 0x24, 0x61, 0xf, 0x21, 0x21, 0xec, 0x3e,
+ 0xc0, 0xe9, 0xfc, 0x3b, 0x7, 0xfd, 0x7, 0xff,
+ 0x4d, 0xd0, 0xff, 0x44, 0x1f, 0xfc, 0xb8, 0x83,
+ 0xfc, 0xe8, 0x7f, 0xf4, 0xe0, 0xff, 0xa0,
+
+ /* U+E374 "" */
+ 0x6b, 0xfe, 0xd7, 0xfe,
+
+ /* U+E3E4 "" */
+ 0xa8, 0x35, 0x4b, 0x80, 0xb8, 0x3f, 0xff, 0xe1,
+ 0xff, 0xcd,
+
+ /* U+E40A "" */
+ 0xf, 0xf3, 0x7, 0xf3, 0xa1, 0xfd, 0x61, 0xfe,
+ 0xe0, 0xfe, 0x70, 0xff, 0x68, 0x7e, 0x90, 0xf3,
+ 0xa1, 0xea, 0x7, 0x9d, 0xf, 0x50, 0x3c, 0xe8,
+ 0x7c,
+
+ /* U+E415 "" */
+ 0xe, 0x60, 0xff, 0x68, 0x7f, 0xf7, 0x5a, 0xc9,
+ 0x5d, 0xae, 0x2, 0xf5, 0xf9, 0x3f, 0x83, 0xff,
+ 0xc8,
+
+ /* U+E425 "" */
+ 0xf, 0x70, 0x7f, 0xf2, 0x98, 0x3d, 0x21, 0x32,
+ 0x1e, 0x60, 0xa3, 0xf, 0x66, 0x44, 0x1f, 0x91,
+ 0x2, 0x1f, 0xb3, 0x43, 0xfc, 0x81, 0xe, 0xa0,
+ 0x48, 0x32, 0x9, 0xd, 0x9a, 0x28, 0x3c, 0xa1,
+ 0x22, 0x43, 0x50, 0xc0, 0xc5, 0xf9, 0x30, 0xce,
+ 0x86, 0xb0, 0x80,
+
+ /* U+E438 "" */
+ 0xf, 0xfe, 0x46, 0x85, 0xa1, 0x50, 0x34, 0x1a,
+ 0x10, 0x2b, 0xc, 0x88, 0x10, 0xd8, 0x86, 0x44,
+ 0x8, 0x82, 0x20, 0xd1, 0x83, 0x20, 0xc8, 0x68,
+ 0x81, 0x18, 0x12, 0xe, 0x82, 0xa0, 0x65, 0x6,
+ 0x90, 0x94, 0x13, 0x4, 0xff, 0xff, 0xa, 0x20,
+ 0xff, 0xe1, 0x30, 0x1c, 0x18, 0x3c, 0xc, 0x3f,
+ 0xc8, 0x7f, 0xf4, 0x1c, 0x1a, 0x78, 0x18, 0x7f,
+ 0xf2, 0x5f, 0xff, 0xe0, 0x81, 0xc3, 0xff, 0x82,
+ 0xe0,
+
+ /* U+E456 "" */
+ 0xf, 0xfe, 0x84, 0x1f, 0xfc, 0x4c, 0x33, 0x5f,
+ 0xc9, 0x85, 0xaf, 0xf0, 0x48, 0x6f, 0xfc, 0x92,
+ 0x1f, 0xfc, 0x19, 0xf, 0xfe, 0xc, 0x86, 0xa0,
+ 0x7f, 0xf0, 0xd0, 0xff, 0xe6, 0x58, 0x74, 0x1f,
+ 0xfc, 0x29, 0xf, 0xfe, 0xc, 0x95, 0xf9, 0xc,
+ 0x81, 0x7f, 0x7, 0x60, 0xff, 0xf0, 0x6c, 0x3f,
+ 0xf8, 0x98, 0x7f, 0xf0, 0x0,
+
+ /* U+E457 "" */
+ 0xf, 0xfe, 0x94, 0x1f, 0xfc, 0x5c, 0x2f, 0x2,
+ 0xbf, 0x26, 0xc, 0xc9, 0x7e, 0x9, 0x6, 0x67,
+ 0xfc, 0x92, 0x12, 0x61, 0xfa, 0x43, 0xec, 0x3d,
+ 0x21, 0xd5, 0x18, 0x7f, 0xf0, 0x55, 0x18, 0x7f,
+ 0xf0, 0x98, 0xc2, 0xb0, 0xf4, 0x6, 0x30, 0xfe,
+ 0x90, 0x98, 0xc8, 0x3a, 0x4a, 0xd8, 0x33, 0xc,
+ 0x81, 0x78, 0x2c, 0x3b, 0x7, 0xfe, 0x30, 0xec,
+ 0x3f, 0xb2, 0xe, 0xc3, 0xfb, 0x80,
+
+ /* U+E458 "" */
+ 0xf, 0xfe, 0x84, 0x1f, 0xfc, 0x4c, 0x33, 0x5f,
+ 0xc9, 0x85, 0xaf, 0xf0, 0x48, 0x6f, 0xfc, 0x92,
+ 0x1f, 0xfc, 0x19, 0xf, 0xd6, 0x14, 0x86, 0xa0,
+ 0x58, 0x7f, 0xc8, 0x48, 0x7f, 0xf2, 0x2c, 0x3a,
+ 0xf, 0xfe, 0x14, 0x86, 0xc3, 0xf4, 0x95, 0xf9,
+ 0xc, 0x81, 0x7f, 0x7, 0x60, 0xff, 0xf0, 0x6c,
+ 0x3f, 0xf8, 0x98, 0x7f, 0xf0, 0x0,
+
+ /* U+E493 "" */
+ 0xf, 0xbf, 0x7, 0xff, 0x41, 0x4, 0x1a, 0x2,
+ 0x1d, 0xde, 0x43, 0x3e, 0xb0, 0x90, 0xff, 0xe1,
+ 0x20, 0x83, 0xd4, 0xf, 0x40, 0x43, 0xb5, 0x61,
+ 0xc8, 0x28, 0x14, 0x1a, 0xa, 0x81, 0x21, 0x21,
+ 0x90, 0x90, 0xc8, 0x48, 0x64, 0x24, 0x2a, 0x5,
+ 0x6, 0x82, 0xa0, 0x10, 0xee, 0x98, 0x72, 0x8,
+ 0x3c, 0xa0, 0xf4, 0x4, 0x3f, 0xf8, 0x48, 0x5d,
+ 0xe4, 0x33, 0xeb, 0xe, 0x41, 0x6, 0x80, 0x87,
+ 0xff, 0x24,
+
+ /* U+E49D "" */
+ 0xf, 0xfe, 0x1e, 0x1f, 0x3f, 0x40, 0xc3, 0xcc,
+ 0x1b, 0x30, 0xf4, 0x1d, 0x98, 0x6c, 0xe0, 0xd8,
+ 0x83, 0x31, 0x83, 0x69, 0x98, 0x7f, 0xb3, 0xf,
+ 0xf6, 0x61, 0xfe, 0xcc, 0x70, 0xfb, 0x30, 0x26,
+ 0x30, 0x33, 0xd, 0x9c, 0xc, 0xc3, 0xd0, 0x76,
+ 0x1e, 0x60, 0xd8, 0x7c, 0xfd, 0x0,
+
+ /* U+E49E "" */
+ 0xf, 0xe4, 0x3f, 0xf8, 0x1c, 0xb, 0xff, 0x2a,
+ 0x10, 0xff, 0x27, 0xff, 0x26, 0x1f, 0xef, 0x7,
+ 0xfc, 0x87, 0xff, 0x1, 0xf, 0xfe, 0x7, 0x81,
+ 0xff, 0xc9, 0x88, 0x7f, 0x92, 0xff, 0xca, 0x83,
+ 0xfd, 0xc0,
+
+ /* U+E4AD "" */
+ 0x20, 0xfb, 0xc3, 0x87, 0xfd, 0xa1, 0xfe, 0xa0,
+ 0x7f, 0x9d, 0xf, 0xfe, 0x3b, 0xa1, 0xf5, 0x3,
+ 0xf6, 0x87, 0xce, 0x1f, 0x80,
+
+ /* U+E4AE "" */
+ 0xf0, 0x7d, 0x7, 0xf6, 0x87, 0xce, 0x1f, 0xa8,
+ 0x1f, 0x3a, 0x1f, 0xfc, 0x77, 0x43, 0xfd, 0x40,
+ 0xff, 0x38, 0x7f, 0xda, 0x0,
+
+ /* U+E4B9 "" */
+ 0xf, 0xfe, 0x5b, 0xfc, 0xf, 0xe4, 0x3d, 0x87,
+ 0x50, 0x3b, 0xf, 0xfe, 0x76, 0x1f, 0xfc, 0xc,
+ 0x35, 0xe8, 0x3f, 0xd7, 0xa0, 0x22, 0x83, 0xfc,
+ 0xa1, 0xf, 0xfe, 0x77, 0xea, 0x7e, 0xf, 0xef,
+ 0xff, 0xe0, 0x7, 0xff, 0x87, 0x46, 0xbf, 0xc8,
+ 0xe1, 0x64, 0xbf, 0xe8, 0x3c, 0xe1, 0xff, 0xc0,
+ 0xe0, 0x0,
+
+ /* U+E4C3 "" */
+ 0x3f, 0xfc, 0xc1, 0xc8, 0x68, 0x3b, 0xa0, 0x7e,
+ 0x40, 0x87, 0xe4, 0x10, 0x7f, 0x79, 0xf, 0xe5,
+ 0x7, 0xe7, 0xa7, 0x7, 0xa0, 0xcc, 0x1a, 0x5,
+ 0xc2, 0x19, 0x34, 0x61, 0xf, 0xe4, 0x39, 0x10,
+ 0x91, 0xa, 0x24, 0x14, 0xe, 0xcb, 0xd2, 0x1e,
+ 0xfc, 0x85, 0x7, 0xfa,
+
+ /* U+E4DB "" */
+ 0xff, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0x86,
+
+ /* U+E4DE "" */
+ 0x3, 0xf8, 0x17, 0xd0, 0x76, 0x1a, 0x50, 0x48,
+ 0x56, 0x86, 0x60, 0xef, 0x9, 0x5f, 0xfc, 0x11,
+ 0x13, 0x5e, 0xc4, 0xd3, 0x9, 0xe, 0x42, 0x43,
+ 0x9c, 0x3b, 0x47, 0xc, 0xff, 0xff, 0x4, 0x3f,
+ 0xf9, 0xf, 0xff, 0xf0, 0x43, 0x9d, 0xa, 0xc3,
+ 0xf9, 0xa0, 0x53, 0x87, 0xf2, 0xb0, 0xa2, 0xf,
+ 0xeb, 0xd, 0xc1, 0xcf, 0xff, 0xf0, 0x4e, 0xf,
+ 0xfe, 0x1a, 0xa0, 0x7f, 0xe4, 0x70,
+
+ /* U+E502 "" */
+ 0x7f, 0xff, 0x8a, 0xc1, 0xff, 0xc5, 0x81, 0xff,
+ 0xfc, 0x30, 0xff, 0xff, 0x87, 0xff, 0xfc, 0x3d,
+ 0x5f, 0xfc, 0x30, 0x42, 0xff, 0xf0, 0xc9, 0xfe,
+ 0xf, 0x3f, 0xc8, 0x79, 0x7d, 0x87, 0x80,
+
+ /* U+E50F "" */
+ 0xa, 0xf0, 0x74, 0x82, 0xc, 0x98, 0x87, 0xff,
+ 0x32, 0xf, 0xc8, 0x7f, 0xf5, 0x20, 0xec, 0x50,
+ 0x79, 0xf, 0xd8, 0x7f, 0x21, 0xf6, 0x41, 0xca,
+ 0x18, 0x2a, 0x0,
+
+ /* U+E51B "" */
+ 0xe, 0xfe, 0xf, 0xfe, 0x6f, 0xf0, 0x7f, 0x37,
+ 0xd0, 0x7e, 0xa2, 0x13, 0xd3, 0xb, 0x4b, 0xf2,
+ 0xc1, 0x43, 0xab, 0x49, 0x10, 0x24, 0x1f, 0x4a,
+ 0x22, 0xf, 0xec, 0x80, 0x87, 0xf2, 0x28, 0x3f,
+ 0xf8, 0x48, 0x73, 0xa1, 0xf9, 0xf, 0xe4, 0x62,
+ 0xf, 0xec, 0xc4, 0x83, 0xe9, 0x12, 0x1d, 0xd,
+ 0x26, 0x16, 0x97, 0xe4, 0xc3, 0xa8, 0x84, 0xd8,
+ 0x40,
+
+ /* U+E565 "" */
+ 0xf, 0xa0, 0xff, 0x9f, 0x3e, 0x43, 0xcf, 0x7,
+ 0x5a, 0xb, 0x83, 0xfa, 0xe4, 0x3f, 0xf8, 0x28,
+ 0x7f, 0xf3, 0x5c, 0x3f, 0xf8, 0xc, 0x1f, 0xfc,
+ 0x6, 0x30, 0xf4, 0x13, 0x18, 0x7c, 0xe3, 0x18,
+ 0x72, 0x8, 0xe3, 0xe, 0x60, 0x30, 0x30, 0xf4,
+ 0x19, 0xb0, 0xf2, 0xc, 0x24, 0x3e, 0x82, 0x83,
+ 0xfa, 0xc, 0xc1, 0xf4, 0x87, 0x38, 0x76, 0x87,
+ 0xee, 0x6c, 0x38,
+
+ /* U+E57E "" */
+ 0xf, 0xf4, 0x1f, 0xfc, 0x8, 0xf, 0x7, 0xf4,
+ 0x83, 0x56, 0x1f, 0x48, 0x69, 0x20, 0xe9, 0xc,
+ 0x90, 0x8f, 0xc8, 0x74, 0x91, 0x7, 0xfd, 0x8,
+ 0x7f, 0xf1, 0x50, 0xff, 0xe1, 0xa1, 0xff, 0x42,
+ 0x7, 0xe4, 0x3a, 0x48, 0x83, 0x48, 0x64, 0x84,
+ 0x3d, 0x21, 0xa4, 0x83, 0xe9, 0x6, 0xac, 0x3f,
+ 0xa0, 0x3c, 0x10,
+
+ /* U+E580 "" */
+ 0xf, 0xfe, 0x3a, 0x1f, 0xec, 0x3f, 0xd8, 0x7f,
+ 0xb0, 0xd0, 0x3f, 0x7, 0x28, 0x3f, 0xe8, 0x3f,
+ 0xfa, 0xf1, 0xf8, 0x3a, 0x43, 0xb0, 0xc8, 0x7d,
+ 0x87, 0xff, 0x3, 0xf, 0xfe, 0x2, 0x18,
+
+ /* U+E58C "" */
+ 0xc, 0xa0, 0xfd, 0x40, 0xfb, 0x6, 0x1d, 0x6,
+ 0x83, 0x21, 0x90, 0xb0, 0xf6, 0x21, 0xf9, 0xc3,
+ 0xf6, 0x87, 0xe4, 0x3f, 0xf9, 0x10, 0x7e, 0x94,
+ 0x1e, 0x51, 0x40, 0xd4, 0x9, 0xfc, 0x80,
+
+ /* U+E58E "" */
+ 0xc, 0xa0, 0xfd, 0x40, 0xfb, 0x6, 0x1d, 0x6,
+ 0x83, 0x21, 0x90, 0xb0, 0xf6, 0x27, 0x81, 0x41,
+ 0xc4, 0x13, 0x1a, 0x5c, 0xe0, 0x42, 0x9d, 0xe,
+ 0x9c, 0xb0, 0x47, 0x80, 0xc4, 0xb0, 0x52, 0xc5,
+ 0x3, 0x50, 0x27, 0xf2, 0x0,
+
+ /* U+E58F "" */
+ 0xa, 0xf4, 0x1f, 0xfc, 0x5, 0x1, 0x41, 0xff,
+ 0x61, 0xb5, 0xf8, 0x2d, 0xc, 0xd7, 0xd8, 0x7f,
+ 0xf1, 0xd0, 0xff, 0xe2, 0x48, 0x67, 0xf8, 0x3f,
+ 0xf8, 0x88, 0x50, 0x7f, 0xf0, 0x20, 0x90, 0xff,
+ 0xe0, 0x7f, 0x7, 0xff, 0x9, 0xf, 0xfe, 0x1b,
+ 0x21, 0xff, 0xc2, 0x88, 0x8, 0x79, 0xf, 0xd4,
+ 0x43, 0x34, 0x9, 0x9, 0xf, 0xc8, 0x57, 0x83,
+ 0xff, 0x8c,
+
+ /* U+E594 "" */
+ 0xf, 0xfe, 0x7c, 0x1f, 0xe4, 0x32, 0x83, 0xfa,
+ 0xa2, 0xe3, 0xc8, 0x74, 0x85, 0x21, 0x48, 0x65,
+ 0x1, 0x6, 0x12, 0x1d, 0x10, 0x6e, 0xd0, 0xfc,
+ 0xa1, 0x24, 0x83, 0xe4, 0xc8, 0x3e, 0xc0, 0x98,
+ 0x81, 0xc, 0xe6, 0x21, 0xb2, 0x42, 0x51, 0x5,
+ 0x85, 0x14, 0xb, 0xc1, 0x90, 0x98, 0x79, 0x42,
+ 0x8, 0x42, 0x74, 0x6f, 0x80, 0xa9, 0xd, 0x72,
+ 0x4, 0x29, 0xa0, 0x72, 0x6, 0xd, 0x2b, 0xad,
+ 0xaa, 0xf, 0x5c, 0x28, 0xb8, 0x3f, 0x9b, 0xd2,
+ 0x1c,
+
+ /* U+E599 "" */
+ 0xf, 0xd0, 0x7f, 0xf0, 0xa5, 0x7, 0xff, 0x9,
+ 0xc3, 0xff, 0x83, 0x50, 0x7d, 0xf0, 0x1b, 0x90,
+ 0x7a, 0x23, 0x28, 0x8d, 0x8, 0xc5, 0xa, 0x3d,
+ 0xb, 0xc0, 0x88, 0xc0, 0xc6, 0x41, 0xff, 0x22,
+ 0x1f, 0xfc, 0x14, 0x43, 0xa2, 0x30, 0x31, 0x90,
+ 0x14, 0x28, 0xf4, 0x2f, 0x19, 0x94, 0x46, 0x84,
+ 0x65, 0xe0, 0x37, 0x20, 0xf4, 0x1f, 0x54, 0x1f,
+ 0xfc, 0x27, 0xf, 0xfe, 0xc, 0xa0, 0xf0,
+
+ /* U+E5A8 "" */
+ 0xf, 0xca, 0xf, 0xfe, 0x2d, 0x3, 0xff, 0xa4,
+ 0xe1, 0xbc, 0x1a, 0x81, 0xf2, 0x1f, 0x94, 0x1e,
+ 0x64, 0x6f, 0x48, 0xd0, 0x3c, 0x94, 0x40, 0xd0,
+ 0x43, 0xf2, 0x83, 0xca, 0xf, 0xec, 0x3f, 0x61,
+ 0xde, 0x44, 0x3f, 0x20, 0xf2, 0x1f, 0xfc, 0x7f,
+ 0x22, 0x1f, 0x90, 0x79, 0xd, 0x87, 0xec, 0x3f,
+ 0x94, 0x1e, 0x50, 0x7e, 0x4a, 0x20, 0x68, 0x21,
+ 0xea, 0x23, 0x7a, 0x41, 0x61, 0xd6, 0x85, 0xe0,
+ 0xde, 0xf, 0xfe, 0x95, 0x3, 0xf8,
+
+ /* U+E5A9 "" */
+ 0xc, 0xdf, 0xe9, 0xf, 0x3c, 0x87, 0x9b, 0x40,
+ 0xf0, 0x65, 0xc1, 0xad, 0xc2, 0xbd, 0x5b, 0xd0,
+ 0x5c, 0x5a, 0x1f, 0x9e, 0x23, 0x40, 0xdf, 0xa4,
+ 0xe, 0x19, 0xe4, 0x33, 0x68, 0x7b, 0x9, 0x70,
+ 0x58, 0x7a, 0x6e, 0xb7, 0x30, 0x7d, 0x21, 0xe6,
+ 0xf, 0xf3, 0x7c, 0x87, 0xff, 0x3, 0x42, 0xc3,
+ 0xff, 0x81, 0x6, 0x83, 0xff, 0x83, 0x83, 0xf,
+ 0xfe, 0x1d, 0x3, 0xf0,
+
+ /* U+E5F1 "" */
+ 0x2f, 0xf2, 0x21, 0x94, 0x1e, 0x8a, 0x7, 0xff,
+ 0x7, 0x60, 0xf9, 0xf, 0x30, 0x73, 0x86, 0x99,
+ 0xe, 0x83, 0xff, 0x82, 0x8a, 0xa, 0x60, 0xe8,
+ 0x10, 0x27, 0xc1, 0x90, 0xa0, 0xa0, 0xf3, 0x8a,
+ 0x4, 0x21, 0xfa, 0xf, 0xfe, 0xa, 0x1f, 0xfc,
+ 0x28, 0x3f, 0xf9, 0xe, 0x87, 0xff, 0x2, 0x68,
+ 0x0,
+
+ /* U+E5FA "" */
+ 0xc, 0xdf, 0xa0, 0xf9, 0xe4, 0x33, 0x87, 0x30,
+ 0x29, 0xd0, 0x83, 0xa1, 0xd4, 0x2b, 0x43, 0x20,
+ 0x83, 0xf2, 0x83, 0xcd, 0xf4, 0xaa, 0x22, 0xe,
+ 0x42, 0x68, 0x8, 0x8, 0x54, 0xf, 0xfe, 0x3,
+ 0xe8, 0x3e, 0xc0, 0x92, 0x83, 0xf2, 0x24, 0x41,
+ 0xfd, 0x87, 0xff, 0x1d, 0xf, 0xfe, 0x9f, 0x83,
+ 0xff, 0x80, 0x87, 0xff, 0x6, 0x0,
+
+ /* U+E606 "" */
+ 0xf, 0x5e, 0xb, 0xd0, 0x7e, 0x96, 0x8c, 0x44,
+ 0x3e, 0x4a, 0x80, 0xd1, 0xf, 0xef, 0xc1, 0xff,
+ 0xd4, 0xfc, 0x1f, 0xfc, 0x25, 0xc1, 0xff, 0xc2,
+ 0xac, 0x1f, 0xfc, 0x2a, 0xc1, 0xff, 0x40, 0xc5,
+ 0x7, 0x50, 0x7c, 0x81, 0xb4, 0xf, 0x90, 0x43,
+ 0x7d, 0x10, 0xc3, 0xc7, 0xa5, 0xef, 0x53, 0xd2,
+ 0x81, 0x7a, 0xae, 0x14, 0x5d, 0x9a, 0x53, 0x87,
+ 0xf2, 0x50, 0x7c, 0xa1, 0xf2, 0x7, 0xc8,
+
+ /* U+E60C "" */
+ 0xf, 0xf9, 0x41, 0xff, 0x50, 0x3f, 0xfb, 0xee,
+ 0x1f, 0xe6, 0xf, 0xf3, 0x18, 0x7e, 0x63, 0xf,
+ 0xcc, 0xf, 0xf8, 0x8, 0x4b, 0xfc, 0x60, 0xaf,
+ 0xe0, 0x66, 0x1f, 0xf6, 0x61, 0xff, 0x70, 0x7c,
+
+ /* U+E64A "" */
+ 0xf8, 0x39, 0xf4, 0x1f, 0xfc, 0x6, 0x3, 0x87,
+ 0xfd, 0x7, 0x41, 0x20, 0x83, 0xff, 0x83, 0x81,
+ 0xf, 0xec, 0x24, 0x28, 0x18, 0x72, 0x1b, 0x3,
+ 0x83, 0x55, 0x87, 0xa0, 0xb8, 0xa2, 0x1f, 0x30,
+ 0x4f, 0xf4, 0x1e, 0x50, 0x7e, 0x78, 0x3b, 0xf,
+ 0xf3, 0x7, 0xff, 0x11, 0xf, 0xfe, 0x28,
+
+ /* U+E68A "" */
+ 0xf, 0x98, 0x3f, 0xf8, 0xf, 0x3e, 0x43, 0xeb,
+ 0x83, 0xad, 0xa, 0xd0, 0xfe, 0xb8, 0x43, 0xff,
+ 0x82, 0x87, 0xde, 0x43, 0xff, 0x81, 0x82, 0x81,
+ 0xfc, 0xe1, 0x9c, 0x3f, 0x61, 0xf4, 0x1f, 0x41,
+ 0xf4, 0x1f, 0xe6, 0xf, 0xfe, 0x16, 0x87, 0x92,
+ 0xf, 0xe4, 0x28, 0x42, 0xf2, 0x7a, 0x2, 0x14,
+ 0x1f, 0xf4, 0x12, 0x83, 0xfa, 0xe, 0x90, 0xfa,
+ 0x43, 0xd4, 0xe, 0xd0, 0xfc, 0xf3, 0xe0, 0xe0,
+
+ /* U+E6A1 "" */
+ 0xf, 0xfe, 0x75, 0x87, 0xff, 0xf, 0x4d, 0xf,
+ 0xfe, 0x6, 0x59, 0x21, 0xfe, 0xc9, 0x32, 0x43,
+ 0xe7, 0x24, 0x2c, 0xa0, 0x73, 0x1a, 0x1d, 0x8c,
+ 0x13, 0x7, 0xf9, 0x18, 0xe, 0x85, 0xfa, 0xb,
+ 0x83, 0xff, 0x80, 0x87, 0xff, 0xf, 0x43, 0xff,
+ 0xc9, 0xe0, 0xed, 0xf, 0xfe, 0x50,
+
+ /* U+E6A5 "" */
+ 0x1d, 0x3, 0xa1, 0xff, 0xca, 0xca, 0xc6, 0x68,
+ 0x14, 0x7, 0xf, 0xff, 0x36, 0x1f, 0xb3, 0xf,
+ 0x61, 0x61, 0xb0, 0xff, 0xe5, 0x0,
+
+ /* U+E6B5 "" */
+ 0x9, 0xff, 0x21, 0xe8, 0x3d, 0x7, 0xff, 0x1d,
+ 0xf, 0xd0, 0x68, 0x3f, 0x21, 0xff, 0xc5, 0x83,
+ 0xfd, 0x1, 0xf, 0xf2, 0x1f, 0xfc, 0x38, 0x3f,
+ 0xf8, 0x14, 0xff, 0xfe, 0x4, 0x1e, 0xf0, 0x7f,
+ 0xf9, 0xbf, 0x3, 0xf0, 0x7f, 0xf1, 0x0,
+
+ /* U+E6C0 "" */
+ 0x3f, 0xff, 0x82, 0xc1, 0xff, 0xc1, 0x83, 0xe4,
+ 0x3f, 0xf8, 0x52, 0x1f, 0xfe, 0xab, 0xe, 0xb0,
+ 0xf6, 0x61, 0x4a, 0xf, 0x28, 0xc9, 0x20, 0xfa,
+ 0x43, 0x61, 0xfd, 0x20, 0xc3, 0xfe, 0xa6, 0x1f,
+ 0xfc, 0x14, 0x3e, 0x83, 0xff, 0x83, 0x0,
+
+ /* U+E6C3 "" */
+ 0x3f, 0xff, 0x82, 0xc1, 0xff, 0xc1, 0x83, 0xe4,
+ 0x3f, 0xf8, 0x34, 0xc3, 0xfe, 0x90, 0x61, 0xfd,
+ 0x21, 0xb0, 0xf9, 0x46, 0x49, 0x87, 0xb3, 0xa,
+ 0x43, 0xeb, 0xe, 0xb0, 0xff, 0xf5, 0xc8, 0x7f,
+ 0xf0, 0x50, 0xfa, 0xf, 0xfe, 0xc,
+
+ /* U+E6E8 "" */
+ 0xf, 0xca, 0xf, 0xfe, 0x2d, 0x3, 0xff, 0xa5,
+ 0x61, 0xbc, 0x1b, 0xc1, 0xd1, 0x4, 0xa0, 0x92,
+ 0xf, 0x71, 0xea, 0x78, 0x74, 0x3f, 0x61, 0xec,
+ 0x3f, 0xd0, 0x7e, 0x83, 0xa8, 0x88, 0x7e, 0x41,
+ 0x45, 0xb0, 0xff, 0xe0, 0xab, 0xe8, 0x3f, 0xf8,
+ 0x3e, 0x83, 0x41, 0xfa, 0xf, 0xe4, 0x3f, 0x21,
+ 0xfe, 0xc3, 0xd8, 0x7f, 0xf0, 0x10, 0xc8, 0x7f,
+ 0xf0, 0x70, 0xd8, 0x7f, 0xf0, 0x5f, 0xc8, 0x7f,
+ 0xf0, 0xaf, 0x41, 0xff, 0xc3, 0xc1, 0x87, 0xe0,
+
+ /* U+E70D "" */
+ 0xe, 0xbf, 0x48, 0x7e, 0xb4, 0x50, 0xd8, 0x79,
+ 0x6f, 0x53, 0xc9, 0x7, 0x3c, 0x5e, 0x8b, 0x83,
+ 0x60, 0x74, 0xe, 0x82, 0x84, 0x14, 0x7, 0x4,
+ 0x5, 0x8, 0x20, 0xfd, 0x10, 0x88, 0x84, 0xe1,
+ 0x22, 0x61, 0xff, 0xc6, 0x43, 0xff, 0x86, 0x81,
+ 0xf, 0xc8, 0x9e, 0x18, 0xa0, 0x1c, 0x88, 0x51,
+ 0x1a, 0xbd, 0x18, 0x88, 0x23, 0xf, 0xcc, 0x40,
+ 0x51, 0xc1, 0x9a, 0x18, 0x6a, 0xf, 0xe9, 0x30,
+ 0xf3, 0xc1, 0x9b, 0xc,
+
+ /* U+E70E "" */
+ 0xf, 0xfe, 0x57, 0xc1, 0xff, 0xcd, 0x44, 0x3f,
+ 0xcf, 0xa0, 0xf9, 0xba, 0x61, 0xf7, 0x21, 0x90,
+ 0xfd, 0x86, 0x90, 0xff, 0xa2, 0xe0, 0xfe, 0x78,
+ 0x42, 0xf2, 0x1c, 0xf8, 0x3b, 0xb, 0xe, 0x42,
+ 0x4c, 0x18, 0x4d, 0xe8, 0x2c, 0x39, 0x91, 0x10,
+ 0xfc, 0xdf, 0x41, 0xff, 0xe0, 0xa0, 0x40,
+
+ /* U+E717 "" */
+ 0xf, 0x28, 0x83, 0xff, 0x83, 0x4d, 0x41, 0xff,
+ 0xc0, 0xc1, 0x21, 0xf3, 0x86, 0x44, 0x2e, 0xe,
+ 0x43, 0xff, 0x82, 0xc5, 0x1d, 0x39, 0xc7, 0x3,
+ 0xc, 0x50, 0x62, 0x50, 0xce, 0x9a, 0xb4, 0xda,
+ 0x7, 0xff, 0x5d, 0x9d, 0x35, 0x69, 0xb4, 0x3,
+ 0xc, 0x50, 0x62, 0x50, 0xc5, 0x1d, 0x39, 0xc7,
+ 0xc, 0x87, 0xf2, 0x19, 0xc3, 0x22, 0x15, 0x3,
+ 0xf6, 0x9, 0xf, 0xfe, 0x5, 0x35, 0x7, 0x80,
+
+ /* U+E72A "" */
+ 0x7f, 0xff, 0x80, 0xc1, 0xff, 0xc0, 0x81, 0xe3,
+ 0xf, 0xf5, 0x8, 0x3f, 0xca, 0x10, 0xff, 0xe0,
+ 0x37, 0xa4, 0x3e, 0xa2, 0x6, 0x81, 0xca, 0xf,
+ 0x28, 0x36, 0x1c, 0xe6, 0x19, 0xc, 0xc0, 0x43,
+ 0xf3, 0x7, 0xfc, 0xc1, 0xfd, 0x3, 0xb, 0x20,
+ 0xca, 0x2e, 0xc5, 0x7, 0x50, 0x9, 0x40, 0xf9,
+ 0xfc, 0x86, 0x83, 0xff, 0x81, 0x0,
+
+ /* U+E75A "" */
+ 0xf, 0xfe, 0xb, 0x4c, 0x3f, 0x9b, 0xd2, 0x83,
+ 0xd7, 0xd2, 0x1f, 0xf2, 0x1c, 0xde, 0xf, 0xe6,
+ 0xf4, 0x87, 0xfd, 0x21, 0xff, 0xda, 0x50, 0x7f,
+ 0xf0, 0x5e, 0x81, 0x9e, 0xf, 0x41, 0xea, 0x8,
+ 0x7f, 0xf0, 0x50, 0xff, 0xe1, 0x21, 0xff, 0x61,
+ 0xa1, 0xd, 0x7, 0x7e, 0x4, 0x82, 0x43, 0xfc,
+
+ /* U+E75F "" */
+ 0xf, 0xfe, 0x64, 0x1f, 0xfc, 0x39, 0xf, 0xfe,
+ 0x14, 0x87, 0xff, 0xa, 0x43, 0x21, 0x92, 0xf9,
+ 0xe, 0xb0, 0x70, 0x7f, 0xd9, 0xe3, 0xf, 0xfe,
+ 0x4, 0x8, 0x3f, 0xf8, 0x30, 0x20, 0xff, 0xe0,
+ 0x67, 0x8c, 0xbe, 0x43, 0xac, 0x1c, 0x1d, 0x21,
+ 0x90, 0xc8, 0x7a, 0x43, 0xff, 0x89, 0x21, 0xff,
+ 0xc4, 0x83, 0xf8,
+
+ /* U+E769 "" */
+ 0xf, 0xfe, 0x45, 0x87, 0xff, 0x9d, 0xf2, 0x7c,
+ 0x1e, 0x83, 0xe4, 0x34, 0x1f, 0xa0, 0xc8, 0x7f,
+ 0x20, 0x83, 0xfd, 0x1, 0xf, 0xf9, 0x2b, 0xff,
+ 0x80, 0x5, 0xc5, 0x35, 0xe0, 0xe4, 0x18, 0x70,
+
+ /* U+E7AE "" */
+ 0xf, 0xfe, 0x2, 0x83, 0xff, 0x87, 0x56, 0x1f,
+ 0xfc, 0xb, 0x42, 0x83, 0xf9, 0xd0, 0xe4, 0x3e,
+ 0x78, 0x3f, 0xf8, 0x70, 0x7f, 0x21, 0xff, 0xc4,
+ 0xa0, 0x55, 0x8, 0x7e, 0x43, 0x2e, 0x83, 0xff,
+ 0x82, 0x82, 0x21, 0xe0, 0x21, 0xd0, 0x67, 0x84,
+ 0x10, 0x7a, 0x20, 0xff, 0xe1, 0xb2, 0x1f, 0xbf,
+ 0x6, 0x43, 0xe8, 0x3c,
+
+ /* U+E81B "" */
+ 0xf, 0xaf, 0xf9, 0xf, 0x94, 0x1f, 0x41, 0xfd,
+ 0x7f, 0x7, 0xff, 0xda, 0xf, 0xfe, 0x1a, 0xc1,
+ 0xff, 0xc2, 0x74, 0x3f, 0xff, 0x7f, 0xe8, 0xbf,
+ 0x81, 0x7, 0xff, 0x14,
+
+ /* U+E81C "" */
+ 0xf, 0xab, 0xf0, 0x7e, 0x97, 0xf4, 0xf, 0xe4,
+ 0xff, 0x8, 0x7f, 0xfe, 0xec, 0x3f, 0xf8, 0x76,
+ 0x1f, 0xff, 0xf0, 0xf6, 0x1f, 0x7f, 0x81, 0x7,
+ 0xff, 0x14,
+
+ /* U+E8DD "" */
+ 0x7, 0xf0, 0x50, 0x7e, 0x43, 0x90, 0xfd, 0x8,
+ 0x7e, 0xc3, 0xe6, 0xff, 0x90, 0xac, 0x3f, 0xff,
+ 0x1e, 0x4f, 0x41, 0xfe,
+
+ /* U+E917 "" */
+ 0x7f, 0xff, 0x80, 0xc1, 0xff, 0xc0, 0x81, 0xe3,
+ 0xf, 0xf7, 0x88, 0x3f, 0xf8, 0x28, 0x7f, 0xf0,
+ 0x1b, 0xd2, 0x1f, 0x51, 0x3, 0x40, 0xe5, 0x49,
+ 0x22, 0x83, 0x62, 0x7, 0x6, 0x19, 0x18, 0x50,
+ 0x10, 0xf4, 0x50, 0xc3, 0xf9, 0x44, 0x1f, 0x40,
+ 0xc3, 0x30, 0x65, 0xe, 0x38, 0x87, 0x50, 0x35,
+ 0x3, 0xe7, 0xf2, 0x1a, 0xf, 0xfe, 0x4,
+
+ /* U+E91C "" */
+ 0xf, 0x7e, 0xf, 0xc8, 0x64, 0x3e, 0x83, 0x41,
+ 0xe4, 0x3f, 0xf8, 0x10, 0x7a, 0xc, 0x87, 0xc8,
+ 0x6c, 0x3f, 0x41, 0x75, 0xfb, 0xa0, 0xbb, 0xcb,
+ 0xe0, 0xe5, 0x7, 0xff, 0x1f, 0xf8, 0x3f, 0x57,
+ 0xc1, 0xe5, 0xf8, 0x3f, 0xf8, 0xa0,
+
+ /* U+E95F "" */
+ 0xc, 0xa0, 0xff, 0x54, 0xd1, 0xf, 0x99, 0x52,
+ 0x1f, 0xe5, 0x5, 0x8, 0x69, 0x2, 0xd0, 0x54,
+ 0xc1, 0x11, 0xa, 0x29, 0x90, 0x1a, 0x10, 0x87,
+ 0x90, 0xc8, 0x10, 0xfd, 0x42, 0xf, 0xe4, 0x43,
+ 0xfd, 0x98, 0x7f, 0xa2, 0xf, 0xe4, 0x43, 0xe7,
+ 0xc0, 0xfc, 0x1f, 0xfc, 0x20,
+
+ /* U+E96B "" */
+ 0x5, 0xf2, 0x7, 0xe8, 0x36, 0x89, 0x58, 0x5b,
+ 0x44, 0x7b, 0x5d, 0xd3, 0x22, 0x21, 0xd0, 0x3a,
+ 0x8, 0x44, 0x60, 0xf4, 0x89, 0xe8, 0x57, 0x81,
+ 0xe5, 0x3, 0x83, 0x41, 0xe8, 0x3f, 0xf8, 0x14,
+ 0xf, 0xfb, 0xf5, 0x3f, 0x7, 0xff, 0x33, 0x43,
+ 0xce, 0x1f, 0xa4, 0x33, 0x7, 0xfa, 0x40, 0xc1,
+ 0xff, 0xcb, 0x6b, 0x90, 0x35, 0xe0, 0x2f, 0x6,
+ 0x5f, 0xa, 0xf, 0xfe, 0xe, 0x0,
+
+ /* U+E99D "" */
+ 0xf, 0xfe, 0x55, 0xf2, 0x1f, 0xd6, 0x85, 0x70,
+ 0x66, 0xd0, 0xf9, 0xe0, 0x48, 0x7f, 0xce, 0x1f,
+ 0x90, 0xff, 0xe0, 0xbf, 0x21, 0xff, 0x5c, 0xc1,
+ 0xff, 0xce, 0x8f, 0x24, 0x1f, 0xc8, 0x72, 0x1f,
+ 0xfc, 0x74, 0x43, 0xff, 0x83, 0x90, 0x48, 0x72,
+ 0x12, 0x4, 0x17, 0xf4, 0x8, 0x28, 0x3f, 0xca,
+ 0xd, 0x87, 0xe6, 0xf, 0x68, 0x75, 0x3, 0xf5,
+ 0x11, 0xd0, 0xff, 0x37, 0x7, 0x80,
+
+ /* U+E9A0 "" */
+ 0xf, 0xfe, 0x15, 0x3, 0xff, 0x87, 0xab, 0xf,
+ 0xfe, 0x5, 0x94, 0x10, 0xff, 0x48, 0x34, 0xc3,
+ 0xfd, 0xad, 0x87, 0xff, 0x5, 0xa9, 0xf, 0xfe,
+ 0xdb, 0xff, 0xfc, 0x30, 0xff, 0xe4, 0x20, 0xff,
+ 0xfe, 0x0, 0xc2, 0x1f, 0xfc, 0x5c, 0xc3, 0xfd,
+ 0x98, 0x14, 0x7f, 0xf8, 0x50, 0x52, 0x1f, 0xe6,
+ 0xf, 0xbf, 0xf0, 0x7f, 0x21, 0xfa, 0xc,
+
+ /* U+E9AB "" */
+ 0xf, 0xcf, 0xf4, 0x1f, 0xd0, 0xb0, 0xa0, 0xff,
+ 0x5e, 0x83, 0xff, 0x83, 0x40, 0xff, 0xe9, 0x78,
+ 0x3f, 0xfa, 0xef, 0xfc, 0xf, 0xa0, 0xff, 0xe2,
+ 0xa8, 0x7f, 0xfc, 0x19, 0x60, 0xfc, 0x88, 0x22,
+ 0x43, 0xcc, 0x41, 0x6d, 0xa1, 0x50, 0x83, 0xa8,
+ 0x41, 0x24, 0x87, 0x90, 0x7c, 0x4, 0x3f, 0xf8,
+ 0xe0,
+
+ /* U+EA70 "" */
+ 0xa1, 0x40, 0x48, 0x66, 0x14, 0x28, 0xe, 0x17,
+ 0x21, 0xff, 0xc0, 0x83, 0xff, 0x86, 0x87, 0xff,
+ 0x6b, 0x7, 0x83, 0xf9, 0xf, 0xb0, 0xfa, 0xf,
+ 0x48, 0x7e, 0xe0, 0x5a, 0x1f, 0xe4, 0x8, 0x75,
+ 0x3, 0xff, 0x84, 0xa0, 0xff, 0xff, 0x87, 0xe0,
+
+ /* U+EA7A "" */
+ 0xe, 0xfd, 0x6, 0x7f, 0x6, 0x7f, 0x7, 0xff,
+ 0x9, 0x8f, 0xfd, 0x18, 0x76, 0x9e, 0xf, 0xff,
+ 0xf8, 0x7f, 0xf1, 0xa4, 0xa0, 0x7f, 0x20, 0x50,
+ 0x7d, 0xff, 0xa0, 0x90, 0xff, 0x20,
+
+ /* U+EAAC "" */
+ 0x7f, 0xff, 0x80, 0xc1, 0xff, 0xc0, 0x81, 0xe3,
+ 0xf, 0xf7, 0x8c, 0x3f, 0xf9, 0x9f, 0xfe, 0xf,
+ 0xfe, 0x53, 0x7, 0xff, 0x2, 0x43, 0xfe, 0x81,
+ 0x7, 0xf9, 0x2, 0x1f, 0xfd, 0xae, 0x98, 0x7f,
+ 0xca, 0xf, 0xdf, 0xfe, 0x4, 0x1f, 0xfc, 0x8,
+
+ /* U+EAD7 "" */
+ 0x7f, 0xff, 0x85, 0x10, 0x7f, 0xf0, 0x98, 0xe,
+ 0xc, 0x1e, 0x6, 0x1d, 0x86, 0x43, 0xfe, 0xc3,
+ 0xff, 0x88, 0xe0, 0xd3, 0xc0, 0xc3, 0xff, 0x92,
+ 0xff, 0xff, 0x4, 0xe, 0x1f, 0xfc, 0x17,
+
+ /* U+EC99 "" */
+ 0x2b, 0xff, 0x86, 0x6b, 0xff, 0xc3, 0x87, 0xff,
+ 0xa1, 0xc3, 0xff, 0xa1, 0xe0, 0x38, 0x7f, 0xf1,
+ 0x10, 0xff, 0xe1, 0xb0, 0x7f, 0xf0, 0xdc, 0x3f,
+ 0xfa, 0x1e, 0xf, 0x9a, 0xff, 0x7, 0x42, 0xff,
+ 0x7, 0x40,
+
+ /* U+EF5F "" */
+ 0x7f, 0xff, 0x8a, 0x42, 0xff, 0xf0, 0xc4, 0x15,
+ 0xff, 0xc3, 0xf, 0xfe, 0xd6, 0x87, 0xff, 0x49,
+ 0xff, 0x7, 0xff, 0x2, 0x6, 0x81, 0xf, 0xfe,
+ 0xc, 0x41, 0xff, 0xc4, 0x84, 0x3f, 0xf8, 0xbc,
+ 0x1f, 0xfc, 0x4f, 0x90, 0xdf, 0xf0, 0x51, 0xd0,
+ 0x10, 0x7f, 0xca, 0x10, 0x9f, 0xf0, 0x74, 0xa8,
+ 0x3f, 0x38, 0x73, 0x7c, 0x1f, 0xfc, 0x18, 0x64,
+ 0x8,
+
+ /* U+EFC6 "" */
+ 0xf, 0xf9, 0xb9, 0xf, 0xfe, 0x7, 0x23, 0x40,
+ 0xff, 0x43, 0xe8, 0x50, 0x7f, 0x2a, 0x3, 0x98,
+ 0x7f, 0xf1, 0x50, 0xff, 0x61, 0xf3, 0xff, 0x8b,
+ 0x42, 0xf4, 0x1f, 0xf4, 0x1f, 0xfe, 0x27, 0x43,
+ 0xff, 0x87, 0x10, 0x7f, 0xf5, 0x62, 0xf, 0xfe,
+ 0x1b, 0xa1, 0xff, 0xe2, 0x83, 0xfe, 0x83, 0x80,
+
+ /* U+F001 "" */
+ 0xf, 0xfe, 0xc3, 0x70, 0x7f, 0xf0, 0x5f, 0x48,
+ 0x87, 0xf3, 0x7a, 0xf, 0xfe, 0x3, 0x72, 0x1f,
+ 0xfc, 0x2e, 0x43, 0xff, 0xa0, 0xa0, 0xff, 0xe1,
+ 0xb7, 0x7, 0xff, 0x6, 0xf4, 0x87, 0xff, 0x1,
+ 0xf2, 0x1f, 0xff, 0xf0, 0xfe, 0x50, 0x7f, 0xf1,
+ 0x2e, 0x88, 0x7f, 0xf0, 0x94, 0x1f, 0x3f, 0x7,
+ 0xff, 0xe, 0x81, 0xfe, 0x50, 0x74, 0x87, 0xb0,
+ 0xeb, 0xab, 0x50, 0x79, 0xf, 0x96, 0x5, 0x2,
+ 0x70, 0xff, 0xe0, 0x80,
+
+ /* U+F008 "" */
+ 0xc1, 0x7f, 0xff, 0x0, 0x2c, 0xf2, 0x1f, 0xfc,
+ 0xf, 0x80, 0xa0, 0x5f, 0xf8, 0xb, 0x2, 0x88,
+ 0x7f, 0xf0, 0x2a, 0xf, 0xfe, 0x57, 0x90, 0xff,
+ 0xe0, 0x7c, 0xa, 0x26, 0xbf, 0x81, 0x50, 0x14,
+ 0x6, 0xbf, 0x1, 0x60, 0x28, 0xd, 0x7e, 0x2,
+ 0xc0, 0xa2, 0x6b, 0xf8, 0x15, 0x3, 0xc8, 0x7f,
+ 0xf0, 0x3e, 0xf, 0xfe, 0x55, 0x10, 0xff, 0xe0,
+ 0x54, 0x5, 0x2, 0xff, 0xc0, 0x58, 0x1e, 0x43,
+ 0xff, 0x81, 0xf0,
+
+ /* U+F00B "" */
+ 0xfe, 0x8b, 0xff, 0xf8, 0x1, 0xc8, 0x87, 0xff,
+ 0xb5, 0x10, 0xff, 0xe0, 0x7f, 0x45, 0xff, 0xfc,
+ 0x58, 0xbf, 0xff, 0x80, 0x1c, 0x88, 0x7f, 0xfb,
+ 0x51, 0xf, 0xfe, 0x7, 0xf4, 0x5f, 0xff, 0xc5,
+ 0x8b, 0xff, 0xf8, 0x1, 0xc8, 0x87, 0xff, 0xb5,
+ 0x10, 0xff, 0xe0, 0x0,
+
+ /* U+F00C "" */
+ 0xf, 0xfe, 0x23, 0xa1, 0xff, 0xc4, 0x62, 0x43,
+ 0xff, 0x84, 0xc1, 0x41, 0xff, 0xc1, 0x60, 0xd0,
+ 0x7f, 0xf0, 0x18, 0x34, 0x8e, 0x87, 0xcc, 0x1a,
+ 0x46, 0x24, 0x39, 0x83, 0x48, 0x20, 0xa4, 0x26,
+ 0xd, 0x21, 0x41, 0xa4, 0x60, 0xd2, 0x19, 0x83,
+ 0x54, 0x1a, 0x43, 0xcc, 0x19, 0xd, 0x21, 0xf9,
+ 0x83, 0xe9, 0xf, 0xf3, 0x7, 0x48, 0x7f, 0xf0,
+ 0x18, 0x29, 0xf, 0xfe, 0x13, 0x12, 0x1f, 0xe0,
+
+ /* U+F00D "" */
+ 0x28, 0x1f, 0xa4, 0x95, 0x87, 0xb6, 0x50, 0x58,
+ 0x6c, 0x2e, 0xd, 0x83, 0xd, 0x30, 0x6f, 0x6,
+ 0xc0, 0xc1, 0xfb, 0xc, 0xc1, 0xec, 0x3c, 0x87,
+ 0xff, 0x7, 0xf, 0x61, 0xd8, 0x7e, 0xc2, 0xc3,
+ 0x70, 0x6c, 0xc3, 0x63, 0x6, 0x83, 0x61, 0x30,
+ 0x6c, 0x18, 0x73, 0xc,
+
+ /* U+F011 "" */
+ 0xf, 0xe4, 0x3f, 0xf8, 0xdd, 0x87, 0xff, 0x6,
+ 0xf, 0xe8, 0x3f, 0x6e, 0x1f, 0x4e, 0x1e, 0xc3,
+ 0xfc, 0x83, 0xd, 0x5, 0x7, 0xd0, 0x50, 0x48,
+ 0x24, 0x3e, 0x60, 0x28, 0x82, 0x43, 0xf9, 0x40,
+ 0xc4, 0x10, 0x7f, 0xd8, 0x10, 0xc8, 0x7f, 0xc8,
+ 0x7f, 0xf8, 0xd0, 0xdf, 0x6, 0x43, 0x20, 0x83,
+ 0xfe, 0x80, 0x90, 0x50, 0x7f, 0x21, 0x40, 0x40,
+ 0xc1, 0xf3, 0x1, 0xa, 0x9, 0xd0, 0x9a, 0x5,
+ 0x6, 0xc3, 0x5f, 0x48, 0x58, 0x7b, 0x43, 0xf9,
+ 0xc3, 0xf5, 0xa1, 0xcd, 0x3, 0xfe, 0xbf, 0xa4,
+ 0x3c,
+
+ /* U+F013 "" */
+ 0xf, 0xfe, 0x7b, 0xfa, 0xf, 0xfe, 0xb6, 0x19,
+ 0xf, 0xe7, 0x9d, 0xe, 0xe7, 0x83, 0x43, 0x7,
+ 0xe6, 0x14, 0x8, 0x3f, 0xf8, 0x90, 0x10, 0xfa,
+ 0x81, 0xf9, 0x20, 0xf6, 0xad, 0xe, 0x50, 0xc1,
+ 0xb0, 0xd0, 0x66, 0xf, 0xfe, 0xf3, 0x6, 0xc3,
+ 0x41, 0x98, 0x10, 0x7b, 0x54, 0x87, 0x28, 0x43,
+ 0xea, 0x21, 0xf2, 0x41, 0xff, 0xc4, 0x82, 0x86,
+ 0xf, 0xcc, 0x28, 0x27, 0x9d, 0xe, 0xe7, 0x83,
+ 0xfb, 0xc, 0x87, 0xff, 0x59, 0xfd, 0x7, 0xc0,
+
+ /* U+F015 "" */
+ 0xf, 0xf2, 0x83, 0x32, 0x1f, 0xfc, 0x1a, 0xb0,
+ 0xa6, 0xf, 0xfe, 0x6, 0x85, 0xa1, 0xff, 0xc3,
+ 0xc2, 0x81, 0x40, 0xff, 0xe0, 0x38, 0x1d, 0xc0,
+ 0x87, 0xfd, 0x40, 0x55, 0x98, 0x7f, 0xf0, 0x24,
+ 0x13, 0xa6, 0xe8, 0x48, 0x76, 0x83, 0x70, 0xd5,
+ 0x81, 0x20, 0x70, 0x3b, 0x87, 0x99, 0x81, 0x42,
+ 0x3, 0x30, 0x7e, 0x77, 0x2, 0xa2, 0xb0, 0x7f,
+ 0xdb, 0x8b, 0x6b, 0x7, 0xff, 0x6, 0x38, 0x3f,
+ 0xfa, 0xb7, 0xc1, 0xff, 0xff, 0xf, 0x90, 0xff,
+ 0xe1, 0x21, 0x80,
+
+ /* U+F019 "" */
+ 0xf, 0xcb, 0x83, 0xff, 0x86, 0xd6, 0x43, 0xff,
+ 0x85, 0x86, 0xc3, 0xff, 0xfe, 0x1f, 0xfd, 0x77,
+ 0xe4, 0x33, 0xf2, 0x1f, 0xfc, 0xe6, 0xf, 0xf4,
+ 0x87, 0xcc, 0x1f, 0xa4, 0x3f, 0x98, 0x3d, 0x21,
+ 0xff, 0x30, 0x69, 0xf, 0x35, 0xe6, 0x4, 0xd7,
+ 0x99, 0x7d, 0xbe, 0x75, 0xf4, 0x1f, 0xba, 0x61,
+ 0xff, 0xc5, 0x50, 0x7f, 0xf2, 0xf2, 0x43, 0xff,
+ 0x89, 0x92, 0xf, 0xff, 0xe4, 0x0,
+
+ /* U+F01C "" */
+ 0xe, 0xff, 0xfe, 0x4, 0x1f, 0xd8, 0x7f, 0xf0,
+ 0x18, 0x3e, 0x80, 0xbf, 0xe0, 0x21, 0xe5, 0xd,
+ 0x7f, 0xb0, 0x61, 0xd0, 0x20, 0xff, 0x90, 0x41,
+ 0x40, 0x83, 0xff, 0x81, 0x1, 0x2, 0x85, 0x7,
+ 0xff, 0x7, 0x6, 0x41, 0x54, 0x87, 0xd5, 0x82,
+ 0x42, 0x5d, 0x21, 0xda, 0xe0, 0xff, 0xe0, 0x41,
+ 0x90, 0xfd, 0x87, 0xf7, 0xe8, 0x3f, 0xff, 0xe0,
+ 0xe0, 0xff, 0xe4, 0x28,
+
+ /* U+F020 "" */
+ 0xf, 0xef, 0x7, 0xff, 0x9, 0x2, 0x1f, 0xfc,
+ 0x18, 0x18, 0x7f, 0xd6, 0x13, 0xc1, 0x70, 0x2d,
+ 0xf, 0x3c, 0x1d, 0xf, 0xf8, 0x10, 0x79, 0x41,
+ 0xf2, 0x13, 0x52, 0x1f, 0xfc, 0x15, 0x80, 0x86,
+ 0x4c, 0x27, 0xf1, 0x86, 0xc4, 0x3f, 0xf8, 0x48,
+ 0x7f, 0x94, 0x1c, 0x87, 0xfc, 0x81, 0xe, 0xe0,
+ 0xd9, 0x7a, 0x30, 0xfe, 0x60, 0xd2, 0x1f, 0xe5,
+ 0x1, 0x41, 0xff, 0xc0, 0x81, 0x7, 0x0,
+
+ /* U+F021 "" */
+ 0xf, 0xfe, 0x2f, 0xc1, 0xe6, 0xfd, 0x7, 0xfc,
+ 0xf2, 0x19, 0xe0, 0xfd, 0x40, 0xfe, 0x74, 0x3a,
+ 0x40, 0xdf, 0xa0, 0xa0, 0xca, 0x5, 0x10, 0xcf,
+ 0x7, 0xa0, 0x48, 0x77, 0xd0, 0x72, 0x5, 0x7,
+ 0xff, 0xf, 0x4, 0x1f, 0xfc, 0x4b, 0xc1, 0xfb,
+ 0xff, 0x83, 0xff, 0xb9, 0xff, 0xc1, 0xfb, 0xd0,
+ 0x7f, 0xf1, 0x20, 0x61, 0xf9, 0xf, 0x28, 0x8,
+ 0x75, 0xe8, 0x39, 0x81, 0x7, 0xad, 0xc, 0xf0,
+ 0x14, 0x1a, 0xa, 0xfd, 0x4, 0xc1, 0xce, 0x87,
+ 0xf5, 0x3, 0xf5, 0xa1, 0x9b, 0x43, 0xfe, 0xbf,
+ 0x48, 0x78,
+
+ /* U+F026 "" */
+ 0xf, 0xfe, 0x37, 0x83, 0xec, 0x3f, 0x61, 0x35,
+ 0xb0, 0xd2, 0xe0, 0xff, 0xfa, 0xff, 0x21, 0xfd,
+ 0x21, 0xfd, 0x21, 0xfd, 0x44,
+
+ /* U+F027 "" */
+ 0xf, 0xcc, 0x1f, 0xfc, 0xa, 0x21, 0xff, 0x48,
+ 0x7f, 0xf0, 0x24, 0x3f, 0x7f, 0x21, 0xe4, 0x3f,
+ 0xf8, 0x56, 0x87, 0xff, 0x2, 0x20, 0xff, 0xe0,
+ 0x21, 0xff, 0xc2, 0x43, 0xff, 0x85, 0x10, 0x7f,
+ 0xf0, 0x19, 0x97, 0x7, 0xd2, 0x35, 0xb0, 0xff,
+ 0xe1, 0xe1, 0xff, 0xc3, 0xc3, 0xff, 0x87, 0xe0,
+ 0xe0,
+
+ /* U+F028 "" */
+ 0xf, 0xfe, 0x23, 0xa1, 0xff, 0xca, 0x90, 0xff,
+ 0xbc, 0x1e, 0x62, 0x43, 0xfb, 0xf, 0x30, 0xc4,
+ 0x1f, 0xb0, 0xfa, 0x71, 0x44, 0x35, 0xb0, 0xfd,
+ 0x82, 0x21, 0x25, 0xc1, 0xf2, 0x8c, 0x40, 0x88,
+ 0x7f, 0xf0, 0x28, 0x91, 0x11, 0x87, 0xff, 0x2,
+ 0x21, 0x10, 0x90, 0xff, 0xe0, 0x21, 0xff, 0xca,
+ 0x43, 0xff, 0x95, 0x10, 0x88, 0x88, 0x7f, 0xf0,
+ 0x28, 0x91, 0x19, 0xfe, 0x43, 0xca, 0x31, 0x2,
+ 0x21, 0xd2, 0x1f, 0x60, 0x88, 0x43, 0xe9, 0xf,
+ 0x4e, 0x28, 0x83, 0xf5, 0x10, 0xcc, 0x31, 0x7,
+ 0xf9, 0x83, 0xcc, 0x48, 0x7f, 0xf2, 0x24, 0x20,
+
+ /* U+F03E "" */
+ 0x7f, 0xff, 0x8c, 0xc1, 0xff, 0xc6, 0x82, 0xb4,
+ 0x3f, 0xf8, 0x92, 0x48, 0x7f, 0xf0, 0xd0, 0xb0,
+ 0xf2, 0x1f, 0xa0, 0xa0, 0xe6, 0xc3, 0xe6, 0x70,
+ 0xe6, 0x6, 0x1f, 0x30, 0x73, 0x6, 0xc3, 0xe7,
+ 0x80, 0xc1, 0xe4, 0x39, 0x86, 0x60, 0xff, 0xe0,
+ 0x30, 0x4c, 0x1f, 0xfc, 0x1c, 0x3f, 0xf8, 0xfd,
+ 0x7f, 0xf0, 0x90, 0xcb, 0xff, 0xc3, 0xa, 0xf,
+ 0xfe, 0x34,
+
+ /* U+F043 "" */
+ 0xf, 0xfe, 0x47, 0x83, 0xfe, 0x41, 0x7, 0xfa,
+ 0x2, 0x1f, 0xc8, 0x64, 0x3f, 0x41, 0xa0, 0xfa,
+ 0xf, 0x41, 0xe4, 0x3c, 0x87, 0x61, 0xfb, 0xa,
+ 0xf, 0xf4, 0x4, 0x3f, 0xc9, 0x7, 0xff, 0x2,
+ 0x43, 0xff, 0x80, 0x81, 0x83, 0xff, 0x82, 0x87,
+ 0xf9, 0x12, 0xf, 0xce, 0x9, 0x83, 0xed, 0x3,
+ 0x1c, 0x1c, 0x98, 0x1b, 0x83, 0x61, 0x68, 0x79,
+ 0xc3, 0xae, 0xb7, 0x4,
+
+ /* U+F048 "" */
+ 0x64, 0x3f, 0x24, 0xc1, 0xf7, 0x40, 0xfc, 0xe1,
+ 0xfe, 0x60, 0xff, 0x30, 0x7f, 0x98, 0x3f, 0xd4,
+ 0xf, 0xf4, 0x87, 0xfc, 0x87, 0xff, 0x6b, 0xf,
+ 0xfe, 0xe, 0x1f, 0xfc, 0x1c, 0x3f, 0xf8, 0x38,
+ 0x7f, 0xf0, 0x74, 0x3f, 0xf8, 0x12, 0x1f, 0xfc,
+ 0x9, 0x3f, 0x7, 0xd6, 0x80,
+
+ /* U+F04B "" */
+ 0x14, 0x1f, 0xfc, 0x3a, 0xb0, 0xff, 0xe1, 0x21,
+ 0x70, 0x7f, 0xf1, 0x5d, 0xf, 0xfe, 0x2d, 0xa1,
+ 0xff, 0xc5, 0xa0, 0x7f, 0xf1, 0x5e, 0xf, 0xfe,
+ 0x2b, 0xa1, 0xff, 0xc5, 0xa0, 0x7f, 0xf1, 0x5c,
+ 0x3f, 0xf8, 0xc8, 0x7f, 0xf1, 0x50, 0xff, 0xe1,
+ 0xb8, 0x7f, 0xf0, 0xe8, 0x1f, 0xfc, 0x27, 0x43,
+ 0xff, 0x82, 0xf0, 0x7f, 0xf0, 0xa8, 0x1f, 0xfc,
+ 0x2b, 0x43, 0xff, 0x82, 0xe8, 0x7f, 0x90, 0xb8,
+ 0x3f, 0xf8, 0x15, 0x61, 0xff, 0xc2,
+
+ /* U+F04C "" */
+ 0x1a, 0xc1, 0xcd, 0x60, 0x51, 0x76, 0x15, 0x17,
+ 0x62, 0x1e, 0x40, 0x87, 0x90, 0xfb, 0xf, 0xec,
+ 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xff, 0xee,
+ 0x1f, 0xdc, 0x1c, 0xa0, 0x41, 0xca,
+
+ /* U+F04D "" */
+ 0x1a, 0xff, 0xe0, 0xa0, 0xa2, 0xff, 0xf0, 0x6c,
+ 0x43, 0xff, 0x88, 0x87, 0xff, 0x17, 0xf, 0xff,
+ 0xf8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xb8,
+ 0x3f, 0xf8, 0x6a,
+
+ /* U+F051 "" */
+ 0x10, 0xfc, 0xca, 0xb4, 0x3d, 0x36, 0x9, 0xf,
+ 0xfe, 0x4, 0x87, 0xff, 0x2, 0x81, 0xff, 0xc0,
+ 0x60, 0xff, 0xe0, 0x30, 0x7f, 0xf0, 0x1c, 0x3f,
+ 0xfc, 0xf0, 0x7f, 0xda, 0x1f, 0xec, 0x3f, 0xec,
+ 0x3f, 0xec, 0x3f, 0xec, 0x3f, 0x43, 0x87, 0xfb,
+ 0x83, 0xef, 0x80,
+
+ /* U+F052 "" */
+ 0xf, 0xfe, 0x7d, 0xe4, 0x3f, 0xf8, 0x52, 0x8,
+ 0x3f, 0xf8, 0x32, 0x1b, 0xf, 0xf9, 0x41, 0xec,
+ 0x3f, 0x98, 0x3f, 0x61, 0xf3, 0x7, 0xfb, 0xe,
+ 0x60, 0xff, 0xe0, 0x41, 0xa0, 0xff, 0xe0, 0xb0,
+ 0x30, 0xff, 0xe1, 0xa8, 0x3f, 0xf9, 0x10, 0x7f,
+ 0xf1, 0x11, 0xff, 0xfe, 0x20, 0x2f, 0xff, 0xe2,
+ 0x1, 0xf, 0xfe, 0x22, 0x1f, 0xfc, 0x6c, 0x3f,
+ 0xf8, 0xd8, 0x87, 0xff, 0x11,
+
+ /* U+F053 "" */
+ 0xf, 0xfe, 0x33, 0xc1, 0xf3, 0xa, 0xe, 0x60,
+ 0x90, 0xcc, 0x16, 0x19, 0x82, 0xc3, 0x30, 0x58,
+ 0x66, 0xb, 0xc, 0xc1, 0x61, 0xd0, 0x50, 0x7a,
+ 0xa, 0xf, 0x30, 0x58, 0x79, 0x82, 0xc3, 0xcc,
+ 0x16, 0x1e, 0x60, 0xb0, 0xf3, 0x5, 0x87, 0x98,
+ 0x24, 0x3c, 0xc2, 0x83, 0xe7, 0x80,
+
+ /* U+F054 "" */
+ 0xf, 0xfe, 0x7, 0x7, 0xec, 0x70, 0xf9, 0xb,
+ 0xf, 0x48, 0x58, 0x7a, 0x42, 0xc3, 0xd2, 0x16,
+ 0x1e, 0x90, 0xb0, 0xf4, 0x85, 0x87, 0xa0, 0xc8,
+ 0x74, 0x19, 0xd, 0x21, 0x61, 0xa4, 0x2c, 0x34,
+ 0x85, 0x86, 0x90, 0xb0, 0xd2, 0x16, 0x1c, 0x85,
+ 0x87, 0xb1, 0xc3, 0xf7, 0x7, 0xe0,
+
+ /* U+F067 "" */
+ 0xf, 0x96, 0xf, 0xfe, 0x1d, 0x60, 0xff, 0xff,
+ 0x87, 0xff, 0x29, 0xaf, 0x4, 0xd7, 0x89, 0x7c,
+ 0x19, 0x7e, 0xf, 0xfe, 0x32, 0x1f, 0xfc, 0x5b,
+ 0xfc, 0x13, 0xfe, 0x43, 0xff, 0xfe, 0x1f, 0xfc,
+ 0xdc, 0x3e,
+
+ /* U+F068 "" */
+ 0x6f, 0xff, 0xe1, 0x44, 0x87, 0xff, 0x9, 0x41,
+ 0xff, 0xc6, 0x43, 0xff, 0x88, 0x80,
+
+ /* U+F06E "" */
+ 0xf, 0x9b, 0xfa, 0xf, 0xfe, 0xd, 0xc8, 0x73,
+ 0xe4, 0x3f, 0xb4, 0xf, 0xe8, 0x2a, 0x7, 0x9c,
+ 0x2a, 0xb, 0xb4, 0xe, 0x1d, 0x4, 0xa0, 0xaa,
+ 0x20, 0xd8, 0x58, 0x68, 0x2c, 0xc, 0x41, 0xa2,
+ 0xc, 0x84, 0xa0, 0x91, 0xc, 0xb0, 0x79, 0xe0,
+ 0xff, 0xe0, 0x68, 0x7f, 0xf2, 0x78, 0x32, 0x28,
+ 0x3b, 0x10, 0xca, 0x30, 0xd1, 0x21, 0x60, 0x83,
+ 0x41, 0x41, 0x28, 0xbe, 0x4, 0x1b, 0xc, 0xe1,
+ 0x50, 0x33, 0xa0, 0x70, 0xfb, 0x80, 0xfe, 0x82,
+ 0xa0, 0x7f, 0x3c, 0x87, 0x36, 0x87, 0x0,
+
+ /* U+F070 "" */
+ 0x2, 0x1f, 0xfc, 0xce, 0x81, 0xff, 0xcd, 0x70,
+ 0xff, 0xe5, 0x61, 0x68, 0x1b, 0xfa, 0xf, 0xfb,
+ 0x41, 0x4e, 0x43, 0x9f, 0x21, 0xfd, 0x40, 0x20,
+ 0x7f, 0x41, 0x50, 0x3f, 0x9c, 0x34, 0x19, 0xd0,
+ 0x38, 0x7f, 0xb4, 0x1a, 0xbc, 0x90, 0x6c, 0x3d,
+ 0xc0, 0xa0, 0x28, 0x9, 0x20, 0xd0, 0x68, 0x60,
+ 0x38, 0x7a, 0x10, 0xca, 0x9, 0x3, 0x85, 0xa1,
+ 0xff, 0xc0, 0xc2, 0x43, 0x61, 0x50, 0x3f, 0xec,
+ 0x28, 0x3f, 0x9c, 0x2e, 0xc, 0xa0, 0xd8, 0x68,
+ 0x3b, 0x9, 0xd, 0x7, 0xa0, 0x94, 0x1d, 0xa1,
+ 0xd8, 0x7c, 0xe1, 0x50, 0x3a, 0x81, 0xff, 0xc2,
+ 0xd0, 0x3f, 0x80, 0xe1, 0x68, 0x7f, 0x5c, 0x86,
+ 0x82, 0xd0, 0x48, 0x7f, 0x9b, 0xf4, 0x1a, 0x80,
+ 0xa0, 0x7f, 0xf2, 0x5c, 0x3f, 0xf9, 0xdd, 0x0,
+
+ /* U+F071 "" */
+ 0xf, 0xfa, 0xd0, 0xff, 0xe4, 0x49, 0x7, 0xff,
+ 0x21, 0xa, 0xf, 0xfe, 0x36, 0x19, 0x41, 0xff,
+ 0xc4, 0x43, 0xd0, 0x7f, 0xf1, 0x20, 0xf9, 0xf,
+ 0xfe, 0x12, 0x1f, 0xa0, 0xff, 0xe1, 0x40, 0x7e,
+ 0xa, 0xf, 0xfe, 0x4, 0x1f, 0xe4, 0x3f, 0xf8,
+ 0x8, 0x7f, 0xd0, 0x7f, 0xa0, 0xff, 0xe0, 0x21,
+ 0xfc, 0xa0, 0xc8, 0x10, 0xec, 0x3f, 0x41, 0xff,
+ 0xc3, 0x43, 0xc8, 0x7d, 0xe8, 0x3d, 0x7, 0xa0,
+ 0xfa, 0xd0, 0xf9, 0xd, 0x7, 0xca, 0x20, 0xfa,
+ 0xc, 0x87, 0xff, 0x1e, 0x4, 0x1f, 0x90, 0x41,
+ 0xf9, 0x2, 0x1f, 0xde, 0x43, 0xf9, 0xf, 0xfe,
+ 0x6f, 0x2f, 0xff, 0x1e, 0x40,
+
+ /* U+F074 "" */
+ 0xf, 0xfe, 0x1a, 0x83, 0xff, 0x8d, 0x44, 0x3f,
+ 0xf8, 0xf2, 0x7f, 0x21, 0xef, 0x82, 0x90, 0xe9,
+ 0xd, 0x87, 0xd0, 0x7a, 0x41, 0x7, 0xeb, 0xf0,
+ 0x59, 0x20, 0xb0, 0xa4, 0x36, 0x32, 0x80, 0xa0,
+ 0xa4, 0x3d, 0xcc, 0x6, 0x5, 0x10, 0xfc, 0xc0,
+ 0x60, 0x94, 0x1f, 0xd0, 0x50, 0x65, 0x7, 0xec,
+ 0x2c, 0xe0, 0x51, 0xf, 0x61, 0x66, 0x28, 0x29,
+ 0x3f, 0x5, 0x87, 0x58, 0x52, 0x1e, 0x82, 0xc3,
+ 0xf4, 0x1d, 0x21, 0xb0, 0xfa, 0xfe, 0x43, 0xdf,
+ 0x5, 0x21, 0xff, 0xc5, 0x90, 0xff, 0xe2, 0x51,
+ 0x0,
+
+ /* U+F077 "" */
+ 0xf, 0xd0, 0x7f, 0xf1, 0x37, 0xf, 0xfe, 0x16,
+ 0x16, 0x1f, 0xfc, 0xc, 0x3b, 0xf, 0xf6, 0x12,
+ 0x16, 0x1f, 0xb0, 0xaa, 0xb, 0xf, 0x61, 0x48,
+ 0xc1, 0x61, 0xb0, 0xa4, 0x26, 0xb, 0x6, 0x14,
+ 0x87, 0x30, 0x58, 0x82, 0x43, 0xe6, 0x2, 0x4c,
+ 0x87, 0xf3, 0x30,
+
+ /* U+F078 "" */
+ 0x24, 0x3f, 0xe6, 0x4, 0xc8, 0x7f, 0x33, 0x8,
+ 0x24, 0x3e, 0x60, 0x26, 0x14, 0x87, 0x30, 0x58,
+ 0x30, 0xa4, 0x26, 0xb, 0xd, 0x85, 0x23, 0x5,
+ 0x87, 0xb0, 0xaa, 0xb, 0xf, 0xd8, 0x48, 0x58,
+ 0x7f, 0xb0, 0xec, 0x3f, 0xf8, 0x18, 0x58, 0x7f,
+ 0xf0, 0xb7, 0xf, 0xc0,
+
+ /* U+F079 "" */
+ 0xc, 0xe1, 0xff, 0xcb, 0xa1, 0x84, 0xaa, 0xfc,
+ 0x87, 0xd2, 0x16, 0xa, 0x2f, 0xe9, 0xe, 0x90,
+ 0xec, 0x83, 0xfd, 0x86, 0x50, 0x7d, 0xbf, 0xf8,
+ 0x3f, 0xd8, 0x18, 0x3f, 0xf8, 0xcf, 0x83, 0x36,
+ 0x1f, 0xfc, 0xc4, 0x3f, 0xfd, 0xfa, 0x1d, 0xa1,
+ 0xff, 0xc4, 0x89, 0xb, 0x20, 0xf9, 0xaf, 0x24,
+ 0x8, 0x8, 0x10, 0xfc, 0xbe, 0xb3, 0xf, 0x30,
+ 0x7f, 0xf1, 0xb0, 0xcc, 0x1e, 0xff, 0xf8, 0x2c,
+ 0xc, 0x1f, 0xfc, 0xae, 0x81, 0x80,
+
+ /* U+F07B "" */
+ 0x7f, 0xe8, 0x3f, 0xe8, 0x3e, 0x60, 0xff, 0xe3,
+ 0xb5, 0xf9, 0xf, 0xf9, 0x7f, 0x50, 0x3f, 0xf8,
+ 0xe8, 0x7f, 0xff, 0xc3, 0xff, 0xfe, 0x1f, 0xfd,
+ 0x28, 0x3f, 0xf8, 0xd0,
+
+ /* U+F093 "" */
+ 0xf, 0xfe, 0x85, 0xc1, 0xff, 0xc4, 0x91, 0x83,
+ 0xff, 0x85, 0x21, 0x30, 0x7f, 0xf0, 0x24, 0x39,
+ 0x83, 0xfd, 0x21, 0xf3, 0x7, 0xe9, 0xf, 0xe6,
+ 0xf, 0x90, 0xff, 0x90, 0xfb, 0xf0, 0x77, 0xe0,
+ 0xff, 0xff, 0x87, 0xff, 0x45, 0xae, 0xf, 0xd5,
+ 0xcc, 0xbd, 0x75, 0x64, 0xbd, 0x7, 0x9f, 0xd6,
+ 0x87, 0xff, 0x9, 0x70, 0x7f, 0xf2, 0xb2, 0x43,
+ 0xff, 0x89, 0x92, 0xf, 0xff, 0xe4, 0x0,
+
+ /* U+F095 "" */
+ 0xf, 0xfe, 0x1a, 0x83, 0xff, 0x8f, 0x4f, 0x48,
+ 0x7f, 0xf0, 0x90, 0xcc, 0x1f, 0xfc, 0x28, 0x3f,
+ 0xf8, 0xe8, 0x7f, 0xf2, 0x30, 0xf2, 0x1f, 0xfc,
+ 0x1c, 0x3f, 0xf9, 0xc, 0x1d, 0x87, 0xff, 0x9,
+ 0x83, 0x21, 0xff, 0xc3, 0xc2, 0x43, 0xff, 0x86,
+ 0xa0, 0xa0, 0xff, 0xe1, 0xc1, 0x21, 0xff, 0xc3,
+ 0xc3, 0x41, 0xeb, 0xc8, 0x6c, 0x36, 0x19, 0xb4,
+ 0x12, 0x38, 0x68, 0x3a, 0x43, 0xae, 0xd, 0x21,
+ 0xff, 0xc6, 0x90, 0xf2, 0x1f, 0xe7, 0x43, 0xec,
+ 0x3f, 0xa8, 0x1f, 0xc8, 0x79, 0xb4, 0x3f, 0xea,
+ 0xde, 0x90, 0xff, 0x80,
+
+ /* U+F0AF "" */
+ 0x5, 0x3, 0xff, 0x87, 0x58, 0x2f, 0xfc, 0x87,
+ 0xe8, 0x3f, 0x46, 0xf9, 0x82, 0xff, 0x7, 0xff,
+ 0xb7, 0xae, 0xf, 0x30, 0x72, 0xe0, 0xfb, 0x43,
+ 0xff, 0x89, 0x61, 0xff, 0xff, 0x7, 0xf9, 0x3f,
+ 0xc0, 0x83, 0xff, 0x8c,
+
+ /* U+F0C4 "" */
+ 0x2, 0xc1, 0xff, 0xc2, 0xad, 0xa1, 0xe7, 0xc9,
+ 0x21, 0xa0, 0xea, 0x2, 0x50, 0x38, 0x8, 0x52,
+ 0x12, 0x80, 0x88, 0x74, 0x84, 0xc1, 0x36, 0x1a,
+ 0x42, 0x60, 0x60, 0x42, 0xa2, 0x13, 0x6, 0xc3,
+ 0xc8, 0x4c, 0x1e, 0xf8, 0x3c, 0xc1, 0xfe, 0x43,
+ 0xa0, 0xfc, 0xa9, 0xe, 0xc3, 0xea, 0x90, 0xfb,
+ 0xe, 0x90, 0xe6, 0xd, 0x86, 0x41, 0xc0, 0xdc,
+ 0x36, 0x1c, 0x88, 0x76, 0x1b, 0xc, 0xd8, 0x7b,
+ 0xd, 0x98, 0x10, 0x28, 0x36, 0x1e, 0xc2, 0x60,
+ 0xf7, 0x4c,
+
+ /* U+F0C5 "" */
+ 0xe, 0xbf, 0xc9, 0x7, 0xe4, 0x3d, 0x8e, 0x1f,
+ 0xfc, 0x6c, 0x3f, 0xf8, 0xd4, 0xf4, 0x1f, 0xef,
+ 0xa4, 0x8, 0x7e, 0x5e, 0xf, 0xfe, 0x15, 0x6c,
+ 0x3f, 0xff, 0xe1, 0xff, 0xff, 0xf, 0xfe, 0x8a,
+ 0x1a, 0xff, 0xfe, 0x4, 0x19, 0xff, 0xa0, 0xff,
+ 0xe2, 0xe1, 0xd2, 0xff, 0xa4, 0x38,
+
+ /* U+F0C7 "" */
+ 0x1a, 0xfe, 0x50, 0x6a, 0x2f, 0xf5, 0x41, 0x21,
+ 0xff, 0xc0, 0x60, 0xcf, 0xff, 0x1, 0x83, 0xff,
+ 0x88, 0xc1, 0xff, 0xc4, 0x43, 0xff, 0xb0, 0xd7,
+ 0xf0, 0x7e, 0x5f, 0xe0, 0xff, 0xe8, 0xdc, 0x1f,
+ 0xfc, 0x19, 0x18, 0x3f, 0xfa, 0x38, 0x58, 0x7f,
+ 0xf0, 0x1e, 0xd0, 0xff, 0xe1, 0x21, 0xfa, 0xf,
+ 0xfe, 0x1c,
+
+ /* U+F0C9 "" */
+ 0xff, 0xfe, 0x2a, 0x1f, 0xfc, 0x5d, 0xf, 0xfe,
+ 0x27, 0x7f, 0xff, 0x11, 0xf, 0xfe, 0xc5, 0xff,
+ 0xfc, 0x45, 0x7, 0xff, 0x13, 0xf, 0xfe, 0x2f,
+ 0xff, 0xf1, 0x90, 0xff, 0xec, 0x5f, 0xff, 0xc4,
+ 0x50, 0x7f, 0xf1, 0x30, 0xff, 0xe2, 0xe0,
+
+ /* U+F0E0 "" */
+ 0x7f, 0xff, 0x8c, 0xc1, 0xff, 0xc6, 0x83, 0xff,
+ 0x91, 0x7, 0xff, 0x1a, 0x70, 0xff, 0xe2, 0x6e,
+ 0x68, 0x7f, 0xf0, 0x1c, 0xcd, 0xa0, 0x7f, 0xa8,
+ 0xe1, 0x51, 0xc3, 0xf6, 0xd0, 0x39, 0xdd, 0xc,
+ 0xee, 0x87, 0xea, 0xc0, 0xac, 0x1f, 0xf3, 0xbe,
+ 0x74, 0x3f, 0xf8, 0x5f, 0x83, 0xff, 0xc9, 0x7,
+ 0xff, 0x1a,
+
+ /* U+F0E7 "" */
+ 0xc, 0xb8, 0x3f, 0x5d, 0x6e, 0xf, 0x21, 0xff,
+ 0xc8, 0x83, 0xff, 0x8e, 0x87, 0x90, 0xff, 0xe0,
+ 0xc1, 0xec, 0x3d, 0xfc, 0x87, 0xff, 0xd, 0xf,
+ 0xf9, 0xf, 0xfe, 0x6, 0x1f, 0xfc, 0x4, 0x2f,
+ 0xe4, 0x34, 0x1f, 0x90, 0xa0, 0xff, 0xe0, 0xa1,
+ 0xff, 0xc0, 0x83, 0xf9, 0x2, 0x83, 0xfb, 0x4,
+ 0x1f, 0xe4, 0x43, 0xff, 0x83, 0x7, 0xfc, 0xc1,
+ 0xf0,
+
+ /* U+F0EA "" */
+ 0xe, 0x60, 0xff, 0xe0, 0x2d, 0xce, 0xb0, 0x7d,
+ 0xd4, 0x31, 0x56, 0x1f, 0xfc, 0x64, 0x3f, 0xcc,
+ 0x1f, 0xfc, 0x55, 0xf8, 0x3f, 0xd5, 0xf0, 0x7f,
+ 0xcf, 0xf9, 0x30, 0xff, 0xe3, 0x61, 0xff, 0xc6,
+ 0xc3, 0xff, 0x8d, 0x7, 0xff, 0xb, 0xe8, 0x3f,
+ 0xf8, 0x17, 0xf0, 0x7f, 0xff, 0x3f, 0x83, 0xff,
+ 0xc8, 0x87, 0x90, 0xfe, 0x70,
+
+ /* U+F0F3 "" */
+ 0xf, 0xfe, 0x6b, 0xe0, 0xff, 0xe1, 0xe1, 0xff,
+ 0xc3, 0x74, 0x1c, 0x1f, 0xea, 0x7, 0x38, 0x7e,
+ 0x50, 0x7e, 0xc3, 0xe8, 0x3f, 0xc8, 0x72, 0x1f,
+ 0xf4, 0x1f, 0xfc, 0xbc, 0x3f, 0xfa, 0xe8, 0x7f,
+ 0xf0, 0x10, 0xff, 0xe2, 0xe1, 0x41, 0xff, 0xc1,
+ 0x40, 0xa0, 0xff, 0xe1, 0x64, 0x1f, 0xfc, 0x45,
+ 0x7, 0xff, 0x11, 0xbf, 0xff, 0x88, 0x1f, 0x5f,
+ 0x83, 0xff, 0x83, 0x4, 0x87, 0xff, 0xb, 0xa8,
+ 0x3e,
+
+ /* U+F11C "" */
+ 0x7f, 0xff, 0x91, 0x10, 0x7f, 0xf2, 0x14, 0x12,
+ 0x85, 0x85, 0x85, 0xb, 0x3, 0x3, 0x42, 0xa2,
+ 0xa2, 0x85, 0x41, 0xff, 0xd0, 0x7c, 0x7c, 0x7c,
+ 0x78, 0xf8, 0x3e, 0x78, 0xb8, 0xb5, 0x78, 0x3f,
+ 0xb1, 0x10, 0x90, 0xff, 0xe1, 0x62, 0x21, 0x21,
+ 0xff, 0xc2, 0x78, 0xb8, 0xb5, 0x78, 0x3e, 0x7c,
+ 0x7f, 0xf8, 0xf8, 0x3f, 0xfa, 0xd, 0xa, 0xff,
+ 0x15, 0x7, 0x94, 0x2f, 0xf8, 0x58, 0x1c, 0x1f,
+ 0xfc, 0x85, 0x0,
+
+ /* U+F124 "" */
+ 0xf, 0xfe, 0x32, 0x83, 0xff, 0x8c, 0xf5, 0x7,
+ 0xff, 0xe, 0xe0, 0x90, 0xff, 0xe0, 0xda, 0x1c,
+ 0x87, 0xf9, 0xb4, 0x3e, 0x83, 0xf3, 0xc8, 0x7e,
+ 0x43, 0xe7, 0x83, 0xfe, 0xc3, 0xae, 0xf, 0xfe,
+ 0xa, 0x13, 0xa1, 0xff, 0xc2, 0x83, 0x41, 0xff,
+ 0xc4, 0x43, 0xff, 0x91, 0x7, 0x68, 0x7f, 0xf0,
+ 0x90, 0xf5, 0xfe, 0x83, 0xc8, 0x7f, 0xf2, 0x60,
+ 0xff, 0xe4, 0x21, 0xff, 0xc9, 0x83, 0xff, 0x90,
+ 0x87, 0xff, 0x26, 0xf, 0xfe, 0x22, 0x1f, 0xfc,
+ 0xd8, 0x3f, 0xf8, 0xdd, 0xa1, 0xf8,
+
+ /* U+F154 "" */
+ 0xe, 0xb9, 0xf, 0x78, 0x1a, 0x32, 0x1f, 0xa2,
+ 0xf1, 0x7, 0xe4, 0x43, 0xfe, 0x83, 0xff, 0x84,
+ 0x98, 0x7f, 0xf0, 0x3c, 0x1f, 0xfc, 0x6c, 0x1a,
+ 0x15, 0x2, 0xb0, 0xd4, 0x2, 0x81, 0xa1, 0xe7,
+ 0xe, 0xff, 0xf0, 0x7c, 0xfe, 0x83, 0xff, 0xf2,
+ 0xa0, 0x30, 0x40,
+
+ /* U+F15B "" */
+ 0xff, 0xe3, 0xf, 0xfe, 0x1e, 0x1f, 0xfc, 0x3c,
+ 0x3f, 0xf8, 0x78, 0x7f, 0xf0, 0xf0, 0xff, 0x7f,
+ 0x7, 0xf7, 0xf8, 0x3f, 0xff, 0xe1, 0xff, 0xff,
+ 0xf, 0xfe, 0x92, 0x1f, 0xfc, 0x14,
+
+ /* U+F1DB "" */
+ 0x3, 0xff, 0xfc, 0x28, 0x3c, 0xbc, 0x5, 0xe0,
+ 0xfd, 0x5c, 0xa, 0xe0, 0xff, 0xff, 0x87, 0xff,
+ 0x6, 0xb8, 0x15, 0xc1, 0xf9, 0x78, 0xb, 0xc1,
+ 0xfb, 0xf8, 0x1f, 0xc1, 0xff, 0xff, 0xf, 0xfe,
+ 0x97, 0x1f, 0xc0, 0xfe, 0x1c, 0x3f, 0xf9, 0x4b,
+ 0xff, 0xc6, 0x0,
+
+ /* U+F1E1 "" */
+ 0xf, 0x94, 0x1f, 0xfc, 0x2e, 0x98, 0x7d, 0xfe,
+ 0xd, 0xfe, 0x83, 0xff, 0x8b, 0xc7, 0xc1, 0xbe,
+ 0x7, 0x7, 0xb0, 0x61, 0xff, 0xcd, 0x60, 0xd4,
+ 0xd, 0x40, 0x98, 0x37, 0x83, 0x78, 0x28, 0x80,
+ 0xb8, 0xb, 0x84, 0x8, 0x30, 0x60, 0x81, 0x18,
+ 0x72, 0x4, 0x3e, 0x42, 0x50, 0x65, 0x6, 0x43,
+ 0x61, 0xec, 0x36,
+
+ /* U+F1EB "" */
+ 0xf, 0xfe, 0x2, 0x1f, 0xfc, 0x7b, 0xf5, 0xfa,
+ 0xf, 0xf9, 0xf2, 0x1f, 0xcf, 0x90, 0xfb, 0x83,
+ 0xff, 0x87, 0x61, 0xac, 0x33, 0x7f, 0xd2, 0x1b,
+ 0x89, 0x9, 0xe4, 0x3e, 0x6d, 0x9, 0x83, 0x70,
+ 0x7f, 0xf0, 0x6c, 0x34, 0xac, 0x33, 0x7f, 0x48,
+ 0x6d, 0x51, 0x40, 0x9e, 0x43, 0x9b, 0x42, 0xa0,
+ 0x7a, 0x81, 0xff, 0x50, 0x3f, 0xa4, 0x26, 0xfa,
+ 0x42, 0x60, 0xfd, 0x1, 0xe4, 0x26, 0xd0, 0x41,
+ 0xfd, 0xd0, 0x3f, 0xa9, 0x87, 0xfc, 0x86, 0xb8,
+ 0x32, 0x1f, 0xfc, 0x4d, 0x18, 0x3f, 0xf9, 0x88,
+ 0x7f, 0xf2, 0x10, 0x90, 0xff, 0xe4, 0x48, 0x20,
+ 0xff, 0x0,
+
+ /* U+F1F3 "" */
+ 0xaf, 0xfe, 0x2, 0x1e, 0x5f, 0xfe, 0x5, 0xc1,
+ 0xef, 0xff, 0x23, 0x87, 0xff, 0xe, 0xc1, 0x86,
+ 0x7e, 0x43, 0xec, 0x10, 0x50, 0x54, 0xd, 0xf0,
+ 0x10, 0x9f, 0x85, 0x4, 0x87, 0x40, 0x82, 0xc8,
+ 0x2b, 0xf0, 0x7f, 0xf2, 0x14, 0x21, 0x40, 0xff,
+ 0xc0, 0x8b, 0xb5, 0x56, 0x43, 0x50, 0xd1, 0x28,
+ 0xba, 0x41, 0xa8,
+
+ /* U+F21C "" */
+ 0xf, 0xfe, 0x1f, 0xff, 0xf0, 0xc3, 0xff, 0xa5,
+ 0xc5, 0xd7, 0x71, 0x61, 0xba, 0xec, 0x3f, 0x57,
+ 0xc1, 0xfb, 0xae, 0xc3, 0xf2, 0x1c, 0x87, 0xef,
+ 0xf8, 0x3f, 0x7f, 0xc1, 0xfa, 0xbe, 0xf, 0xdd,
+ 0x76, 0x1f, 0x90, 0xe4, 0x30,
+
+ /* U+F21D "" */
+ 0xf, 0xfe, 0x2f, 0xff, 0xf0, 0xc3, 0xff, 0xb1,
+ 0xc5, 0x7f, 0x16, 0x1e, 0xaf, 0x83, 0x48, 0x6a,
+ 0xf8, 0x33, 0x86, 0xeb, 0xb0, 0xff, 0x21, 0xc8,
+ 0x7f, 0xbf, 0xe0, 0xff, 0xe4, 0xf0, 0x7f, 0xf0,
+ 0xe4, 0x3f, 0xf8, 0x6e, 0x1f, 0xfc, 0x3e, 0x1d,
+ 0xf, 0x9d, 0x8,
+
+ /* U+F21E "" */
+ 0xf, 0xfe, 0x1f, 0xff, 0xf0, 0xc3, 0xff, 0xa5,
+ 0xc5, 0xff, 0x45, 0x86, 0xff, 0x83, 0xf2, 0x1c,
+ 0x87, 0xeb, 0xfa, 0xf, 0xff, 0xf8, 0x7f, 0xf2,
+ 0x1d, 0xf, 0x9d, 0x0,
+
+ /* U+F240 "" */
+ 0x1a, 0xff, 0xe3, 0xa8, 0x14, 0x5f, 0xfe, 0x3d,
+ 0x11, 0xf, 0xfe, 0x56, 0x13, 0xff, 0xfc, 0x60,
+ 0x38, 0x4f, 0xff, 0xf1, 0x3, 0xff, 0x9d, 0x7,
+ 0xff, 0x31, 0x41, 0xff, 0xe4, 0xd0, 0xe7, 0xff,
+ 0xf8, 0x81, 0xf3, 0x5f, 0xfc, 0x60, 0xa0, 0x97,
+ 0xff, 0x8c, 0x5, 0x41, 0xff, 0xca, 0x80,
+
+ /* U+F241 "" */
+ 0x1a, 0xff, 0xe3, 0xa8, 0x14, 0x5f, 0xfe, 0x3d,
+ 0x11, 0xf, 0xfe, 0x56, 0x13, 0xff, 0xfc, 0x60,
+ 0x38, 0x6f, 0xff, 0xe0, 0x41, 0xff, 0xd1, 0x83,
+ 0xff, 0x98, 0xa0, 0xff, 0xf2, 0x68, 0x7b, 0xff,
+ 0xf8, 0x10, 0x7f, 0x9a, 0xff, 0xe3, 0x5, 0x4,
+ 0xbf, 0xfc, 0x60, 0x2a, 0xf, 0xfe, 0x54, 0x0,
+
+ /* U+F242 "" */
+ 0x1a, 0xff, 0xe3, 0xa8, 0x14, 0x5f, 0xfe, 0x3d,
+ 0x11, 0xf, 0xfe, 0x56, 0x13, 0xff, 0xfc, 0x60,
+ 0x38, 0x6f, 0xfe, 0xf, 0xfe, 0xac, 0x1f, 0xfc,
+ 0xc5, 0x7, 0xff, 0x93, 0x43, 0xdf, 0xfc, 0x1f,
+ 0xfc, 0x26, 0xbf, 0xf8, 0xc1, 0x41, 0x2f, 0xff,
+ 0x18, 0xa, 0x83, 0xff, 0x95, 0x0,
+
+ /* U+F243 "" */
+ 0x1a, 0xff, 0xe3, 0xa8, 0x14, 0x5f, 0xfe, 0x3d,
+ 0x11, 0xf, 0xfe, 0x56, 0x13, 0xff, 0xfc, 0x60,
+ 0x38, 0x6f, 0xe0, 0xff, 0xec, 0xc1, 0xff, 0xcc,
+ 0x50, 0x7f, 0xf9, 0x34, 0x3d, 0xfc, 0x1f, 0xfc,
+ 0x66, 0xbf, 0xf8, 0xc1, 0x41, 0x2f, 0xff, 0x18,
+ 0xa, 0x83, 0xff, 0x95, 0x0,
+
+ /* U+F244 "" */
+ 0x1a, 0xff, 0xe3, 0xa8, 0x14, 0x5f, 0xfe, 0x3d,
+ 0x11, 0xf, 0xfe, 0x56, 0x13, 0xff, 0xfc, 0x60,
+ 0x38, 0x7f, 0xf8, 0xa0, 0xff, 0xe6, 0x28, 0x3f,
+ 0xfc, 0x9a, 0x1f, 0xfd, 0x16, 0xbf, 0xf8, 0xc1,
+ 0x41, 0x2f, 0xff, 0x18, 0xa, 0x83, 0xff, 0x95,
+ 0x0,
+
+ /* U+F287 "" */
+ 0xf, 0xfe, 0xdf, 0xc1, 0xff, 0xc8, 0x7c, 0x14,
+ 0x1f, 0xfc, 0x6a, 0x28, 0x3f, 0xf9, 0x4d, 0x48,
+ 0x20, 0xff, 0xe2, 0xc2, 0xb, 0xc1, 0xff, 0x7d,
+ 0x4, 0xc1, 0xff, 0x61, 0xb0, 0x94, 0x62, 0x1f,
+ 0xe4, 0xe0, 0xfa, 0xc1, 0xff, 0xf4, 0x7, 0xf,
+ 0x5f, 0x40, 0xff, 0xd0, 0x1c, 0xc2, 0x50, 0x4c,
+ 0x1f, 0xc9, 0xc1, 0x7d, 0x7, 0x24, 0x1f, 0xb0,
+ 0xff, 0xe1, 0xc8, 0x2f, 0x90, 0xff, 0xe2, 0xa7,
+ 0x21, 0x61, 0xff, 0xc6, 0xd0, 0xff, 0xe6, 0xd1,
+ 0xb, 0xf, 0xfe, 0x4d, 0xf2, 0x1e,
+
+ /* U+F293 "" */
+ 0xc, 0xdf, 0xa0, 0xfb, 0x90, 0xce, 0x86, 0xc3,
+ 0x61, 0xa4, 0x18, 0x7b, 0xd, 0x7, 0xfb, 0xe,
+ 0x43, 0xe4, 0xc2, 0xb0, 0x58, 0x5e, 0x20, 0x90,
+ 0x46, 0xe, 0x20, 0x21, 0xb3, 0x15, 0x7, 0xf6,
+ 0x14, 0x87, 0xf9, 0x2, 0x1f, 0xe9, 0x6, 0x1f,
+ 0xd3, 0x9, 0x86, 0x41, 0x32, 0x78, 0xc3, 0xd4,
+ 0x41, 0xc6, 0x7, 0x9, 0x9, 0x58, 0x5a, 0x1f,
+ 0xb0, 0xc9, 0x87, 0xb0, 0xd0, 0x50, 0x6c, 0x32,
+ 0x82, 0x78, 0x39, 0xa0, 0x0,
+
+ /* U+F2A1 "" */
+ 0xa, 0xb0, 0x72, 0xf8, 0x17, 0x6, 0xb9, 0xf,
+ 0xc8, 0x3f, 0xc1, 0xff, 0xfe, 0x7f, 0x21, 0xff,
+ 0xc2, 0x6b, 0x21, 0xba, 0xd8, 0x10, 0xfc, 0x80,
+
+ /* U+F2A2 "" */
+ 0xa, 0xb0, 0x72, 0xf8, 0x17, 0x6, 0xb9, 0xf,
+ 0xc8, 0x3f, 0xc1, 0xff, 0xd6, 0x7f, 0x21, 0xff,
+ 0xc2, 0x6b, 0x21, 0xcb, 0x83, 0x9f, 0xc8, 0x7f,
+ 0xf0, 0x9a, 0xc8, 0x6e, 0xb6, 0x4, 0x3f, 0x20,
+
+ /* U+F2A3 "" */
+ 0xa, 0xb0, 0x72, 0xf8, 0x17, 0x6, 0xb9, 0xf,
+ 0xc8, 0x3a, 0xd8, 0x66, 0xb2, 0x1f, 0xfc, 0x27,
+ 0xf2, 0x19, 0xfc, 0x87, 0xff, 0x9, 0xac, 0x87,
+ 0x2e, 0xe, 0x7f, 0x21, 0xff, 0xc2, 0x6b, 0x21,
+ 0xba, 0xd8, 0x10, 0xfc, 0x80,
+
+ /* U+F2BA "" */
+ 0xf, 0xfe, 0x47, 0x21, 0xff, 0x3c, 0x13, 0x7a,
+ 0xbd, 0xf4, 0x60, 0xc3, 0x2f, 0x83, 0x28, 0x8,
+ 0x5e, 0x82, 0xf2, 0x4, 0x2a, 0x21, 0xff, 0x4e,
+ 0x4a, 0x84, 0x9c, 0x85, 0xa0, 0xff, 0x44, 0x88,
+ 0x65, 0x62, 0x21, 0xb0, 0x68, 0x76, 0x48, 0x48,
+ 0x11, 0x20, 0xa7, 0x20, 0x38, 0xe0, 0x9c, 0x54,
+ 0xe1, 0x4e, 0xa0, 0x33, 0x81, 0x83, 0xbd, 0x6,
+ 0x60, 0x0,
+
+ /* U+F2D3 "" */
+ 0xf, 0xfe, 0x5d, 0xf2, 0x1f, 0xcf, 0x90, 0xae,
+ 0x43, 0x5c, 0x1f, 0x9b, 0x4d, 0xf, 0xfe, 0xd,
+ 0x0, 0xbf, 0xfc, 0x10, 0x9b, 0xff, 0xe8, 0x33,
+ 0x5f, 0xf0, 0x73, 0xff, 0xf0, 0x73, 0xff, 0xf0,
+ 0x7f, 0xf2, 0x9f, 0xff, 0x83, 0x9f, 0xff, 0x82,
+ 0x76, 0xbf, 0xe1, 0xc0,
+
+ /* U+F2D4 "" */
+ 0xf, 0xfe, 0x5d, 0xf2, 0x1f, 0xcf, 0x90, 0xae,
+ 0x43, 0x5c, 0x1f, 0x9b, 0x4d, 0xf, 0xfe, 0xd,
+ 0x0, 0xbf, 0xfc, 0x10, 0x9b, 0xff, 0xe8, 0x33,
+ 0x5f, 0xf0, 0x73, 0xff, 0xf0, 0x7f, 0xfe, 0xf8,
+ 0x3f, 0xf8, 0x3c,
+
+ /* U+F2ED "" */
+ 0xf, 0x5f, 0x50, 0x3c, 0xd6, 0xd0, 0x95, 0x59,
+ 0x25, 0xc1, 0xf2, 0xe9, 0xf, 0xfe, 0x37, 0xff,
+ 0xf1, 0x51, 0xaf, 0xfe, 0x10, 0x52, 0xff, 0xf0,
+ 0xc3, 0xff, 0x97, 0x40, 0x68, 0x30, 0xff, 0xff,
+ 0x87, 0xff, 0xfc, 0x3f, 0xf8, 0xc8, 0x28, 0xd,
+ 0x6, 0x12, 0xc, 0x3f, 0xf8, 0xad, 0x17, 0xfd,
+ 0x60,
+
+ /* U+F304 "" */
+ 0xf, 0xfe, 0x22, 0x83, 0xff, 0x8d, 0xd4, 0x1f,
+ 0xfc, 0x4c, 0x26, 0xf, 0xfe, 0x12, 0x1c, 0xc1,
+ 0xff, 0xc0, 0x94, 0x1c, 0x87, 0xfd, 0xb4, 0x43,
+ 0xff, 0x87, 0x81, 0xa2, 0x16, 0x1f, 0xd8, 0x66,
+ 0x89, 0x87, 0xf6, 0x1e, 0x69, 0x87, 0xf6, 0x1f,
+ 0x90, 0xff, 0x61, 0xfd, 0x87, 0xf6, 0x1f, 0xd8,
+ 0x7f, 0x61, 0xfd, 0x87, 0xf6, 0x1f, 0xd8, 0x7f,
+ 0x61, 0xfd, 0x87, 0xf4, 0x1f, 0xd8, 0x7f, 0xf1,
+ 0xf0, 0xff, 0x90, 0xfb, 0xf, 0xfe, 0x3e, 0x1f,
+ 0xfc, 0x7c, 0x3f, 0xf8, 0x55, 0x7c, 0x1f, 0xfc,
+ 0x20,
+
+ /* U+F40B "" */
+ 0xf, 0xfe, 0x1c, 0x1f, 0x94, 0x1f, 0xa0, 0xfc,
+ 0x87, 0xf4, 0x1f, 0x90, 0xfe, 0x82, 0xfa, 0x10,
+ 0xfb, 0x20, 0xf9, 0x41, 0xf4, 0x41, 0xf2, 0x7e,
+ 0xa, 0xf, 0xe4, 0x3f, 0x41, 0xfc, 0x87, 0xe8,
+ 0x3f, 0x28, 0x3f, 0x41, 0xc0,
+
+ /* U+F55A "" */
+ 0xf, 0x3f, 0xff, 0xc4, 0x83, 0xd4, 0xf, 0xfe,
+ 0x23, 0x6, 0x90, 0xff, 0xe3, 0x21, 0x48, 0x79,
+ 0x83, 0x48, 0x7e, 0x90, 0xf3, 0x30, 0x26, 0x43,
+ 0xd2, 0x1f, 0x28, 0x68, 0x8a, 0xe, 0x90, 0xfe,
+ 0x91, 0x43, 0x7, 0x90, 0xff, 0xa0, 0xd0, 0x7c,
+ 0x87, 0xfd, 0x6, 0x83, 0xe9, 0xf, 0xe9, 0x14,
+ 0x30, 0x7d, 0x21, 0xf2, 0x86, 0x88, 0xa0, 0xfa,
+ 0x43, 0xcc, 0xc0, 0x99, 0xf, 0xd2, 0x1e, 0x60,
+ 0xd2, 0x1f, 0xe9, 0xf, 0xfe, 0x32, 0x1d, 0x40,
+ 0xff, 0xe2, 0xc0,
+
/* U+F7C2 "" */
- 0x3, 0x19, 0x3e, 0x64, 0xc, 0x73, 0x7f, 0x4c,
- 0xc0, 0xb8, 0x1f, 0xe8, 0x3, 0x19, 0xc6, 0xe3,
- 0x76, 0x5, 0x88, 0x1f, 0xfc, 0xc, 0x40, 0xff,
- 0xe0, 0x90, 0x3f, 0xf8, 0xd3, 0x8d, 0xc6, 0xec,
- 0xf, 0xff, 0xf8, 0x1f, 0xff, 0xf0, 0x3f, 0xf8,
- 0xac, 0xf, 0xfe, 0xb, 0x90, 0x89, 0xfe, 0x52,
- 0x0,
+ 0xe, 0xaf, 0x90, 0xf6, 0xbf, 0x5a, 0x16, 0x1f,
+ 0xe8, 0x19, 0x67, 0x8f, 0x21, 0x61, 0xff, 0xc1,
+ 0xc3, 0xff, 0xab, 0x67, 0x8f, 0x21, 0xff, 0xff,
+ 0xf, 0xff, 0xf8, 0x7f, 0xf1, 0x50, 0xff, 0xe0,
+ 0xb4, 0x43, 0xf9, 0xa0,
/* U+F8A2 "" */
- 0x3, 0xff, 0x8e, 0x80, 0xff, 0xe3, 0xca, 0x7,
- 0xff, 0x1a, 0x30, 0x3d, 0x39, 0x3, 0xfc, 0xc0,
- 0xf4, 0x61, 0x81, 0xff, 0xc4, 0xac, 0xf, 0xfe,
- 0x35, 0x40, 0x5e, 0x4f, 0xf0, 0x1a, 0xa0, 0x32,
- 0x6f, 0xfc, 0x7, 0xff, 0x36, 0xa0, 0x32, 0x6f,
- 0xff, 0x81, 0x0, 0x54, 0x5, 0xe4, 0xff, 0xe0,
- 0x30, 0x2a, 0xc0, 0xff, 0xe4, 0x46, 0x18, 0x1f,
- 0xfc, 0x20
+ 0xf, 0xfe, 0x3a, 0x1f, 0xfc, 0x7a, 0x7, 0xff,
+ 0x1a, 0x43, 0xd6, 0x1f, 0xf2, 0x1e, 0x91, 0xf,
+ 0xfe, 0x24, 0x87, 0xff, 0x1a, 0x42, 0xeb, 0xfc,
+ 0x1a, 0x43, 0x2f, 0xfc, 0x1f, 0xfc, 0xd9, 0xc,
+ 0xbf, 0xfc, 0x18, 0x12, 0x17, 0x5f, 0xfc, 0x4,
+ 0x29, 0xf, 0xfe, 0x44, 0x88, 0x7f, 0xf0, 0x80
};
@@ -2628,281 +2107,281 @@ 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 = 86, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 0, .adv_w = 86, .box_w = 3, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 14, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8},
- {.bitmap_index = 25, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 91, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 160, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 241, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 311, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8},
- {.bitmap_index = 315, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4},
- {.bitmap_index = 349, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 382, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7},
- {.bitmap_index = 407, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3},
- {.bitmap_index = 427, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 437, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5},
- {.bitmap_index = 441, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 446, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2},
- {.bitmap_index = 496, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 553, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 562, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 610, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 657, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 705, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 753, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 812, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 858, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 919, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 976, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 989, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 1007, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2},
- {.bitmap_index = 1040, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4},
- {.bitmap_index = 1055, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2},
- {.bitmap_index = 1089, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 1132, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 1252, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
- {.bitmap_index = 1317, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1365, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 1423, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1474, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1499, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1519, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 1577, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1595, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1599, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
- {.bitmap_index = 1625, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1676, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1687, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1745, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1793, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 1863, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 1902, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 1989, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 2035, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2089, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2105, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2137, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
- {.bitmap_index = 2203, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2302, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2365, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
- {.bitmap_index = 2411, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2458, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4},
- {.bitmap_index = 2470, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2},
- {.bitmap_index = 2519, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 2531, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3},
- {.bitmap_index = 2561, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 2567, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12},
- {.bitmap_index = 2574, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2612, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2661, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2701, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2751, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2797, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 2821, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 2883, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2911, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2922, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4},
- {.bitmap_index = 2944, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2985, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 2989, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 3033, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 3059, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3105, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4},
- {.bitmap_index = 3158, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 3210, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 3228, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3269, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3295, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 3319, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0},
- {.bitmap_index = 3365, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3435, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3477, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4},
- {.bitmap_index = 3538, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3571, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4},
- {.bitmap_index = 3601, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4},
- {.bitmap_index = 3605, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
- {.bitmap_index = 3637, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5},
- {.bitmap_index = 3653, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7},
- {.bitmap_index = 3678, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4},
- {.bitmap_index = 3684, .adv_w = 320, .box_w = 14, .box_h = 13, .ofs_x = 3, .ofs_y = 1},
- {.bitmap_index = 3733, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 4},
- {.bitmap_index = 3783, .adv_w = 320, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3},
- {.bitmap_index = 3897, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 3978, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
- {.bitmap_index = 4024, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
- {.bitmap_index = 4072, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
- {.bitmap_index = 4121, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
- {.bitmap_index = 4166, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
- {.bitmap_index = 4193, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 4245, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 4300, .adv_w = 320, .box_w = 11, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 4362, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 4407, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 4461, .adv_w = 320, .box_w = 12, .box_h = 19, .ofs_x = 4, .ofs_y = -2},
- {.bitmap_index = 4492, .adv_w = 320, .box_w = 16, .box_h = 12, .ofs_x = 2, .ofs_y = 1},
- {.bitmap_index = 4545, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4},
- {.bitmap_index = 4569, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 6, .ofs_y = 2},
- {.bitmap_index = 4596, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 7, .ofs_y = 2},
- {.bitmap_index = 4624, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4},
- {.bitmap_index = 4649, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 4746, .adv_w = 320, .box_w = 12, .box_h = 13, .ofs_x = 4, .ofs_y = 1},
- {.bitmap_index = 4799, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 4852, .adv_w = 320, .box_w = 4, .box_h = 15, .ofs_x = 8, .ofs_y = 0},
- {.bitmap_index = 4877, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 4938, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 5020, .adv_w = 320, .box_w = 13, .box_h = 16, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 5088, .adv_w = 320, .box_w = 13, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 5136, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 5227, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 5286, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 5340, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 5419, .adv_w = 320, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 5461, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 5546, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 5602, .adv_w = 320, .box_w = 13, .box_h = 18, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 5653, .adv_w = 320, .box_w = 12, .box_h = 2, .ofs_x = 4, .ofs_y = 7},
- {.bitmap_index = 5658, .adv_w = 320, .box_w = 10, .box_h = 12, .ofs_x = 5, .ofs_y = 2},
- {.bitmap_index = 5671, .adv_w = 320, .box_w = 10, .box_h = 13, .ofs_x = 6, .ofs_y = 1},
- {.bitmap_index = 5705, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 2},
- {.bitmap_index = 5726, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
- {.bitmap_index = 5785, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 5880, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 5945, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 6030, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 6099, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 6198, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
- {.bitmap_index = 6265, .adv_w = 320, .box_w = 13, .box_h = 13, .ofs_x = 4, .ofs_y = 1},
- {.bitmap_index = 6309, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 4, .ofs_y = 2},
- {.bitmap_index = 6335, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 5, .ofs_y = 2},
- {.bitmap_index = 6361, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 6434, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 6496, .adv_w = 320, .box_w = 10, .box_h = 10, .ofs_x = 5, .ofs_y = 2},
- {.bitmap_index = 6504, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 6589, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 6626, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
- {.bitmap_index = 6666, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 6748, .adv_w = 320, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 6828, .adv_w = 320, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 6897, .adv_w = 320, .box_w = 12, .box_h = 15, .ofs_x = 4, .ofs_y = 0},
- {.bitmap_index = 6936, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
- {.bitmap_index = 6979, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
- {.bitmap_index = 7032, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 7108, .adv_w = 320, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 7213, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 7298, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 7391, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 7475, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
- {.bitmap_index = 7538, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 7612, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 7702, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 4, .ofs_y = 0},
- {.bitmap_index = 7744, .adv_w = 320, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 7809, .adv_w = 320, .box_w = 16, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 7896, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 7961, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
- {.bitmap_index = 7995, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 8049, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 8098, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 8147, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 8244, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 8340, .adv_w = 320, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 8413, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 8499, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 8570, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 8634, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 8697, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
- {.bitmap_index = 8744, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 8813, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 8850, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 8885, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 6, .ofs_y = -1},
- {.bitmap_index = 8916, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 8990, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 9040, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
- {.bitmap_index = 9103, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 9189, .adv_w = 320, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -3},
- {.bitmap_index = 9274, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 9348, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 9414, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 9467, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
- {.bitmap_index = 9507, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
- {.bitmap_index = 9563, .adv_w = 320, .box_w = 17, .box_h = 9, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 9607, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
- {.bitmap_index = 9651, .adv_w = 320, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
- {.bitmap_index = 9729, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 9789, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 9877, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 9962, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 10026, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 10108, .adv_w = 220, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 10172, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 10288, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 10404, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 10503, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 10585, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 10661, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 10747, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 10866, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 10895, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 10956, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 11073, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 11147, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 11226, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 11283, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 11371, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 11409, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 11440, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
- {.bitmap_index = 11497, .adv_w = 280, .box_w = 19, .box_h = 18, .ofs_x = -1, .ofs_y = -1},
- {.bitmap_index = 11575, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 11639, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
- {.bitmap_index = 11703, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 11757, .adv_w = 280, .box_w = 18, .box_h = 4, .ofs_x = 0, .ofs_y = 6},
- {.bitmap_index = 11773, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 11887, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 12042, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 12160, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 12272, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2},
- {.bitmap_index = 12332, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2},
- {.bitmap_index = 12392, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 12486, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 12519, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 12606, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 12717, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0},
- {.bitmap_index = 12769, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 12875, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 12935, .adv_w = 280, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 13001, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 13045, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 13113, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 13189, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 13261, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 13347, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 13436, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 13536, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
- {.bitmap_index = 13600, .adv_w = 240, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 13637, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -2},
- {.bitmap_index = 13691, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
- {.bitmap_index = 13766, .adv_w = 400, .box_w = 25, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 13890, .adv_w = 320, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
- {.bitmap_index = 13961, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
- {.bitmap_index = 14009, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 14068, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 14103, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 14161, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 14220, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 14278, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 14335, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
- {.bitmap_index = 14387, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
- {.bitmap_index = 14492, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3},
- {.bitmap_index = 14595, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
- {.bitmap_index = 14627, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
- {.bitmap_index = 14670, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
- {.bitmap_index = 14719, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
- {.bitmap_index = 14803, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 14862, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
- {.bitmap_index = 14913, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 14975, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
- {.bitmap_index = 15079, .adv_w = 320, .box_w = 10, .box_h = 19, .ofs_x = 5, .ofs_y = -2},
- {.bitmap_index = 15128, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
- {.bitmap_index = 15225, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
- {.bitmap_index = 15274, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1}
+ {.bitmap_index = 9, .adv_w = 125, .box_w = 6, .box_h = 6, .ofs_x = 1, .ofs_y = 8},
+ {.bitmap_index = 17, .adv_w = 225, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 61, .adv_w = 199, .box_w = 12, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 111, .adv_w = 270, .box_w = 17, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 168, .adv_w = 220, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 215, .adv_w = 67, .box_w = 2, .box_h = 6, .ofs_x = 1, .ofs_y = 8},
+ {.bitmap_index = 218, .adv_w = 108, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4},
+ {.bitmap_index = 238, .adv_w = 108, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 261, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7},
+ {.bitmap_index = 279, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 3},
+ {.bitmap_index = 295, .adv_w = 73, .box_w = 4, .box_h = 6, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 302, .adv_w = 123, .box_w = 6, .box_h = 2, .ofs_x = 1, .ofs_y = 5},
+ {.bitmap_index = 305, .adv_w = 73, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 309, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2},
+ {.bitmap_index = 347, .adv_w = 213, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 386, .adv_w = 118, .box_w = 6, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 393, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 423, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 456, .adv_w = 214, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 492, .adv_w = 184, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 525, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 566, .adv_w = 191, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 599, .adv_w = 206, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 641, .adv_w = 197, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 681, .adv_w = 73, .box_w = 4, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 691, .adv_w = 73, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 704, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2},
+ {.bitmap_index = 727, .adv_w = 186, .box_w = 10, .box_h = 7, .ofs_x = 1, .ofs_y = 4},
+ {.bitmap_index = 739, .adv_w = 186, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 2},
+ {.bitmap_index = 763, .adv_w = 183, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 794, .adv_w = 331, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 877, .adv_w = 234, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
+ {.bitmap_index = 925, .adv_w = 242, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 961, .adv_w = 231, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 996, .adv_w = 264, .box_w = 14, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1036, .adv_w = 214, .box_w = 11, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1056, .adv_w = 203, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1072, .adv_w = 247, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1110, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1124, .adv_w = 99, .box_w = 3, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1128, .adv_w = 164, .box_w = 10, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
+ {.bitmap_index = 1146, .adv_w = 230, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1184, .adv_w = 190, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1193, .adv_w = 306, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1237, .adv_w = 260, .box_w = 13, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1275, .adv_w = 269, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1322, .adv_w = 231, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1350, .adv_w = 269, .box_w = 17, .box_h = 17, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 1410, .adv_w = 233, .box_w = 12, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 1443, .adv_w = 199, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1481, .adv_w = 188, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1494, .adv_w = 253, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 1516, .adv_w = 228, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
+ {.bitmap_index = 1564, .adv_w = 360, .box_w = 22, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1631, .adv_w = 215, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1676, .adv_w = 207, .box_w = 15, .box_h = 14, .ofs_x = -1, .ofs_y = 0},
+ {.bitmap_index = 1710, .adv_w = 210, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1747, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 2, .ofs_y = -4},
+ {.bitmap_index = 1756, .adv_w = 113, .box_w = 9, .box_h = 20, .ofs_x = -1, .ofs_y = -2},
+ {.bitmap_index = 1793, .adv_w = 107, .box_w = 5, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 1802, .adv_w = 187, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 3},
+ {.bitmap_index = 1823, .adv_w = 160, .box_w = 10, .box_h = 3, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 1828, .adv_w = 192, .box_w = 6, .box_h = 3, .ofs_x = 2, .ofs_y = 12},
+ {.bitmap_index = 1833, .adv_w = 191, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 1860, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 1893, .adv_w = 183, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1918, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1951, .adv_w = 196, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1982, .adv_w = 113, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 1999, .adv_w = 221, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 2040, .adv_w = 218, .box_w = 11, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2059, .adv_w = 89, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2067, .adv_w = 91, .box_w = 7, .box_h = 19, .ofs_x = -2, .ofs_y = -4},
+ {.bitmap_index = 2084, .adv_w = 197, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2114, .adv_w = 89, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2118, .adv_w = 338, .box_w = 19, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2147, .adv_w = 218, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2164, .adv_w = 203, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2195, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -4},
+ {.bitmap_index = 2230, .adv_w = 218, .box_w = 12, .box_h = 15, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 2264, .adv_w = 131, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2278, .adv_w = 160, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2306, .adv_w = 132, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2326, .adv_w = 217, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 2343, .adv_w = 179, .box_w = 13, .box_h = 11, .ofs_x = -1, .ofs_y = 0},
+ {.bitmap_index = 2375, .adv_w = 288, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2423, .adv_w = 177, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2453, .adv_w = 179, .box_w = 13, .box_h = 15, .ofs_x = -1, .ofs_y = -4},
+ {.bitmap_index = 2496, .adv_w = 167, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2520, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 1, .ofs_y = -4},
+ {.bitmap_index = 2540, .adv_w = 96, .box_w = 2, .box_h = 19, .ofs_x = 2, .ofs_y = -4},
+ {.bitmap_index = 2544, .adv_w = 112, .box_w = 6, .box_h = 19, .ofs_x = 0, .ofs_y = -4},
+ {.bitmap_index = 2564, .adv_w = 186, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5},
+ {.bitmap_index = 2575, .adv_w = 134, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 7},
+ {.bitmap_index = 2592, .adv_w = 100, .box_w = 4, .box_h = 4, .ofs_x = 1, .ofs_y = 4},
+ {.bitmap_index = 2597, .adv_w = 320, .box_w = 14, .box_h = 13, .ofs_x = 3, .ofs_y = 1},
+ {.bitmap_index = 2635, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 4},
+ {.bitmap_index = 2675, .adv_w = 320, .box_w = 16, .box_h = 21, .ofs_x = 2, .ofs_y = -3},
+ {.bitmap_index = 2753, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 2816, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
+ {.bitmap_index = 2849, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
+ {.bitmap_index = 2888, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
+ {.bitmap_index = 2925, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
+ {.bitmap_index = 2958, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
+ {.bitmap_index = 2978, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 3019, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 3063, .adv_w = 320, .box_w = 11, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 3106, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 3138, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 3178, .adv_w = 320, .box_w = 12, .box_h = 19, .ofs_x = 4, .ofs_y = -2},
+ {.bitmap_index = 3203, .adv_w = 320, .box_w = 16, .box_h = 12, .ofs_x = 2, .ofs_y = 1},
+ {.bitmap_index = 3243, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4},
+ {.bitmap_index = 3260, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 6, .ofs_y = 2},
+ {.bitmap_index = 3278, .adv_w = 320, .box_w = 7, .box_h = 11, .ofs_x = 7, .ofs_y = 2},
+ {.bitmap_index = 3297, .adv_w = 320, .box_w = 10, .box_h = 7, .ofs_x = 5, .ofs_y = 4},
+ {.bitmap_index = 3314, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 3383, .adv_w = 320, .box_w = 12, .box_h = 13, .ofs_x = 4, .ofs_y = 1},
+ {.bitmap_index = 3419, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 3459, .adv_w = 320, .box_w = 4, .box_h = 15, .ofs_x = 8, .ofs_y = 0},
+ {.bitmap_index = 3476, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 3518, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 3576, .adv_w = 320, .box_w = 13, .box_h = 16, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 3624, .adv_w = 320, .box_w = 13, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 3659, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 3722, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 3768, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 3811, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 3869, .adv_w = 320, .box_w = 20, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 3901, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 3962, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 4002, .adv_w = 320, .box_w = 13, .box_h = 18, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 4041, .adv_w = 320, .box_w = 12, .box_h = 2, .ofs_x = 4, .ofs_y = 7},
+ {.bitmap_index = 4045, .adv_w = 320, .box_w = 10, .box_h = 12, .ofs_x = 5, .ofs_y = 2},
+ {.bitmap_index = 4055, .adv_w = 320, .box_w = 10, .box_h = 13, .ofs_x = 6, .ofs_y = 1},
+ {.bitmap_index = 4080, .adv_w = 320, .box_w = 12, .box_h = 12, .ofs_x = 4, .ofs_y = 2},
+ {.bitmap_index = 4097, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
+ {.bitmap_index = 4140, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 4205, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 4258, .adv_w = 320, .box_w = 17, .box_h = 18, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 4320, .adv_w = 320, .box_w = 16, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 4374, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 4440, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
+ {.bitmap_index = 4486, .adv_w = 320, .box_w = 13, .box_h = 13, .ofs_x = 4, .ofs_y = 1},
+ {.bitmap_index = 4520, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 4, .ofs_y = 2},
+ {.bitmap_index = 4541, .adv_w = 320, .box_w = 11, .box_h = 10, .ofs_x = 5, .ofs_y = 2},
+ {.bitmap_index = 4562, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 4612, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 4656, .adv_w = 320, .box_w = 10, .box_h = 10, .ofs_x = 5, .ofs_y = 2},
+ {.bitmap_index = 4663, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 4725, .adv_w = 320, .box_w = 19, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 4756, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
+ {.bitmap_index = 4783, .adv_w = 320, .box_w = 15, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 4840, .adv_w = 320, .box_w = 15, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 4899, .adv_w = 320, .box_w = 16, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 4950, .adv_w = 320, .box_w = 12, .box_h = 15, .ofs_x = 4, .ofs_y = 0},
+ {.bitmap_index = 4981, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
+ {.bitmap_index = 5012, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
+ {.bitmap_index = 5049, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 5107, .adv_w = 320, .box_w = 17, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 5180, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 5243, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 5313, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 5373, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
+ {.bitmap_index = 5422, .adv_w = 320, .box_w = 16, .box_h = 16, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 5476, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 5539, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 4, .ofs_y = 0},
+ {.bitmap_index = 5571, .adv_w = 320, .box_w = 17, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 5618, .adv_w = 320, .box_w = 16, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 5682, .adv_w = 320, .box_w = 18, .box_h = 15, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 5728, .adv_w = 320, .box_w = 10, .box_h = 15, .ofs_x = 5, .ofs_y = 0},
+ {.bitmap_index = 5750, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 5789, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 5828, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 5866, .adv_w = 320, .box_w = 19, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 5938, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6006, .adv_w = 320, .box_w = 14, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 6053, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6117, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 6171, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 6219, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 6270, .adv_w = 320, .box_w = 14, .box_h = 14, .ofs_x = 3, .ofs_y = 1},
+ {.bitmap_index = 6302, .adv_w = 320, .box_w = 18, .box_h = 14, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 6354, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 6382, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 6408, .adv_w = 320, .box_w = 9, .box_h = 17, .ofs_x = 6, .ofs_y = -1},
+ {.bitmap_index = 6428, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 6483, .adv_w = 320, .box_w = 13, .box_h = 15, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 6521, .adv_w = 320, .box_w = 12, .box_h = 17, .ofs_x = 4, .ofs_y = -1},
+ {.bitmap_index = 6566, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6628, .adv_w = 320, .box_w = 16, .box_h = 20, .ofs_x = 2, .ofs_y = -3},
+ {.bitmap_index = 6690, .adv_w = 320, .box_w = 18, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 6745, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6794, .adv_w = 320, .box_w = 16, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6834, .adv_w = 320, .box_w = 14, .box_h = 15, .ofs_x = 3, .ofs_y = 0},
+ {.bitmap_index = 6864, .adv_w = 320, .box_w = 14, .box_h = 17, .ofs_x = 3, .ofs_y = -1},
+ {.bitmap_index = 6904, .adv_w = 320, .box_w = 17, .box_h = 9, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 6935, .adv_w = 320, .box_w = 17, .box_h = 12, .ofs_x = 2, .ofs_y = 2},
+ {.bitmap_index = 6969, .adv_w = 320, .box_w = 19, .box_h = 17, .ofs_x = 1, .ofs_y = -1},
+ {.bitmap_index = 7026, .adv_w = 320, .box_w = 18, .box_h = 18, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 7074, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 7142, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 7209, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 7253, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 7317, .adv_w = 220, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 7361, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 7442, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 7514, .adv_w = 360, .box_w = 23, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 7589, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 7651, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 7711, .adv_w = 320, .box_w = 17, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 7774, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 7856, .adv_w = 160, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 7877, .adv_w = 240, .box_w = 15, .box_h = 16, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 7926, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 8014, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 8072, .adv_w = 220, .box_w = 14, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 8132, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 8177, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 8247, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 8277, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 8304, .adv_w = 280, .box_w = 13, .box_h = 19, .ofs_x = 2, .ofs_y = -2},
+ {.bitmap_index = 8347, .adv_w = 280, .box_w = 19, .box_h = 18, .ofs_x = -1, .ofs_y = -1},
+ {.bitmap_index = 8408, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 8454, .adv_w = 200, .box_w = 11, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
+ {.bitmap_index = 8500, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 8534, .adv_w = 280, .box_w = 18, .box_h = 4, .ofs_x = 0, .ofs_y = 6},
+ {.bitmap_index = 8548, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 8627, .adv_w = 400, .box_w = 26, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 8739, .adv_w = 360, .box_w = 24, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 8832, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 8913, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2},
+ {.bitmap_index = 8956, .adv_w = 280, .box_w = 18, .box_h = 11, .ofs_x = 0, .ofs_y = 2},
+ {.bitmap_index = 9000, .adv_w = 400, .box_w = 26, .box_h = 16, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 9070, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 9098, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 9161, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 9245, .adv_w = 320, .box_w = 18, .box_h = 16, .ofs_x = 1, .ofs_y = 0},
+ {.bitmap_index = 9281, .adv_w = 280, .box_w = 18, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 9355, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 9401, .adv_w = 280, .box_w = 17, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 9451, .adv_w = 280, .box_w = 18, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 9490, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 9540, .adv_w = 200, .box_w = 14, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 9597, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 9650, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 9715, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 9782, .adv_w = 320, .box_w = 22, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 9860, .adv_w = 320, .box_w = 15, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
+ {.bitmap_index = 9903, .adv_w = 240, .box_w = 15, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 9933, .adv_w = 320, .box_w = 20, .box_h = 18, .ofs_x = 0, .ofs_y = -2},
+ {.bitmap_index = 9976, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
+ {.bitmap_index = 10027, .adv_w = 400, .box_w = 25, .box_h = 18, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 10117, .adv_w = 320, .box_w = 19, .box_h = 12, .ofs_x = 1, .ofs_y = 2},
+ {.bitmap_index = 10168, .adv_w = 320, .box_w = 15, .box_h = 14, .ofs_x = 2, .ofs_y = 1},
+ {.bitmap_index = 10205, .adv_w = 320, .box_w = 17, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 10248, .adv_w = 320, .box_w = 15, .box_h = 15, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 10276, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 10323, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 10371, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 10417, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 10462, .adv_w = 400, .box_w = 25, .box_h = 13, .ofs_x = 0, .ofs_y = 1},
+ {.bitmap_index = 10503, .adv_w = 400, .box_w = 26, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
+ {.bitmap_index = 10581, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3},
+ {.bitmap_index = 10650, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
+ {.bitmap_index = 10674, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
+ {.bitmap_index = 10706, .adv_w = 320, .box_w = 10, .box_h = 17, .ofs_x = 5, .ofs_y = -1},
+ {.bitmap_index = 10743, .adv_w = 320, .box_w = 19, .box_h = 13, .ofs_x = 1, .ofs_y = 1},
+ {.bitmap_index = 10801, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 10845, .adv_w = 320, .box_w = 17, .box_h = 14, .ofs_x = 2, .ofs_y = 0},
+ {.bitmap_index = 10880, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 10929, .adv_w = 320, .box_w = 21, .box_h = 21, .ofs_x = -1, .ofs_y = -3},
+ {.bitmap_index = 11010, .adv_w = 320, .box_w = 10, .box_h = 19, .ofs_x = 5, .ofs_y = -2},
+ {.bitmap_index = 11047, .adv_w = 400, .box_w = 25, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
+ {.bitmap_index = 11122, .adv_w = 240, .box_w = 15, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
+ {.bitmap_index = 11158, .adv_w = 322, .box_w = 21, .box_h = 13, .ofs_x = 0, .ofs_y = 1}
};
/*---------------------
@@ -3443,7 +2922,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
.kern_dsc = &kern_classes,
.kern_scale = 16,
.cmap_num = 2,
- .bpp = 3,
+ .bpp = 2,
.kern_classes = 1,
.bitmap_format = 1,
#if LVGL_VERSION_MAJOR == 8
@@ -3452,6 +2931,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -3475,7 +2955,7 @@ lv_font_t lv_font_montserrat_tasmota_20 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c
index 523e2593d..a335d6fa5 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_12_latin1.c
@@ -2235,6 +2235,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2258,7 +2259,7 @@ lv_font_t robotocondensed_regular_12_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c
index 22384543e..3bc29008d 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_14_latin1.c
@@ -2586,6 +2586,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2609,7 +2610,7 @@ lv_font_t robotocondensed_regular_14_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c
index 23f8bdd71..cefcf661d 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_16_latin1.c
@@ -2829,6 +2829,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -2852,7 +2853,7 @@ lv_font_t robotocondensed_regular_16_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c
index 087e28edf..94a1c1664 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_20_latin1.c
@@ -3599,6 +3599,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -3622,7 +3623,7 @@ lv_font_t robotocondensed_regular_20_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c
index 0bf81dcdc..f170f6ad6 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_22_latin1.c
@@ -3915,6 +3915,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -3938,7 +3939,7 @@ lv_font_t robotocondensed_regular_22_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c
index a6b1d8a94..0228660ea 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_24_latin1.c
@@ -4152,6 +4152,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -4175,7 +4176,7 @@ lv_font_t robotocondensed_regular_24_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c
index 5a58147a9..ff83ef5eb 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_36_latin1.c
@@ -6573,6 +6573,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -6596,7 +6597,7 @@ lv_font_t robotocondensed_regular_36_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c
index 48b56364f..2677b879b 100644
--- a/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c
+++ b/lib/libesp32_lvgl/LVGL_assets/src/fonts/roboto-latin1/robotocondensed_regular_48_latin1.c
@@ -8952,6 +8952,7 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
};
+
/*-----------------
* PUBLIC FONT
*----------------*/
@@ -8975,7 +8976,7 @@ lv_font_t robotocondensed_regular_48_latin1 = {
#endif
.dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
.fallback = NULL,
- .user_data = NULL
+ .user_data = NULL,
};
diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/LVGL_API_Reference.md b/lib/libesp32_lvgl/lv_binding_berry/generate/LVGL_API_Reference.md
index f678f2064..c35c4a1a4 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/generate/LVGL_API_Reference.md
+++ b/lib/libesp32_lvgl/lv_binding_berry/generate/LVGL_API_Reference.md
@@ -78,6 +78,8 @@ draw_line_dsc_init|lv.draw_line_dsc||[lv_draw_line_dsc_init](https://docs.lvgl.i
draw_rect|comptr, lv.draw_rect_dsc, lv.area||[lv_draw_rect](https://docs.lvgl.io/9.0/search.html?q=lv_draw_rect)
draw_rect_dsc_init|lv.draw_rect_dsc||[lv_draw_rect_dsc_init](https://docs.lvgl.io/9.0/search.html?q=lv_draw_rect_dsc_init)
draw_vector|comptr||[lv_draw_vector](https://docs.lvgl.io/9.0/search.html?q=lv_draw_vector)
+event_dsc_get_cb|lv.event_dsc|lv.event_cb|[lv_event_dsc_get_cb](https://docs.lvgl.io/9.0/search.html?q=lv_event_dsc_get_cb)
+event_dsc_get_user_data|lv.event_dsc|comptr|[lv_event_dsc_get_user_data](https://docs.lvgl.io/9.0/search.html?q=lv_event_dsc_get_user_data)
event_register_id||int|[lv_event_register_id](https://docs.lvgl.io/9.0/search.html?q=lv_event_register_id)
flex_init|||[lv_flex_init](https://docs.lvgl.io/9.0/search.html?q=lv_flex_init)
font_get_glyph_width|lv.font, int, int|int|[lv_font_get_glyph_width](https://docs.lvgl.io/9.0/search.html?q=lv_font_get_glyph_width)
@@ -110,6 +112,7 @@ obj_style_get_selector_state|int|int|[lv_obj_style_get_selector_state](https://d
objid_builtin_destroy|||[lv_objid_builtin_destroy](https://docs.lvgl.io/9.0/search.html?q=lv_objid_builtin_destroy)
pct|int|int|[lv_pct](https://docs.lvgl.io/9.0/search.html?q=lv_pct)
pct_to_px|int, int|int|[lv_pct_to_px](https://docs.lvgl.io/9.0/search.html?q=lv_pct_to_px)
+point_array_transform|comptr, int, int, int, int, comptr, bool||[lv_point_array_transform](https://docs.lvgl.io/9.0/search.html?q=lv_point_array_transform)
point_from_precise|lv.point_precise|int|[lv_point_from_precise](https://docs.lvgl.io/9.0/search.html?q=lv_point_from_precise)
point_precise_set|lv.point_precise, int, int||[lv_point_precise_set](https://docs.lvgl.io/9.0/search.html?q=lv_point_precise_set)
point_precise_swap|lv.point_precise, lv.point_precise||[lv_point_precise_swap](https://docs.lvgl.io/9.0/search.html?q=lv_point_precise_swap)
@@ -184,6 +187,7 @@ vector_path_close|comptr||[lv_vector_path_close](https://docs.lvgl.io/9.0/search
vector_path_copy|comptr, comptr||[lv_vector_path_copy](https://docs.lvgl.io/9.0/search.html?q=lv_vector_path_copy)
vector_path_create|int|comptr|[lv_vector_path_create](https://docs.lvgl.io/9.0/search.html?q=lv_vector_path_create)
vector_path_delete|comptr||[lv_vector_path_delete](https://docs.lvgl.io/9.0/search.html?q=lv_vector_path_delete)
+vector_path_get_bounding|comptr, lv.area||[lv_vector_path_get_bounding](https://docs.lvgl.io/9.0/search.html?q=lv_vector_path_get_bounding)
version_info||string|[lv_version_info](https://docs.lvgl.io/9.0/search.html?q=lv_version_info)
version_major||int|[lv_version_major](https://docs.lvgl.io/9.0/search.html?q=lv_version_major)
version_minor||int|[lv_version_minor](https://docs.lvgl.io/9.0/search.html?q=lv_version_minor)
@@ -245,6 +249,7 @@ get_dpi||int|[lv_display_get_dpi](https://docs.lvgl.io/9.0/search.html?q=lv_disp
get_dpi||int|[lv_display_get_dpi](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_dpi)
get_driver_data||comptr|[lv_display_get_driver_data](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_driver_data)
get_event_count||int|[lv_display_get_event_count](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_event_count)
+get_event_dsc|int|lv.event_dsc|[lv_display_get_event_dsc](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_event_dsc)
get_hor_res||int|[lv_display_get_horizontal_resolution](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_horizontal_resolution)
get_horizontal_resolution||int|[lv_display_get_horizontal_resolution](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_horizontal_resolution)
get_inactive_time||int|[lv_display_get_inactive_time](https://docs.lvgl.io/9.0/search.html?q=lv_display_get_inactive_time)
@@ -317,6 +322,7 @@ get_key||int|[lv_event_get_key](https://docs.lvgl.io/9.0/search.html?q=lv_event_
get_layer||comptr|[lv_event_get_layer](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_layer)
get_old_size||lv.area|[lv_event_get_old_size](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_old_size)
get_param||comptr|[lv_event_get_param](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_param)
+get_rotary_diff||int|[lv_event_get_rotary_diff](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_rotary_diff)
get_scroll_anim||lv.anim|[lv_event_get_scroll_anim](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_scroll_anim)
get_self_size_info||comptr|[lv_event_get_self_size_info](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_self_size_info)
get_target||comptr|[lv_event_get_target](https://docs.lvgl.io/9.0/search.html?q=lv_event_get_target)
@@ -368,6 +374,7 @@ get_disp||lv.display|[lv_indev_get_display](https://docs.lvgl.io/9.0/search.html
get_display||lv.display|[lv_indev_get_display](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_display)
get_driver_data||comptr|[lv_indev_get_driver_data](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_driver_data)
get_event_count||int|[lv_indev_get_event_count](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_event_count)
+get_event_dsc|int|lv.event_dsc|[lv_indev_get_event_dsc](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_event_dsc)
get_gesture_dir||int|[lv_indev_get_gesture_dir](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_gesture_dir)
get_group||lv.group|[lv_indev_get_group](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_group)
get_key||int|[lv_indev_get_key](https://docs.lvgl.io/9.0/search.html?q=lv_indev_get_key)
@@ -439,6 +446,7 @@ set_bg_img_tiled|bool||[lv_style_set_bg_image_tiled](https://docs.lvgl.io/9.0/se
set_bg_main_opa|int||[lv_style_set_bg_main_opa](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_bg_main_opa)
set_bg_main_stop|int||[lv_style_set_bg_main_stop](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_bg_main_stop)
set_bg_opa|int||[lv_style_set_bg_opa](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_bg_opa)
+set_bitmap_mask_src|lv.image_dsc||[lv_style_set_bitmap_mask_src](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_bitmap_mask_src)
set_blend_mode|int||[lv_style_set_blend_mode](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_blend_mode)
set_border_color|lv.color||[lv_style_set_border_color](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_border_color)
set_border_opa|int||[lv_style_set_border_opa](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_border_opa)
@@ -504,6 +512,7 @@ set_pad_top|int||[lv_style_set_pad_top](https://docs.lvgl.io/9.0/search.html?q=l
set_pad_ver|int||[lv_style_set_pad_ver](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_pad_ver)
set_prop|int, int||[lv_style_set_prop](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_prop)
set_radius|int||[lv_style_set_radius](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_radius)
+set_rotary_sensitivity|int||[lv_style_set_rotary_sensitivity](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_rotary_sensitivity)
set_shadow_color|lv.color||[lv_style_set_shadow_color](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_shadow_color)
set_shadow_offset_x|int||[lv_style_set_shadow_offset_x](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_shadow_offset_x)
set_shadow_offset_y|int||[lv_style_set_shadow_offset_y](https://docs.lvgl.io/9.0/search.html?q=lv_style_set_shadow_offset_y)
@@ -566,7 +575,7 @@ set_user_data|\||[lv_timer_set_user_data](https://docs.lvgl.io/9.0/search.
Method|Arguments|Return type|LVGL equivalent
:---|:---|:---|:---
-add_event_cb|\, int, \||[lv_obj_add_event_cb](https://docs.lvgl.io/9.0/search.html?q=lv_obj_add_event_cb)
+add_event_cb|\, int, \|lv.event_dsc|[lv_obj_add_event_cb](https://docs.lvgl.io/9.0/search.html?q=lv_obj_add_event_cb)
add_flag|int||[lv_obj_add_flag](https://docs.lvgl.io/9.0/search.html?q=lv_obj_add_flag)
add_state|int||[lv_obj_add_state](https://docs.lvgl.io/9.0/search.html?q=lv_obj_add_state)
add_style|lv.style, int||[lv_obj_add_style](https://docs.lvgl.io/9.0/search.html?q=lv_obj_add_style)
@@ -605,6 +614,7 @@ get_coords|lv.area||[lv_obj_get_coords](https://docs.lvgl.io/9.0/search.html?q=l
get_disp||lv.display|[lv_obj_get_display](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_display)
get_display||lv.display|[lv_obj_get_display](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_display)
get_event_count||int|[lv_obj_get_event_count](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_event_count)
+get_event_dsc|int|lv.event_dsc|[lv_obj_get_event_dsc](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_event_dsc)
get_group||lv.group|[lv_obj_get_group](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_group)
get_height||int|[lv_obj_get_height](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_height)
get_index||int|[lv_obj_get_index](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_index)
@@ -656,6 +666,7 @@ get_style_bg_image_tiled|int|bool|[lv_obj_get_style_bg_image_tiled](https://docs
get_style_bg_main_opa|int|int|[lv_obj_get_style_bg_main_opa](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_bg_main_opa)
get_style_bg_main_stop|int|int|[lv_obj_get_style_bg_main_stop](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_bg_main_stop)
get_style_bg_opa|int|int|[lv_obj_get_style_bg_opa](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_bg_opa)
+get_style_bitmap_mask_src|int|lv.image_dsc|[lv_obj_get_style_bitmap_mask_src](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_bitmap_mask_src)
get_style_blend_mode|int|int|[lv_obj_get_style_blend_mode](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_blend_mode)
get_style_border_color|int|lv.color|[lv_obj_get_style_border_color](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_border_color)
get_style_border_color_filtered|int|lv.color|[lv_obj_get_style_border_color_filtered](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_border_color_filtered)
@@ -723,6 +734,7 @@ get_style_pad_row|int|int|[lv_obj_get_style_pad_row](https://docs.lvgl.io/9.0/se
get_style_pad_top|int|int|[lv_obj_get_style_pad_top](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_pad_top)
get_style_prop|int, int|int|[lv_obj_get_style_prop](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_prop)
get_style_radius|int|int|[lv_obj_get_style_radius](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_radius)
+get_style_rotary_sensitivity|int|int|[lv_obj_get_style_rotary_sensitivity](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_rotary_sensitivity)
get_style_shadow_color|int|lv.color|[lv_obj_get_style_shadow_color](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_shadow_color)
get_style_shadow_color_filtered|int|lv.color|[lv_obj_get_style_shadow_color_filtered](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_shadow_color_filtered)
get_style_shadow_offset_x|int|int|[lv_obj_get_style_shadow_offset_x](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_shadow_offset_x)
@@ -762,7 +774,7 @@ get_style_translate_y|int|int|[lv_obj_get_style_translate_y](https://docs.lvgl.i
get_style_width|int|int|[lv_obj_get_style_width](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_width)
get_style_x|int|int|[lv_obj_get_style_x](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_x)
get_style_y|int|int|[lv_obj_get_style_y](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_style_y)
-get_transformed_area|lv.area, bool, bool||[lv_obj_get_transformed_area](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_transformed_area)
+get_transformed_area|lv.area, int||[lv_obj_get_transformed_area](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_transformed_area)
get_user_data||comptr|[lv_obj_get_user_data](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_user_data)
get_width||int|[lv_obj_get_width](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_width)
get_width||int|[lv_obj_get_width](https://docs.lvgl.io/9.0/search.html?q=lv_obj_get_width)
@@ -807,6 +819,7 @@ remove|||[lv_obj_delete](https://docs.lvgl.io/9.0/search.html?q=lv_obj_delete)
remove_event|int|bool|[lv_obj_remove_event](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_event)
remove_event_cb|\|bool|[lv_obj_remove_event_cb](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_event_cb)
remove_event_cb_with_user_data|\, \|int|[lv_obj_remove_event_cb_with_user_data](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_event_cb_with_user_data)
+remove_event_dsc|lv.event_dsc|bool|[lv_obj_remove_event_dsc](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_event_dsc)
remove_flag|int||[lv_obj_remove_flag](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_flag)
remove_local_style_prop|int, int|bool|[lv_obj_remove_local_style_prop](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_local_style_prop)
remove_state|int||[lv_obj_remove_state](https://docs.lvgl.io/9.0/search.html?q=lv_obj_remove_state)
@@ -868,6 +881,7 @@ set_style_bg_image_tiled|bool, int||[lv_obj_set_style_bg_image_tiled](https://do
set_style_bg_main_opa|int, int||[lv_obj_set_style_bg_main_opa](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_bg_main_opa)
set_style_bg_main_stop|int, int||[lv_obj_set_style_bg_main_stop](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_bg_main_stop)
set_style_bg_opa|int, int||[lv_obj_set_style_bg_opa](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_bg_opa)
+set_style_bitmap_mask_src|lv.image_dsc, int||[lv_obj_set_style_bitmap_mask_src](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_bitmap_mask_src)
set_style_blend_mode|int, int||[lv_obj_set_style_blend_mode](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_blend_mode)
set_style_border_color|lv.color, int||[lv_obj_set_style_border_color](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_border_color)
set_style_border_opa|int, int||[lv_obj_set_style_border_opa](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_border_opa)
@@ -935,6 +949,7 @@ set_style_pad_row|int, int||[lv_obj_set_style_pad_row](https://docs.lvgl.io/9.0/
set_style_pad_top|int, int||[lv_obj_set_style_pad_top](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_pad_top)
set_style_pad_ver|int, int||[lv_obj_set_style_pad_ver](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_pad_ver)
set_style_radius|int, int||[lv_obj_set_style_radius](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_radius)
+set_style_rotary_sensitivity|int, int||[lv_obj_set_style_rotary_sensitivity](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_rotary_sensitivity)
set_style_shadow_color|lv.color, int||[lv_obj_set_style_shadow_color](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_shadow_color)
set_style_shadow_offset_x|int, int||[lv_obj_set_style_shadow_offset_x](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_shadow_offset_x)
set_style_shadow_offset_y|int, int||[lv_obj_set_style_shadow_offset_y](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_style_shadow_offset_y)
@@ -975,7 +990,8 @@ set_x|int||[lv_obj_set_x](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_x)
set_y|int||[lv_obj_set_y](https://docs.lvgl.io/9.0/search.html?q=lv_obj_set_y)
stringify_id|comptr, int|string|[lv_obj_stringify_id](https://docs.lvgl.io/9.0/search.html?q=lv_obj_stringify_id)
swap|lv.obj||[lv_obj_swap](https://docs.lvgl.io/9.0/search.html?q=lv_obj_swap)
-transform_point|comptr, bool, bool||[lv_obj_transform_point](https://docs.lvgl.io/9.0/search.html?q=lv_obj_transform_point)
+transform_point|comptr, int||[lv_obj_transform_point](https://docs.lvgl.io/9.0/search.html?q=lv_obj_transform_point)
+transform_point_array|lv.point_arr, int, int||[lv_obj_transform_point_array](https://docs.lvgl.io/9.0/search.html?q=lv_obj_transform_point_array)
update_flag|int, bool||[lv_obj_update_flag](https://docs.lvgl.io/9.0/search.html?q=lv_obj_update_flag)
update_layout|||[lv_obj_update_layout](https://docs.lvgl.io/9.0/search.html?q=lv_obj_update_layout)
update_snap|int||[lv_obj_update_snap](https://docs.lvgl.io/9.0/search.html?q=lv_obj_update_snap)
@@ -1110,6 +1126,7 @@ Method|Arguments|Return type|LVGL equivalent
:---|:---|:---|:---
get_angle||int|[lv_image_get_rotation](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_rotation)
get_antialias||bool|[lv_image_get_antialias](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_antialias)
+get_bitmap_map_src||lv.image_dsc|[lv_image_get_bitmap_map_src](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_bitmap_map_src)
get_blend_mode||int|[lv_image_get_blend_mode](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_blend_mode)
get_inner_align||int|[lv_image_get_inner_align](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_inner_align)
get_offset_x||int|[lv_image_get_offset_x](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_offset_x)
@@ -1126,6 +1143,7 @@ get_src||comptr|[lv_image_get_src](https://docs.lvgl.io/9.0/search.html?q=lv_ima
get_zoom||int|[lv_image_get_scale](https://docs.lvgl.io/9.0/search.html?q=lv_image_get_scale)
set_angle|int||[lv_image_set_rotation](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_rotation)
set_antialias|bool||[lv_image_set_antialias](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_antialias)
+set_bitmap_map_src|lv.image_dsc||[lv_image_set_bitmap_map_src](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_bitmap_map_src)
set_blend_mode|int||[lv_image_set_blend_mode](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_blend_mode)
set_inner_align|int||[lv_image_set_inner_align](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_inner_align)
set_offset_x|int||[lv_image_set_offset_x](https://docs.lvgl.io/9.0/search.html?q=lv_image_set_offset_x)
diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h
index 16efc3641..9cc444d31 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h
+++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h
@@ -45,6 +45,7 @@ const be_ntv_func_def_t lv_style_func[] = {
{ "set_bg_main_opa", { (const void*) &lv_style_set_bg_main_opa, "", "(lv.style)i" } },
{ "set_bg_main_stop", { (const void*) &lv_style_set_bg_main_stop, "", "(lv.style)i" } },
{ "set_bg_opa", { (const void*) &lv_style_set_bg_opa, "", "(lv.style)i" } },
+ { "set_bitmap_mask_src", { (const void*) &lv_style_set_bitmap_mask_src, "", "(lv.style)(lv.image_dsc)" } },
{ "set_blend_mode", { (const void*) &lv_style_set_blend_mode, "", "(lv.style)i" } },
{ "set_border_color", { (const void*) &lv_style_set_border_color, "", "(lv.style)(lv.color)" } },
{ "set_border_opa", { (const void*) &lv_style_set_border_opa, "", "(lv.style)i" } },
@@ -110,6 +111,7 @@ const be_ntv_func_def_t lv_style_func[] = {
{ "set_pad_ver", { (const void*) &lv_style_set_pad_ver, "", "(lv.style)i" } },
{ "set_prop", { (const void*) &lv_style_set_prop, "", "(lv.style)ii" } },
{ "set_radius", { (const void*) &lv_style_set_radius, "", "(lv.style)i" } },
+ { "set_rotary_sensitivity", { (const void*) &lv_style_set_rotary_sensitivity, "", "(lv.style)i" } },
{ "set_shadow_color", { (const void*) &lv_style_set_shadow_color, "", "(lv.style)(lv.color)" } },
{ "set_shadow_offset_x", { (const void*) &lv_style_set_shadow_offset_x, "", "(lv.style)i" } },
{ "set_shadow_offset_y", { (const void*) &lv_style_set_shadow_offset_y, "", "(lv.style)i" } },
@@ -188,7 +190,7 @@ const be_ntv_func_def_t lv_group_func[] = {
/* `lv_obj` methods */
#ifdef BE_LV_WIDGET_OBJ
const be_ntv_func_def_t lv_obj_func[] = {
- { "add_event_cb", { (const void*) &lv_obj_add_event_cb, "", "(lv.obj)^lv_event_cb^i." } },
+ { "add_event_cb", { (const void*) &lv_obj_add_event_cb, "lv.event_dsc", "(lv.obj)^lv_event_cb^i." } },
{ "add_flag", { (const void*) &lv_obj_add_flag, "", "(lv.obj)i" } },
{ "add_state", { (const void*) &lv_obj_add_state, "", "(lv.obj)i" } },
{ "add_style", { (const void*) &lv_obj_add_style, "", "(lv.obj)(lv.style)i" } },
@@ -227,6 +229,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "get_disp", { (const void*) &lv_obj_get_display, "lv.display", "(lv.obj)" } },
{ "get_display", { (const void*) &lv_obj_get_display, "lv.display", "(lv.obj)" } },
{ "get_event_count", { (const void*) &lv_obj_get_event_count, "i", "(lv.obj)" } },
+ { "get_event_dsc", { (const void*) &lv_obj_get_event_dsc, "lv.event_dsc", "(lv.obj)i" } },
{ "get_group", { (const void*) &lv_obj_get_group, "lv.group", "(lv.obj)" } },
{ "get_height", { (const void*) &lv_obj_get_height, "i", "(lv.obj)" } },
{ "get_index", { (const void*) &lv_obj_get_index, "i", "(lv.obj)" } },
@@ -278,6 +281,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "get_style_bg_main_opa", { (const void*) &lv_obj_get_style_bg_main_opa, "i", "(lv.obj)i" } },
{ "get_style_bg_main_stop", { (const void*) &lv_obj_get_style_bg_main_stop, "i", "(lv.obj)i" } },
{ "get_style_bg_opa", { (const void*) &lv_obj_get_style_bg_opa, "i", "(lv.obj)i" } },
+ { "get_style_bitmap_mask_src", { (const void*) &lv_obj_get_style_bitmap_mask_src, "lv.image_dsc", "(lv.obj)i" } },
{ "get_style_blend_mode", { (const void*) &lv_obj_get_style_blend_mode, "i", "(lv.obj)i" } },
{ "get_style_border_color", { (const void*) &lv_obj_get_style_border_color, "lv.color", "(lv.obj)i" } },
{ "get_style_border_color_filtered", { (const void*) &lv_obj_get_style_border_color_filtered, "lv.color", "(lv.obj)i" } },
@@ -345,6 +349,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "get_style_pad_top", { (const void*) &lv_obj_get_style_pad_top, "i", "(lv.obj)i" } },
{ "get_style_prop", { (const void*) &lv_obj_get_style_prop, "i", "(lv.obj)ii" } },
{ "get_style_radius", { (const void*) &lv_obj_get_style_radius, "i", "(lv.obj)i" } },
+ { "get_style_rotary_sensitivity", { (const void*) &lv_obj_get_style_rotary_sensitivity, "i", "(lv.obj)i" } },
{ "get_style_shadow_color", { (const void*) &lv_obj_get_style_shadow_color, "lv.color", "(lv.obj)i" } },
{ "get_style_shadow_color_filtered", { (const void*) &lv_obj_get_style_shadow_color_filtered, "lv.color", "(lv.obj)i" } },
{ "get_style_shadow_offset_x", { (const void*) &lv_obj_get_style_shadow_offset_x, "i", "(lv.obj)i" } },
@@ -384,7 +389,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "get_style_width", { (const void*) &lv_obj_get_style_width, "i", "(lv.obj)i" } },
{ "get_style_x", { (const void*) &lv_obj_get_style_x, "i", "(lv.obj)i" } },
{ "get_style_y", { (const void*) &lv_obj_get_style_y, "i", "(lv.obj)i" } },
- { "get_transformed_area", { (const void*) &lv_obj_get_transformed_area, "", "(lv.obj)(lv.area)bb" } },
+ { "get_transformed_area", { (const void*) &lv_obj_get_transformed_area, "", "(lv.obj)(lv.area)i" } },
{ "get_user_data", { (const void*) &lv_obj_get_user_data, "c", "(lv.obj)" } },
{ "get_width", { (const void*) &lv_obj_get_width, "i", "(lv.obj)" } },
{ "get_x", { (const void*) &lv_obj_get_x, "i", "(lv.obj)" } },
@@ -428,6 +433,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "remove_event", { (const void*) &lv_obj_remove_event, "b", "(lv.obj)i" } },
{ "remove_event_cb", { (const void*) &lv_obj_remove_event_cb, "b", "(lv.obj)." } },
{ "remove_event_cb_with_user_data", { (const void*) &lv_obj_remove_event_cb_with_user_data, "i", "(lv.obj).." } },
+ { "remove_event_dsc", { (const void*) &lv_obj_remove_event_dsc, "b", "(lv.obj)(lv.event_dsc)" } },
{ "remove_flag", { (const void*) &lv_obj_remove_flag, "", "(lv.obj)i" } },
{ "remove_local_style_prop", { (const void*) &lv_obj_remove_local_style_prop, "b", "(lv.obj)ii" } },
{ "remove_state", { (const void*) &lv_obj_remove_state, "", "(lv.obj)i" } },
@@ -488,6 +494,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "set_style_bg_main_opa", { (const void*) &lv_obj_set_style_bg_main_opa, "", "(lv.obj)ii" } },
{ "set_style_bg_main_stop", { (const void*) &lv_obj_set_style_bg_main_stop, "", "(lv.obj)ii" } },
{ "set_style_bg_opa", { (const void*) &lv_obj_set_style_bg_opa, "", "(lv.obj)ii" } },
+ { "set_style_bitmap_mask_src", { (const void*) &lv_obj_set_style_bitmap_mask_src, "", "(lv.obj)(lv.image_dsc)i" } },
{ "set_style_blend_mode", { (const void*) &lv_obj_set_style_blend_mode, "", "(lv.obj)ii" } },
{ "set_style_border_color", { (const void*) &lv_obj_set_style_border_color, "", "(lv.obj)(lv.color)i" } },
{ "set_style_border_opa", { (const void*) &lv_obj_set_style_border_opa, "", "(lv.obj)ii" } },
@@ -555,6 +562,7 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "set_style_pad_top", { (const void*) &lv_obj_set_style_pad_top, "", "(lv.obj)ii" } },
{ "set_style_pad_ver", { (const void*) &lv_obj_set_style_pad_ver, "", "(lv.obj)ii" } },
{ "set_style_radius", { (const void*) &lv_obj_set_style_radius, "", "(lv.obj)ii" } },
+ { "set_style_rotary_sensitivity", { (const void*) &lv_obj_set_style_rotary_sensitivity, "", "(lv.obj)ii" } },
{ "set_style_shadow_color", { (const void*) &lv_obj_set_style_shadow_color, "", "(lv.obj)(lv.color)i" } },
{ "set_style_shadow_offset_x", { (const void*) &lv_obj_set_style_shadow_offset_x, "", "(lv.obj)ii" } },
{ "set_style_shadow_offset_y", { (const void*) &lv_obj_set_style_shadow_offset_y, "", "(lv.obj)ii" } },
@@ -595,7 +603,8 @@ const be_ntv_func_def_t lv_obj_func[] = {
{ "set_y", { (const void*) &lv_obj_set_y, "", "(lv.obj)i" } },
{ "stringify_id", { (const void*) &lv_obj_stringify_id, "s", "(lv.obj)ci" } },
{ "swap", { (const void*) &lv_obj_swap, "", "(lv.obj)(lv.obj)" } },
- { "transform_point", { (const void*) &lv_obj_transform_point, "", "(lv.obj)cbb" } },
+ { "transform_point", { (const void*) &lv_obj_transform_point, "", "(lv.obj)ci" } },
+ { "transform_point_array", { (const void*) &lv_obj_transform_point_array, "", "(lv.obj)(lv.point_arr)ii" } },
{ "update_flag", { (const void*) &lv_obj_update_flag, "", "(lv.obj)ib" } },
{ "update_layout", { (const void*) &lv_obj_update_layout, "", "(lv.obj)" } },
{ "update_snap", { (const void*) &lv_obj_update_snap, "", "(lv.obj)i" } },
@@ -614,6 +623,7 @@ const be_ntv_func_def_t lv_event_func[] = {
{ "get_layer", { (const void*) &lv_event_get_layer, "c", "(lv.event)" } },
{ "get_old_size", { (const void*) &lv_event_get_old_size, "lv.area", "(lv.event)" } },
{ "get_param", { (const void*) &lv_event_get_param, "c", "(lv.event)" } },
+ { "get_rotary_diff", { (const void*) &lv_event_get_rotary_diff, "i", "(lv.event)" } },
{ "get_scroll_anim", { (const void*) &lv_event_get_scroll_anim, "lv.anim", "(lv.event)" } },
{ "get_self_size_info", { (const void*) &lv_event_get_self_size_info, "c", "(lv.event)" } },
{ "get_target", { (const void*) &lv_event_get_target, "c", "(lv.event)" } },
@@ -640,6 +650,7 @@ const be_ntv_func_def_t lv_display_func[] = {
{ "get_dpi", { (const void*) &lv_display_get_dpi, "i", "(lv.display)" } },
{ "get_driver_data", { (const void*) &lv_display_get_driver_data, "c", "(lv.display)" } },
{ "get_event_count", { (const void*) &lv_display_get_event_count, "i", "(lv.display)" } },
+ { "get_event_dsc", { (const void*) &lv_display_get_event_dsc, "lv.event_dsc", "(lv.display)i" } },
{ "get_hor_res", { (const void*) &lv_display_get_horizontal_resolution, "i", "(lv.display)" } },
{ "get_horizontal_resolution", { (const void*) &lv_display_get_horizontal_resolution, "i", "(lv.display)" } },
{ "get_inactive_time", { (const void*) &lv_display_get_inactive_time, "i", "(lv.display)" } },
@@ -696,6 +707,7 @@ const be_ntv_func_def_t lv_indev_func[] = {
{ "get_display", { (const void*) &lv_indev_get_display, "lv.display", "(lv.indev)" } },
{ "get_driver_data", { (const void*) &lv_indev_get_driver_data, "c", "(lv.indev)" } },
{ "get_event_count", { (const void*) &lv_indev_get_event_count, "i", "(lv.indev)" } },
+ { "get_event_dsc", { (const void*) &lv_indev_get_event_dsc, "lv.event_dsc", "(lv.indev)i" } },
{ "get_gesture_dir", { (const void*) &lv_indev_get_gesture_dir, "i", "(lv.indev)" } },
{ "get_group", { (const void*) &lv_indev_get_group, "lv.group", "(lv.indev)" } },
{ "get_key", { (const void*) &lv_indev_get_key, "i", "(lv.indev)" } },
@@ -987,6 +999,7 @@ const be_ntv_func_def_t lv_dropdown_func[] = {
const be_ntv_func_def_t lv_image_func[] = {
{ "get_angle", { (const void*) &lv_image_get_rotation, "i", "(lv.obj)" } },
{ "get_antialias", { (const void*) &lv_image_get_antialias, "b", "(lv.obj)" } },
+ { "get_bitmap_map_src", { (const void*) &lv_image_get_bitmap_map_src, "lv.image_dsc", "(lv.obj)" } },
{ "get_blend_mode", { (const void*) &lv_image_get_blend_mode, "i", "(lv.obj)" } },
{ "get_inner_align", { (const void*) &lv_image_get_inner_align, "i", "(lv.obj)" } },
{ "get_offset_x", { (const void*) &lv_image_get_offset_x, "i", "(lv.obj)" } },
@@ -1000,6 +1013,7 @@ const be_ntv_func_def_t lv_image_func[] = {
{ "get_zoom", { (const void*) &lv_image_get_scale, "i", "(lv.obj)" } },
{ "set_angle", { (const void*) &lv_image_set_rotation, "", "(lv.obj)i" } },
{ "set_antialias", { (const void*) &lv_image_set_antialias, "", "(lv.obj)b" } },
+ { "set_bitmap_map_src", { (const void*) &lv_image_set_bitmap_map_src, "", "(lv.obj)(lv.image_dsc)" } },
{ "set_blend_mode", { (const void*) &lv_image_set_blend_mode, "", "(lv.obj)i" } },
{ "set_inner_align", { (const void*) &lv_image_set_inner_align, "", "(lv.obj)i" } },
{ "set_offset_x", { (const void*) &lv_image_set_offset_x, "", "(lv.obj)i" } },
diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c
index f7a439ea6..895ad0836 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c
+++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c
@@ -100,6 +100,8 @@ const be_ntv_func_def_t lv_func[] = {
{ "draw_rect", { (const void*) &lv_draw_rect, "", "c(lv.draw_rect_dsc)(lv.area)" } },
{ "draw_rect_dsc_init", { (const void*) &lv_draw_rect_dsc_init, "", "(lv.draw_rect_dsc)" } },
{ "draw_vector", { (const void*) &lv_draw_vector, "", "c" } },
+ { "event_dsc_get_cb", { (const void*) &lv_event_dsc_get_cb, "lv.event_cb", "(lv.event_dsc)" } },
+ { "event_dsc_get_user_data", { (const void*) &lv_event_dsc_get_user_data, "c", "(lv.event_dsc)" } },
{ "event_register_id", { (const void*) &lv_event_register_id, "i", "" } },
{ "flex_init", { (const void*) &lv_flex_init, "", "" } },
{ "font_get_glyph_width", { (const void*) &lv_font_get_glyph_width, "i", "(lv.font)ii" } },
@@ -132,6 +134,7 @@ const be_ntv_func_def_t lv_func[] = {
{ "objid_builtin_destroy", { (const void*) &lv_objid_builtin_destroy, "", "" } },
{ "pct", { (const void*) &lv_pct, "i", "i" } },
{ "pct_to_px", { (const void*) &lv_pct_to_px, "i", "ii" } },
+ { "point_array_transform", { (const void*) &lv_point_array_transform, "", "ciiiicb" } },
{ "point_from_precise", { (const void*) &lv_point_from_precise, "i", "(lv.point_precise)" } },
{ "point_precise_set", { (const void*) &lv_point_precise_set, "", "(lv.point_precise)ii" } },
{ "point_precise_swap", { (const void*) &lv_point_precise_swap, "", "(lv.point_precise)(lv.point_precise)" } },
@@ -206,6 +209,7 @@ const be_ntv_func_def_t lv_func[] = {
{ "vector_path_copy", { (const void*) &lv_vector_path_copy, "", "cc" } },
{ "vector_path_create", { (const void*) &lv_vector_path_create, "c", "i" } },
{ "vector_path_delete", { (const void*) &lv_vector_path_delete, "", "c" } },
+ { "vector_path_get_bounding", { (const void*) &lv_vector_path_get_bounding, "", "c(lv.area)" } },
{ "version_info", { (const void*) &lv_version_info, "s", "" } },
{ "version_major", { (const void*) &lv_version_major, "i", "" } },
{ "version_minor", { (const void*) &lv_version_minor, "i", "" } },
@@ -308,6 +312,7 @@ const be_const_member_t lv0_constants[] = {
{ "COLOR_FORMAT_A2", be_cconst_int(LV_COLOR_FORMAT_A2) },
{ "COLOR_FORMAT_A4", be_cconst_int(LV_COLOR_FORMAT_A4) },
{ "COLOR_FORMAT_A8", be_cconst_int(LV_COLOR_FORMAT_A8) },
+ { "COLOR_FORMAT_ARGB8565", be_cconst_int(LV_COLOR_FORMAT_ARGB8565) },
{ "COLOR_FORMAT_ARGB8888", be_cconst_int(LV_COLOR_FORMAT_ARGB8888) },
{ "COLOR_FORMAT_I1", be_cconst_int(LV_COLOR_FORMAT_I1) },
{ "COLOR_FORMAT_I2", be_cconst_int(LV_COLOR_FORMAT_I2) },
@@ -374,10 +379,6 @@ const be_const_member_t lv0_constants[] = {
{ "DISP_ROTATION_180", be_cconst_int(LV_DISPLAY_ROTATION_180) },
{ "DISP_ROTATION_270", be_cconst_int(LV_DISPLAY_ROTATION_270) },
{ "DISP_ROTATION_90", be_cconst_int(LV_DISPLAY_ROTATION_90) },
- { "DRAW_LETTER_BITMAP_FORMAT_A8", be_cconst_int(LV_DRAW_LETTER_BITMAP_FORMAT_A8) },
- { "DRAW_LETTER_BITMAP_FORMAT_IMAGE", be_cconst_int(LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE) },
- { "DRAW_LETTER_BITMAP_FORMAT_INVALID", be_cconst_int(LV_DRAW_LETTER_BITMAP_FORMAT_INVALID) },
- { "DRAW_LETTER_VECTOR_FORMAT", be_cconst_int(LV_DRAW_LETTER_VECTOR_FORMAT) },
{ "DRAW_TASK_STATE_IN_PROGRESS", be_cconst_int(LV_DRAW_TASK_STATE_IN_PROGRESS) },
{ "DRAW_TASK_STATE_QUEUED", be_cconst_int(LV_DRAW_TASK_STATE_QUEUED) },
{ "DRAW_TASK_STATE_READY", be_cconst_int(LV_DRAW_TASK_STATE_READY) },
@@ -415,6 +416,8 @@ const be_const_member_t lv0_constants[] = {
{ "EVENT_DRAW_TASK_ADDED", be_cconst_int(LV_EVENT_DRAW_TASK_ADDED) },
{ "EVENT_FLUSH_FINISH", be_cconst_int(LV_EVENT_FLUSH_FINISH) },
{ "EVENT_FLUSH_START", be_cconst_int(LV_EVENT_FLUSH_START) },
+ { "EVENT_FLUSH_WAIT_FINISH", be_cconst_int(LV_EVENT_FLUSH_WAIT_FINISH) },
+ { "EVENT_FLUSH_WAIT_START", be_cconst_int(LV_EVENT_FLUSH_WAIT_START) },
{ "EVENT_FOCUSED", be_cconst_int(LV_EVENT_FOCUSED) },
{ "EVENT_GESTURE", be_cconst_int(LV_EVENT_GESTURE) },
{ "EVENT_GET_SELF_SIZE", be_cconst_int(LV_EVENT_GET_SELF_SIZE) },
@@ -441,6 +444,7 @@ const be_const_member_t lv0_constants[] = {
{ "EVENT_RENDER_READY", be_cconst_int(LV_EVENT_RENDER_READY) },
{ "EVENT_RENDER_START", be_cconst_int(LV_EVENT_RENDER_START) },
{ "EVENT_RESOLUTION_CHANGED", be_cconst_int(LV_EVENT_RESOLUTION_CHANGED) },
+ { "EVENT_ROTARY", be_cconst_int(LV_EVENT_ROTARY) },
{ "EVENT_SCREEN_LOADED", be_cconst_int(LV_EVENT_SCREEN_LOADED) },
{ "EVENT_SCREEN_LOAD_START", be_cconst_int(LV_EVENT_SCREEN_LOAD_START) },
{ "EVENT_SCREEN_UNLOADED", be_cconst_int(LV_EVENT_SCREEN_UNLOADED) },
@@ -537,7 +541,7 @@ const be_const_member_t lv0_constants[] = {
{ "IMAGE_FLAGS_USER6", be_cconst_int(LV_IMAGE_FLAGS_USER6) },
{ "IMAGE_FLAGS_USER7", be_cconst_int(LV_IMAGE_FLAGS_USER7) },
{ "IMAGE_FLAGS_USER8", be_cconst_int(LV_IMAGE_FLAGS_USER8) },
- { "IMAGE_FLAGS_VECTORS", be_cconst_int(LV_IMAGE_FLAGS_VECTORS) },
+ { "IMAGE_HEADER_MAGIC", be_cconst_int(LV_IMAGE_HEADER_MAGIC) },
{ "IMAGE_SRC_FILE", be_cconst_int(LV_IMAGE_SRC_FILE) },
{ "IMAGE_SRC_SYMBOL", be_cconst_int(LV_IMAGE_SRC_SYMBOL) },
{ "IMAGE_SRC_UNKNOWN", be_cconst_int(LV_IMAGE_SRC_UNKNOWN) },
@@ -628,6 +632,10 @@ const be_const_member_t lv0_constants[] = {
{ "OBJ_FLAG_USER_4", be_cconst_int(LV_OBJ_FLAG_USER_4) },
{ "OBJ_FLAG_WIDGET_1", be_cconst_int(LV_OBJ_FLAG_WIDGET_1) },
{ "OBJ_FLAG_WIDGET_2", be_cconst_int(LV_OBJ_FLAG_WIDGET_2) },
+ { "OBJ_POINT_TRANSFORM_FLAG_INVERSE", be_cconst_int(LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE) },
+ { "OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE", be_cconst_int(LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE) },
+ { "OBJ_POINT_TRANSFORM_FLAG_NONE", be_cconst_int(LV_OBJ_POINT_TRANSFORM_FLAG_NONE) },
+ { "OBJ_POINT_TRANSFORM_FLAG_RECURSIVE", be_cconst_int(LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE) },
{ "OBJ_TREE_WALK_END", be_cconst_int(LV_OBJ_TREE_WALK_END) },
{ "OBJ_TREE_WALK_NEXT", be_cconst_int(LV_OBJ_TREE_WALK_NEXT) },
{ "OBJ_TREE_WALK_SKIP_CHILDREN", be_cconst_int(LV_OBJ_TREE_WALK_SKIP_CHILDREN) },
@@ -765,6 +773,7 @@ const be_const_member_t lv0_constants[] = {
{ "STYLE_BG_MAIN_OPA", be_cconst_int(LV_STYLE_BG_MAIN_OPA) },
{ "STYLE_BG_MAIN_STOP", be_cconst_int(LV_STYLE_BG_MAIN_STOP) },
{ "STYLE_BG_OPA", be_cconst_int(LV_STYLE_BG_OPA) },
+ { "STYLE_BITMAP_MASK_SRC", be_cconst_int(LV_STYLE_BITMAP_MASK_SRC) },
{ "STYLE_BLEND_MODE", be_cconst_int(LV_STYLE_BLEND_MODE) },
{ "STYLE_BORDER_COLOR", be_cconst_int(LV_STYLE_BORDER_COLOR) },
{ "STYLE_BORDER_OPA", be_cconst_int(LV_STYLE_BORDER_OPA) },
@@ -829,6 +838,7 @@ const be_const_member_t lv0_constants[] = {
{ "STYLE_RADIUS", be_cconst_int(LV_STYLE_RADIUS) },
{ "STYLE_RES_FOUND", be_cconst_int(LV_STYLE_RES_FOUND) },
{ "STYLE_RES_NOT_FOUND", be_cconst_int(LV_STYLE_RES_NOT_FOUND) },
+ { "STYLE_ROTARY_SENSITIVITY", be_cconst_int(LV_STYLE_ROTARY_SENSITIVITY) },
{ "STYLE_SHADOW_COLOR", be_cconst_int(LV_STYLE_SHADOW_COLOR) },
{ "STYLE_SHADOW_OFFSET_X", be_cconst_int(LV_STYLE_SHADOW_OFFSET_X) },
{ "STYLE_SHADOW_OFFSET_Y", be_cconst_int(LV_STYLE_SHADOW_OFFSET_Y) },
diff --git a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h
index bcdc37624..e15db5ff7 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h
+++ b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_enum.h
@@ -254,6 +254,11 @@ LV_COVER_RES_NOT_COVER
LV_COVER_RES_MASKED
// File: ../../lvgl/src/core/lv_obj_pos.h
+LV_OBJ_POINT_TRANSFORM_FLAG_NONE
+LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE
+LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE
+LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE
+
// File: ../../lvgl/src/core/lv_obj_property.h
// File: ../../lvgl/src/core/lv_obj_scroll.h
LV_SCROLLBAR_MODE_OFF
@@ -324,11 +329,6 @@ LV_DRAW_TASK_STATE_READY
LV_STRIDE_AUTO
// File: ../../lvgl/src/draw/lv_draw_image.h
// File: ../../lvgl/src/draw/lv_draw_label.h
-LV_DRAW_LETTER_BITMAP_FORMAT_INVALID
-LV_DRAW_LETTER_BITMAP_FORMAT_A8
-LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE
-LV_DRAW_LETTER_VECTOR_FORMAT
-
// File: ../../lvgl/src/draw/lv_draw_line.h
// File: ../../lvgl/src/draw/lv_draw_mask.h
// File: ../../lvgl/src/draw/lv_draw_rect.h
@@ -377,12 +377,17 @@ LV_VECTOR_GRADIENT_SPREAD_REFLECT
LV_VECTOR_GRADIENT_STYLE_LINEAR
LV_VECTOR_GRADIENT_STYLE_RADIAL
-// File: ../../lvgl/src/draw/lv_image_buf.h
+// File: ../../lvgl/src/draw/lv_image_decoder.h
+LV_IMAGE_SRC_VARIABLE
+LV_IMAGE_SRC_FILE
+LV_IMAGE_SRC_SYMBOL
+LV_IMAGE_SRC_UNKNOWN
+
+// File: ../../lvgl/src/draw/lv_image_dsc.h
LV_IMAGE_FLAGS_PREMULTIPLIED
-LV_IMAGE_FLAGS_MODIFIABLE
-LV_IMAGE_FLAGS_VECTORS
LV_IMAGE_FLAGS_COMPRESSED
LV_IMAGE_FLAGS_ALLOCATED
+LV_IMAGE_FLAGS_MODIFIABLE
LV_IMAGE_FLAGS_USER1
LV_IMAGE_FLAGS_USER2
LV_IMAGE_FLAGS_USER3
@@ -396,12 +401,7 @@ LV_IMAGE_COMPRESS_NONE
LV_IMAGE_COMPRESS_RLE
LV_IMAGE_COMPRESS_LZ4
-// File: ../../lvgl/src/draw/lv_image_decoder.h
-LV_IMAGE_SRC_VARIABLE
-LV_IMAGE_SRC_FILE
-LV_IMAGE_SRC_SYMBOL
-LV_IMAGE_SRC_UNKNOWN
-
+LV_IMAGE_HEADER_MAGIC
// File: ../../lvgl/src/layouts/flex/lv_flex.h
LV_FLEX_ALIGN_START
LV_FLEX_ALIGN_END
@@ -512,6 +512,7 @@ LV_COLOR_FORMAT_I4
LV_COLOR_FORMAT_I8
LV_COLOR_FORMAT_A8
LV_COLOR_FORMAT_RGB565
+LV_COLOR_FORMAT_ARGB8565
LV_COLOR_FORMAT_RGB565A8
LV_COLOR_FORMAT_RGB888
LV_COLOR_FORMAT_ARGB8888
@@ -555,6 +556,7 @@ LV_EVENT_SCROLL_END
LV_EVENT_SCROLL
LV_EVENT_GESTURE
LV_EVENT_KEY
+LV_EVENT_ROTARY
LV_EVENT_FOCUSED
LV_EVENT_DEFOCUSED
LV_EVENT_LEAVE
@@ -597,6 +599,8 @@ LV_EVENT_RENDER_START
LV_EVENT_RENDER_READY
LV_EVENT_FLUSH_START
LV_EVENT_FLUSH_FINISH
+LV_EVENT_FLUSH_WAIT_START
+LV_EVENT_FLUSH_WAIT_FINISH
LV_EVENT_VSYNC
LV_EVENT_PREPROCESS
@@ -775,6 +779,8 @@ LV_STYLE_TRANSFORM_PIVOT_X
LV_STYLE_TRANSFORM_PIVOT_Y
LV_STYLE_TRANSFORM_SKEW_X
LV_STYLE_TRANSFORM_SKEW_Y
+LV_STYLE_BITMAP_MASK_SRC
+LV_STYLE_ROTARY_SENSITIVITY
LV_STYLE_FLEX_FLOW
LV_STYLE_FLEX_MAIN_PLACE
LV_STYLE_FLEX_CROSS_PLACE
diff --git a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h
index a909bd7b7..f0e6f9903 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h
+++ b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h
@@ -100,16 +100,18 @@ lv_result_t lv_obj_send_event(lv_obj_t * obj, lv_event_code_t event_code, void *
lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e)
lv_obj_t * lv_event_get_current_target_obj(lv_event_t * e)
lv_obj_t * lv_event_get_target_obj(lv_event_t * e)
-void lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data)
+lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data)
uint32_t lv_obj_get_event_count(lv_obj_t * obj)
lv_event_dsc_t * lv_obj_get_event_dsc(lv_obj_t * obj, uint32_t index)
bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index)
bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb)
+bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc)
uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data)
lv_indev_t * lv_event_get_indev(lv_event_t * e)
lv_layer_t * lv_event_get_layer(lv_event_t * e)
const lv_area_t * lv_event_get_old_size(lv_event_t * e)
uint32_t lv_event_get_key(lv_event_t * e)
+int32_t lv_event_get_rotary_diff(lv_event_t * e)
lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e)
void lv_event_set_ext_draw_size(lv_event_t * e, int32_t size)
lv_point_t * lv_event_get_self_size_info(lv_event_t * e)
@@ -154,8 +156,9 @@ bool lv_obj_refresh_self_size(lv_obj_t * obj)
void lv_obj_refr_pos(lv_obj_t * obj)
void lv_obj_move_to(lv_obj_t * obj, int32_t x, int32_t y)
void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, bool ignore_floating)
-void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv)
-void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool recursive, bool inv)
+void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags)
+void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count, lv_obj_point_transform_flag_t flags)
+void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags)
void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area)
void lv_obj_invalidate(const lv_obj_t * obj)
bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
@@ -336,6 +339,8 @@ static inline const lv_style_transition_dsc_t * lv_obj_get_style_transition(cons
static inline lv_blend_mode_t lv_obj_get_style_blend_mode(const lv_obj_t * obj, uint32_t part)
static inline uint16_t lv_obj_get_style_layout(const lv_obj_t * obj, uint32_t part)
static inline lv_base_dir_t lv_obj_get_style_base_dir(const lv_obj_t * obj, uint32_t part)
+static inline const lv_image_dsc_t * lv_obj_get_style_bitmap_mask_src(const lv_obj_t * obj, uint32_t part)
+static inline uint32_t lv_obj_get_style_rotary_sensitivity(const lv_obj_t * obj, uint32_t part)
static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, uint32_t part)
static inline lv_flex_align_t lv_obj_get_style_flex_main_place(const lv_obj_t * obj, uint32_t part)
static inline lv_flex_align_t lv_obj_get_style_flex_cross_place(const lv_obj_t * obj, uint32_t part)
@@ -444,6 +449,8 @@ void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t
void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector)
void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector)
void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector)
+void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const lv_image_dsc_t * value, lv_style_selector_t selector)
+void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector)
void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector)
void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector)
void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector)
@@ -545,6 +552,7 @@ void lv_display_set_user_data(lv_display_t * disp, void * user_data)
void lv_display_set_driver_data(lv_display_t * disp, void * driver_data)
void * lv_display_get_user_data(lv_display_t * disp)
void * lv_display_get_driver_data(lv_display_t * disp)
+lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp)
static inline int32_t lv_dpx(int32_t n)
static inline int32_t lv_display_dpx(const lv_display_t * disp, int32_t n)
@@ -568,11 +576,13 @@ void * lv_draw_layer_go_to_xy(lv_layer_t * layer, int32_t x, int32_t y)
// ../../lvgl/src/draw/lv_draw_arc.h
void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc)
+lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task)
void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc)
void lv_draw_arc_get_area(int32_t x, int32_t y, uint16_t radius, lv_value_precise_t start_angle, lv_value_precise_t end_angle, int32_t w, bool rounded, lv_area_t * area)
// ../../lvgl/src/draw/lv_draw_label.h
void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc)
+lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task)
void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc)
void lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc, const lv_area_t * coords)
void lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc, const lv_point_t * point, uint32_t unicode_letter)
@@ -580,21 +590,27 @@ void lv_draw_label_iterate_characters(lv_draw_unit_t * draw_unit, const lv_draw_
// ../../lvgl/src/draw/lv_draw_line.h
void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
+lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task)
void lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc)
// ../../lvgl/src/draw/lv_draw_mask.h
void lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc)
+lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task)
void lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc)
// ../../lvgl/src/draw/lv_draw_rect.h
void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc)
+lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task)
void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc)
+lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task)
void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc)
+lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task)
void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
// ../../lvgl/src/draw/lv_draw_triangle.h
void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * draw_dsc)
+lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task)
void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * draw_dsc)
// ../../lvgl/src/draw/lv_draw_vector.h
@@ -604,6 +620,8 @@ void lv_matrix_scale(lv_matrix_t * matrix, float scale_x, float scale_y)
void lv_matrix_rotate(lv_matrix_t * matrix, float degree)
void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y)
void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * matrix2)
+void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point)
+void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path)
lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality)
void lv_vector_path_copy(lv_vector_path_t * target_path, const lv_vector_path_t * path)
void lv_vector_path_clear(lv_vector_path_t * path)
@@ -613,8 +631,10 @@ void lv_vector_path_line_to(lv_vector_path_t * path, const lv_fpoint_t * p)
void lv_vector_path_quad_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2)
void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, const lv_fpoint_t * p2, const lv_fpoint_t * p3)
void lv_vector_path_close(lv_vector_path_t * path)
+void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area)
void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry)
void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry)
+void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle, float sweep, bool pie)
void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath)
lv_vector_dsc_t * lv_vector_dsc_create(lv_layer_t * layer)
void lv_vector_dsc_delete(lv_vector_dsc_t * dsc)
@@ -661,17 +681,17 @@ void lv_indev_delete(lv_indev_t * indev)
lv_indev_t * lv_indev_get_next(lv_indev_t * indev)
void lv_indev_read(lv_indev_t * indev)
void lv_indev_read_timer_cb(lv_timer_t * timer)
-void lv_indev_enable(lv_indev_t * indev, bool en)
+void lv_indev_enable(lv_indev_t * indev, bool enable)
lv_indev_t * lv_indev_active(void)
void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type)
void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb)
void lv_indev_set_user_data(lv_indev_t * indev, void * user_data)
void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data)
+void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp)
lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev)
lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev)
lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev)
lv_group_t * lv_indev_get_group(const lv_indev_t * indev)
-void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp)
lv_display_t * lv_indev_get_display(const lv_indev_t * indev)
void * lv_indev_get_user_data(const lv_indev_t * indev)
void * lv_indev_get_driver_data(const lv_indev_t * indev)
@@ -719,11 +739,13 @@ void lv_qrcode_set_dark_color(lv_obj_t * obj, lv_color_t color)
void lv_qrcode_set_light_color(lv_obj_t * obj, lv_color_t color)
lv_result_t lv_qrcode_update(lv_obj_t * obj, const void * data, uint32_t data_len)
-// ../../lvgl/src/lv_api_map.h
+// ../../lvgl/src/lv_api_map_v8.h
static inline uint32_t lv_task_handler(void)
static inline void lv_obj_move_foreground(lv_obj_t * obj)
static inline void lv_obj_move_background(lv_obj_t * obj)
+// ../../lvgl/src/lv_api_map_v9_0.h
+
// ../../lvgl/src/misc/lv_anim.h
void lv_anim_init(lv_anim_t * a)
static inline void lv_anim_set_var(lv_anim_t * a, void * var)
@@ -774,7 +796,8 @@ uint32_t lv_area_get_size(const lv_area_t * area_p)
void lv_area_increase(lv_area_t * area, int32_t w_extra, int32_t h_extra)
void lv_area_move(lv_area_t * area, int32_t x_ofs, int32_t y_ofs)
void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y)
-void lv_point_transform(lv_point_t * p, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, bool zoom_first)
+void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, bool zoom_first)
+void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot, bool zoom_first)
static inline lv_point_t lv_point_from_precise(const lv_point_precise_t * p)
static inline lv_point_precise_t lv_point_to_precise(const lv_point_t * p)
static inline void lv_point_set(lv_point_t * p, int32_t x, int32_t y)
@@ -817,7 +840,8 @@ static inline void lv_color_filter_dsc_init(lv_color_filter_dsc_t * dsc, lv_colo
// ../../lvgl/src/misc/lv_event.h
lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess)
-void lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data)
+lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data)
+bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc)
uint32_t lv_event_get_count(lv_event_list_t * list)
lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index)
lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc)
@@ -948,6 +972,8 @@ void lv_style_set_transition(lv_style_t * style, const lv_style_transition_dsc_t
void lv_style_set_blend_mode(lv_style_t * style, lv_blend_mode_t value)
void lv_style_set_layout(lv_style_t * style, uint16_t value)
void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value)
+void lv_style_set_bitmap_mask_src(lv_style_t * style, const lv_image_dsc_t * value)
+void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value)
void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value)
void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value)
void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value)
@@ -1108,7 +1134,7 @@ lv_obj_t * lv_canvas_create(lv_obj_t * parent)
void lv_canvas_set_buffer(lv_obj_t * obj, void * buf, int32_t w, int32_t h, lv_color_format_t cf)
void lv_canvas_set_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf)
void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv_opa_t opa)
-void lv_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color32_t c)
+void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color)
lv_draw_buf_t * lv_canvas_get_draw_buf(lv_obj_t * obj)
lv_color32_t lv_canvas_get_px(lv_obj_t * obj, int32_t x, int32_t y)
lv_image_dsc_t * lv_canvas_get_image(lv_obj_t * canvas)
@@ -1197,6 +1223,7 @@ void lv_image_set_scale_y(lv_obj_t * obj, uint32_t zoom)
void lv_image_set_blend_mode(lv_obj_t * obj, lv_blend_mode_t blend_mode)
void lv_image_set_antialias(lv_obj_t * obj, bool antialias)
void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align)
+void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src)
const void * lv_image_get_src(lv_obj_t * obj)
int32_t lv_image_get_offset_x(lv_obj_t * obj)
int32_t lv_image_get_offset_y(lv_obj_t * obj)
@@ -1208,6 +1235,7 @@ int32_t lv_image_get_scale_y(lv_obj_t * obj)
lv_blend_mode_t lv_image_get_blend_mode(lv_obj_t * obj)
bool lv_image_get_antialias(lv_obj_t * obj)
lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj)
+const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj)
// ../../lvgl/src/widgets/imagebutton/lv_imagebutton.h
lv_obj_t * lv_imagebutton_create(lv_obj_t * parent)
diff --git a/lib/libesp32_lvgl/lv_binding_berry/src/be_lvgl_ctypes_definitions.c b/lib/libesp32_lvgl/lv_binding_berry/src/be_lvgl_ctypes_definitions.c
index 197fff347..86e2b957e 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/src/be_lvgl_ctypes_definitions.c
+++ b/lib/libesp32_lvgl/lv_binding_berry/src/be_lvgl_ctypes_definitions.c
@@ -192,10 +192,10 @@ const be_ctypes_structure_t be_lv_image_header = {
}};
const be_ctypes_structure_t be_lv_draw_image_dsc = {
- 84, /* size in bytes */
- 29, /* number of elements */
+ 100, /* size in bytes */
+ 33, /* number of elements */
be_ctypes_instance_mappings,
- (const be_ctypes_structure_item_t[29]) {
+ (const be_ctypes_structure_item_t[33]) {
{ "antialias", 77, 4, 1, ctypes_bf, 0 },
{ "base_dsc_size", 20, 0, 0, ctypes_u32, 0 },
{ "base_id1", 8, 0, 0, ctypes_u32, 0 },
@@ -213,6 +213,10 @@ const be_ctypes_structure_t be_lv_draw_image_dsc = {
{ "header_stride", 40, 0, 0, ctypes_u16, 0 },
{ "header_w", 36, 0, 0, ctypes_u16, 0 },
{ "opa", 76, 0, 0, ctypes_u8, 0 },
+ { "original_area_x1", 80, 0, 0, ctypes_i32, 0 },
+ { "original_area_x2", 88, 0, 0, ctypes_i32, 0 },
+ { "original_area_y1", 84, 0, 0, ctypes_i32, 0 },
+ { "original_area_y2", 92, 0, 0, ctypes_i32, 0 },
{ "pivot_x", 64, 0, 0, ctypes_i32, 0 },
{ "pivot_y", 68, 0, 0, ctypes_i32, 0 },
{ "recolor", 72, 0, 0, ctypes_u24, 1 },
@@ -223,7 +227,7 @@ const be_ctypes_structure_t be_lv_draw_image_dsc = {
{ "skew_x", 56, 0, 0, ctypes_i32, 0 },
{ "skew_y", 60, 0, 0, ctypes_i32, 0 },
{ "src", 28, 0, 0, ctypes_ptr32, 0 },
- { "sup", 80, 0, 0, ctypes_ptr32, 0 },
+ { "sup", 96, 0, 0, ctypes_ptr32, 0 },
{ "tile", 77, 5, 1, ctypes_bf, 0 },
}};
@@ -260,42 +264,6 @@ const be_ctypes_structure_t be_lv_draw_label_dsc = {
{ "text_local", 76, 6, 1, ctypes_bf, 0 },
}};
-const be_ctypes_structure_t be_lv_meter_scale = {
- 40, /* size in bytes */
- 14, /* number of elements */
- be_ctypes_instance_mappings,
- (const be_ctypes_structure_item_t[14]) {
- { "angle_range", 34, 0, 0, ctypes_u16, 0 },
- { "label_gap", 20, 0, 0, ctypes_i16, 0 },
- { "max", 28, 0, 0, ctypes_i32, 0 },
- { "min", 24, 0, 0, ctypes_i32, 0 },
- { "r_mod", 32, 0, 0, ctypes_i16, 0 },
- { "rotation", 36, 0, 0, ctypes_i16, 0 },
- { "tick_cnt", 4, 0, 0, ctypes_u16, 0 },
- { "tick_color", 0, 0, 0, ctypes_u24, 1 },
- { "tick_length", 6, 0, 0, ctypes_u16, 0 },
- { "tick_major_color", 10, 0, 0, ctypes_u24, 1 },
- { "tick_major_length", 16, 0, 0, ctypes_u16, 0 },
- { "tick_major_nth", 14, 0, 0, ctypes_u16, 0 },
- { "tick_major_width", 18, 0, 0, ctypes_u16, 0 },
- { "tick_width", 8, 0, 0, ctypes_u16, 0 },
-}};
-
-const be_ctypes_structure_t be_lv_meter_indicator = {
- 28, /* size in bytes */
- 8, /* number of elements */
- be_ctypes_instance_mappings,
- (const be_ctypes_structure_item_t[8]) {
- { "data0", 16, 0, 0, ctypes_ptr32, 0 },
- { "data1", 20, 0, 0, ctypes_ptr32, 0 },
- { "data2", 24, 0, 0, ctypes_ptr32, 0 },
- { "end_value", 12, 0, 0, ctypes_i32, 0 },
- { "opa", 5, 0, 0, ctypes_u8, 0 },
- { "scale", 0, 0, 0, ctypes_ptr32, 0 },
- { "start_value", 8, 0, 0, ctypes_i32, 0 },
- { "type", 4, 0, 0, ctypes_u8, 0 },
-}};
-
const be_ctypes_structure_t be_lv_chart_series = {
20, /* size in bytes */
9, /* number of elements */
@@ -362,10 +330,10 @@ const be_ctypes_structure_t be_lv_event = {
}};
const be_ctypes_structure_t be_lv_image_dsc = {
- 20, /* size in bytes */
- 9, /* number of elements */
+ 24, /* size in bytes */
+ 10, /* number of elements */
be_ctypes_instance_mappings,
- (const be_ctypes_structure_item_t[9]) {
+ (const be_ctypes_structure_item_t[10]) {
{ "data", 16, 0, 0, ctypes_ptr32, 0 },
{ "data_size", 12, 0, 0, ctypes_u32, 0 },
{ "header_cf", 1, 0, 0, ctypes_u8, 0 },
@@ -375,6 +343,7 @@ const be_ctypes_structure_t be_lv_image_dsc = {
{ "header_reserved_2", 10, 0, 0, ctypes_u16, 0 },
{ "header_stride", 8, 0, 0, ctypes_u16, 0 },
{ "header_w", 4, 0, 0, ctypes_u16, 0 },
+ { "reserved", 20, 0, 0, ctypes_ptr32, 0 },
}};
const be_ctypes_structure_t be_lv_style_transition_dsc = {
@@ -412,6 +381,16 @@ const be_ctypes_structure_t be_lv_timer_ntv = {
{ "user_data", 12, 0, 0, ctypes_ptr32, 0 },
}};
+const be_ctypes_structure_t be_lv_event_dsc = {
+ 12, /* size in bytes */
+ 3, /* number of elements */
+ be_ctypes_instance_mappings,
+ (const be_ctypes_structure_item_t[3]) {
+ { "cb", 0, 0, 0, ctypes_ptr32, 0 },
+ { "filter", 8, 0, 0, ctypes_u32, 0 },
+ { "user_data", 4, 0, 0, ctypes_ptr32, 0 },
+}};
+
const be_ctypes_structure_t be_lv_ts_calibration = {
20, /* size in bytes */
5, /* number of elements */
@@ -440,12 +419,11 @@ static be_define_ctypes_class(lv_draw_label_dsc, &be_lv_draw_label_dsc, &be_clas
static be_define_ctypes_class(lv_draw_line_dsc, &be_lv_draw_line_dsc, &be_class_ctypes_bytes, "lv_draw_line_dsc");
static be_define_ctypes_class(lv_draw_rect_dsc, &be_lv_draw_rect_dsc, &be_class_ctypes_bytes, "lv_draw_rect_dsc");
static be_define_ctypes_class(lv_event, &be_lv_event, &be_class_ctypes_bytes, "lv_event");
+static be_define_ctypes_class(lv_event_dsc, &be_lv_event_dsc, &be_class_ctypes_bytes, "lv_event_dsc");
static be_define_ctypes_class(lv_grad_dsc, &be_lv_grad_dsc, &be_class_ctypes_bytes, "lv_grad_dsc");
static be_define_ctypes_class(lv_gradient_stop, &be_lv_gradient_stop, &be_class_ctypes_bytes, "lv_gradient_stop");
static be_define_ctypes_class(lv_image_dsc, &be_lv_image_dsc, &be_class_ctypes_bytes, "lv_image_dsc");
static be_define_ctypes_class(lv_image_header, &be_lv_image_header, &be_class_ctypes_bytes, "lv_image_header");
-static be_define_ctypes_class(lv_meter_indicator, &be_lv_meter_indicator, &be_class_ctypes_bytes, "lv_meter_indicator");
-static be_define_ctypes_class(lv_meter_scale, &be_lv_meter_scale, &be_class_ctypes_bytes, "lv_meter_scale");
static be_define_ctypes_class(lv_obj_class, &be_lv_obj_class, &be_class_ctypes_bytes, "lv_obj_class");
static be_define_ctypes_class(lv_point, &be_lv_point, &be_class_ctypes_bytes, "lv_point");
static be_define_ctypes_class(lv_point_precise, &be_lv_point_precise, &be_class_ctypes_bytes, "lv_point_precise");
@@ -465,12 +443,11 @@ be_ctypes_class_by_name_t be_ctypes_lvgl_classes[] = {
{ "lv_draw_line_dsc", &be_class_lv_draw_line_dsc },
{ "lv_draw_rect_dsc", &be_class_lv_draw_rect_dsc },
{ "lv_event", &be_class_lv_event },
+ { "lv_event_dsc", &be_class_lv_event_dsc },
{ "lv_grad_dsc", &be_class_lv_grad_dsc },
{ "lv_gradient_stop", &be_class_lv_gradient_stop },
{ "lv_image_dsc", &be_class_lv_image_dsc },
{ "lv_image_header", &be_class_lv_image_header },
- { "lv_meter_indicator", &be_class_lv_meter_indicator },
- { "lv_meter_scale", &be_class_lv_meter_scale },
{ "lv_obj_class", &be_class_lv_obj_class },
{ "lv_point", &be_class_lv_point },
{ "lv_point_precise", &be_class_lv_point_precise },
diff --git a/lib/libesp32_lvgl/lv_binding_berry/src/embedded/lvgl_ctypes.py b/lib/libesp32_lvgl/lv_binding_berry/src/embedded/lvgl_ctypes.py
index a30f4ff9a..c3be55262 100644
--- a/lib/libesp32_lvgl/lv_binding_berry/src/embedded/lvgl_ctypes.py
+++ b/lib/libesp32_lvgl/lv_binding_berry/src/embedded/lvgl_ctypes.py
@@ -82,7 +82,7 @@ lv_area = ct.structure(lv_area, "lv_area")
# lv_opa_t opa; /**< The opacity of the color*/
# uint8_t frac; /**< The stop position in 1/255 unit */
# } lv_gradient_stop_t;
-lv_gradient_stop = [ # valid LVGL9
+lv_gradient_stop = [ # valid LVGL91
[lv_color, "color"],
[lv_opa, "opa"],
[uint8_t, "frac"],
@@ -95,7 +95,7 @@ lv_gradient_stop = ct.structure(lv_gradient_stop, "lv_gradient_stop")
# lv_grad_dir_t dir : 3; /**< The gradient direction.
# * Any of LV_GRAD_DIR_HOR, LV_GRAD_DIR_VER, LV_GRAD_DIR_NONE */
# } lv_grad_dsc_t;
-lv_grad_dsc = [ # valid LVGL9
+lv_grad_dsc = [ # valid LVGL91
# since it's an array and not two structures, we need to explicitly unroll it here or the alignment is wrong
# [lv_gradient_stop, "stops_0"],
[lv_color, "stops_0_color"],
@@ -121,7 +121,7 @@ lv_grad_dsc = ct.structure(lv_grad_dsc, "lv_grad_dsc")
# size_t dsc_size;
# void * user_data;
# } lv_draw_dsc_base_t;
-lv_draw_dsc_base = [ # valid LVGL9
+lv_draw_dsc_base = [ # valid LVGL91
[ptr, "obj"],
[uint32_t, "part"],
[uint32_t, "id1"],
@@ -171,7 +171,7 @@ lv_draw_dsc_base = ct.structure(lv_draw_dsc_base, "lv_draw_dsc_base")
# int32_t shadow_spread;
# lv_opa_t shadow_opa;
# } lv_draw_rect_dsc_t;
-lv_draw_rect_dsc = [ # valid LVGL9
+lv_draw_rect_dsc = [ # valid LVGL91
[lv_draw_dsc_base, "base"],
[int32_t, "radius"],
@@ -227,7 +227,7 @@ lv_draw_rect_dsc = ct.structure(lv_draw_rect_dsc, "lv_draw_rect_dsc")
# uint8_t round_end : 1;
# uint8_t raw_end : 1; /*Do not bother with perpendicular line ending if it's not visible for any reason*/
# } lv_draw_line_dsc_t;
-lv_draw_line_dsc = [ # valid LVGL9
+lv_draw_line_dsc = [ # valid LVGL91
[lv_draw_dsc_base, "base"],
[lv_point_precise, "p1"],
@@ -257,7 +257,7 @@ lv_draw_line_dsc = ct.structure(lv_draw_line_dsc, "lv_draw_line_dsc")
# lv_opa_t opa;
# uint8_t rounded : 1;
# } lv_draw_arc_dsc_t;
-lv_draw_arc_dsc = [ # valid LVGL8.3
+lv_draw_arc_dsc = [ # valid LVGL91
[lv_draw_dsc_base, "base"],
[lv_color, "color"],
@@ -283,8 +283,7 @@ lv_draw_arc_dsc = ct.structure(lv_draw_arc_dsc, "lv_draw_arc_dsc")
# uint32_t stride: 16; /*Number of bytes in a row*/
# uint32_t reserved_2: 16; /*Reserved to be used later*/
# } lv_image_header_t;
-
-lv_image_header = [ # valid LVGL9
+lv_image_header = [ # valid LVGL91
[uint8_t, "magic"],
[uint8_t, "cf"],
[uint16_t, "flags"],
@@ -315,11 +314,16 @@ lv_image_header = ct.structure(lv_image_header, "lv_image_header")
# lv_opa_t opa;
# lv_blend_mode_t blend_mode : 4;
-# uint16_t antialias : 1;
-# uint16_t tile : 1;
+# uint16_t antialias : 1;
+# uint16_t tile : 1;
# lv_draw_image_sup_t * sup;
+
+# /** Might be used to indicate the original size of the image if only a small portion is rendered now.
+# * Used when a part of a layer is rendered to show the total layer size*/
+# lv_area_t original_area;
+# const lv_image_dsc_t * bitmap_mask_src;
# } lv_draw_image_dsc_t;
-lv_draw_image_dsc = [ # valid LVGL9
+lv_draw_image_dsc = [ # valid LVGL91
[lv_draw_dsc_base, "base"],
[ptr, "src"],
@@ -339,12 +343,14 @@ lv_draw_image_dsc = [ # valid LVGL9
[uint8_t_4, "blend_mode"],
[uint8_t_1, "antialias"],
[uint8_t_1, "tile"],
+ [lv_area, "original_area"],
[ptr, "sup"],
]
lv_draw_image_dsc = ct.structure(lv_draw_image_dsc, "lv_draw_image_dsc")
# typedef struct {
# lv_draw_dsc_base_t base;
+
# const char * text;
# const lv_font_t * font;
# uint32_t sel_start;
@@ -368,7 +374,7 @@ lv_draw_image_dsc = ct.structure(lv_draw_image_dsc, "lv_draw_image_dsc")
# uint8_t text_local : 1;
# lv_draw_label_hint_t * hint;
# } lv_draw_label_dsc_t;
-lv_draw_label_dsc = [ # valid LVGL9
+lv_draw_label_dsc = [ # valid LVGL91
[lv_draw_dsc_base, "base"],
[ptr, "text"],
[ptr, "font"],
@@ -392,273 +398,6 @@ lv_draw_label_dsc = [ # valid LVGL9
]
lv_draw_label_dsc = ct.structure(lv_draw_label_dsc, "lv_draw_label_dsc")
-# lv_obj_draw_part_dsc = [ # valid LVGL8.3
-# [ptr, "draw_ctx"],
-# [ptr, "class_p"],
-# [uint32_t, "type"],
-# [ptr, "draw_area"],
-# [ptr, "rect_dsc"],
-# [ptr, "label_dsc"],
-# [ptr, "line_dsc"],
-# [ptr, "img_dsc"],
-# [ptr, "arc_dsc"],
-# [ptr, "p1"],
-# [ptr, "p2"],
-# [ptr, "text"],
-# [uint32_t, "text_length"],
-# [uint32_t, "part"],
-# [uint32_t, "id"],
-# [lv_coord_t, "radius"],
-# [int32_t, "value"],
-# [ptr, "sub_part_ptr"],
-# ]
-# lv_obj_draw_part_dsc = ct.structure(lv_obj_draw_part_dsc, "lv_obj_draw_part_dsc")
-
-# lv_draw_layer_ctx = [ # valid LVGL8.3
-# [lv_area, "area_full"],
-# [lv_area, "area_act"],
-# [lv_coord_t, "max_row_with_alpha"],
-# [lv_coord_t, "max_row_with_no_alpha"],
-# [ptr, "buf"],
-# [ptr, "clip_area"],
-# [ptr, "buf_area"],
-# [ptr, "buf"],
-# [uint8_t, "screen_transp"],
-# ]
-# lv_draw_layer_ctx = ct.structure(lv_draw_layer_ctx, "lv_draw_layer_ctx")
-
-#- --------- lv_mask --------- -#
-# lv_draw_mask_xcb = ptr # callback
-# lv_draw_mask_type = ct.u8
-# lv_draw_mask_line_side = ct.u8
-
-# lv_draw_mask_common_dsc = [ # valid LVGL8.3
-# [lv_draw_mask_xcb, "cb"],
-# [lv_draw_mask_type, "type"],
-# ]
-# lv_draw_mask_common_dsc = ct.structure(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc")
-
-# lv_draw_mask_line_param_cfg = [ # valid LVGL8.3
-# #/*First point */
-# [lv_point, "p1"],
-
-# #/*Second point*/
-# [lv_point, "p2"],
-
-# #/*Which side to keep?*/
-# [uint8_t_2, "side"],
-# ]
-# lv_draw_mask_line_param_cfg = ct.structure(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg")
-
-# lv_draw_mask_line_param = [ # valid LVGL8.3
-# #/*The first element must be the common descriptor*/
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_line_param_cfg, "cfg"],
-# #/*A point of the line*/
-# [lv_point, "origo"],
-# #/* X / (1024*Y) steepness (X is 0..1023 range). What is the change of X in 1024 Y?*/
-# [int32_t, "xy_steep"],
-# #/* Y / (1024*X) steepness (Y is 0..1023 range). What is the change of Y in 1024 X?*/
-# [int32_t, "yx_steep"],
-# #/*Helper which stores yx_steep for flat lines and xy_steep for steep (non flat) lines */
-# [int32_t, "steep"],
-# #/*Steepness in 1 px in 0..255 range. Used only by flat lines. */
-# [int32_t, "spx"],
-# #/*1: It's a flat line? (Near to horizontal)*/
-# [uint8_t_1, "flat"],
-# #/* Invert the mask. The default is: Keep the left part.
-# # * It is used to select left/right/top/bottom*/
-# [uint8_t_1, "inv"],
-# ]
-# lv_draw_mask_line_param = ct.structure(lv_draw_mask_line_param, "lv_draw_mask_line_param")
-
-# lv_draw_mask_angle_param_cfg = [ # valid LVGL8.3
-# [lv_point, "vertex_p"],
-# [lv_coord_t, "start_angle"],
-# [lv_coord_t, "end_angle"],
-# ]
-# lv_draw_mask_angle_param_cfg = ct.structure(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg")
-
-# lv_draw_mask_angle_param = [ # valid LVGL8.3
-# #/*The first element must be the common descriptor*/
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_angle_param_cfg, "cfg"],
-
-# [lv_draw_mask_line_param, "start_line"],
-# [lv_draw_mask_line_param, "end_line"],
-# [uint16_t, "delta_deg"],
-# ]
-# lv_draw_mask_angle_param = ct.structure(lv_draw_mask_angle_param, "lv_draw_mask_angle_param")
-
-
-# lv_draw_mask_radius_param_cfg = [ # valid LVGL8.3
-# [lv_area, "rect"],
-# [lv_coord_t, "radius"],
-# [uint8_t_1, "outer"],
-# ]
-# lv_draw_mask_radius_param_cfg = ct.structure(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg")
-
-# lv_draw_mask_radius_circle_dsc = [ # valid LVGL8.3
-# [ptr, "buf"],
-# [ptr, "cir_opa"],
-# [ptr, "x_start_on_y"],
-# [ptr, "opa_start_on_y"],
-# [int32_t, "life"],
-# [uint32_t, "used_cnt"],
-# [lv_coord_t, "radius"],
-# ]
-# lv_draw_mask_radius_circle_dsc = ct.structure(lv_draw_mask_radius_circle_dsc, "lv_draw_mask_radius_circle_dsc")
-
-# lv_draw_mask_radius_param = [ # valid LVGL8.3
-# #/*The first element must be the common descriptor*/
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_radius_param_cfg, "cfg"],
-# [lv_draw_mask_radius_circle_dsc, "circle"],
-# ]
-# lv_draw_mask_radius_param = ct.structure(lv_draw_mask_radius_param, "lv_draw_mask_radius_param")
-
-
-# lv_draw_mask_fade_param_cfg = [ # valid LVGL8.3
-# [lv_area, "coords"],
-# [lv_coord_t, "y_top"],
-# [lv_coord_t, "y_bottom"],
-# [lv_opa, "opa_top"],
-# [lv_opa, "opa_bottom"],
-# ]
-# lv_draw_mask_fade_param_cfg = ct.structure(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg")
-
-# lv_draw_mask_fade_param = [ # valid LVGL8.3
-# # /*The first element must be the common descriptor*/
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_fade_param_cfg, "cfg"],
-# ]
-# lv_draw_mask_fade_param = ct.structure(lv_draw_mask_fade_param, "lv_draw_mask_fade_param")
-
-
-# lv_draw_mask_map_param_cfg = [ # valid LVGL8.3
-# [lv_area, "coords"],
-# [ptr, "map"],
-# ]
-# lv_draw_mask_map_param_cfg = ct.structure(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg")
-
-# lv_draw_mask_map_param = [ # valid LVGL8.3
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_map_param_cfg, "cfg"],
-# ]
-# lv_draw_mask_map_param = ct.structure(lv_draw_mask_map_param, "lv_draw_mask_map_param")
-
-
-# lv_draw_mask_polygon_param_cfg = [ # valid LVGL8.3
-# [ptr, "points"],
-# [uint16_t, "point_cnt"],
-# ]
-# lv_draw_mask_polygon_param_cfg = ct.structure(lv_draw_mask_polygon_param_cfg, "lv_draw_mask_polygon_param_cfg")
-
-# lv_draw_mask_polygon_param = [ # valid LVGL8.3
-# [lv_draw_mask_common_dsc, "dsc"],
-# [lv_draw_mask_polygon_param_cfg, "cfg"],
-# ]
-# lv_draw_mask_polygon_param = ct.structure(lv_draw_mask_polygon_param, "lv_draw_mask_polygon_param")
-
-
-# lv_draw_mask_saved = [ # valid LVGL8.3
-# [ptr, "param"],
-# [ptr, "custom_id"],
-# ]
-# lv_draw_mask_saved = ct.structure(lv_draw_mask_saved, "lv_draw_mask_saved")
-
-# lv_meter
-
-# lv_meter_scale_t
-lv_meter_scale = [ # valid LVGL8.3
- [lv_color, "tick_color"],
- [uint16_t, "tick_cnt"],
- [uint16_t, "tick_length"],
- [uint16_t, "tick_width"],
-
- [lv_color, "tick_major_color"],
- [uint16_t, "tick_major_nth"],
- [uint16_t, "tick_major_length"],
- [uint16_t, "tick_major_width"],
-
- [int16_t, "label_gap"],
-
- [int32_t, "min"],
- [int32_t, "max"],
- [int16_t, "r_mod"],
- [uint16_t, "angle_range"],
- [int16_t, "rotation"],
-]
-lv_meter_scale = ct.structure(lv_meter_scale, "lv_meter_scale")
-
-# lv_meter_indicator_t
-lv_meter_indicator = [ # valid LVGL8.3
- [ptr, "scale"],
- [lv_meter_indicator_type_t, "type"],
- [lv_opa, "opa"],
- [int32_t, "start_value"],
- [int32_t, "end_value"],
- # more unions here that we can hardly manage simply
- [ptr, "data0"],
- [ptr, "data1"],
- [ptr, "data2"],
-]
-lv_meter_indicator = ct.structure(lv_meter_indicator, "lv_meter_indicator")
-
-# # variants
-# lv_meter_indicator_needle_img = [ # valid LVGL8.2
-# [ptr, "scale"],
-# [lv_meter_indicator_type_t, "type"],
-# [lv_opa, "opa"],
-# [int32_t, "start_value"],
-# [int32_t, "end_value"],
-# # specifc portion
-# [ptr, "src"],
-# [lv_point, "pivot"],
-# ]
-# lv_meter_indicator_needle_img = ct.structure(lv_meter_indicator_needle_img, "lv_meter_indicator_needle_img")
-
-# lv_meter_indicator_needle_line = [ # valid LVGL8.2
-# [ptr, "scale"],
-# [lv_meter_indicator_type_t, "type"],
-# [lv_opa, "opa"],
-# [int32_t, "start_value"],
-# [int32_t, "end_value"],
-# # specifc portion
-# [uint16_t, "width"],
-# [int16_t, "r_mod"],
-# [lv_color, "color"],
-# ]
-# lv_meter_indicator_needle_line = ct.structure(lv_meter_indicator_needle_line, "lv_meter_indicator_needle_line")
-
-# lv_meter_indicator_arc = [ # valid LVGL8.2
-# [ptr, "scale"],
-# [lv_meter_indicator_type_t, "type"],
-# [lv_opa, "opa"],
-# [int32_t, "start_value"],
-# [int32_t, "end_value"],
-# # specifc portion
-# [uint16_t, "width"],
-# [ptr, "src"],
-# [lv_color, "color"],
-# [int16_t, "r_mod"],
-# ]
-# lv_meter_indicator_arc = ct.structure(lv_meter_indicator_arc, "lv_meter_indicator_arc")
-
-# lv_meter_indicator_scale_lines = [ # valid LVGL8.2
-# [ptr, "scale"],
-# [lv_meter_indicator_type_t, "type"],
-# [lv_opa, "opa"],
-# [int32_t, "start_value"],
-# [int32_t, "end_value"],
-# # specifc portion
-# [int16_t, "width_mod"],
-# [lv_color, "color_start"],
-# [lv_color, "color_end"],
-# [uint8_t_1, "local_grad"],
-# ]
-# lv_meter_indicator_scale_lines = ct.structure(lv_meter_indicator_scale_lines, "lv_meter_indicator_scale_lines")
-
# typedef struct {
# int32_t * x_points;
# int32_t * y_points;
@@ -670,7 +409,7 @@ lv_meter_indicator = ct.structure(lv_meter_indicator, "lv_meter_indicator")
# uint32_t x_axis_sec : 1;
# uint32_t y_axis_sec : 1;
# } lv_chart_series_t;
-lv_chart_series = [ # valid LVGL9
+lv_chart_series = [ # valid LVGL91
[ptr, "x_points"],
[ptr, "y_points"],
[lv_color, "color"],
@@ -691,7 +430,7 @@ lv_chart_series = ct.structure(lv_chart_series, "lv_chart_series")
# lv_dir_t dir;
# uint32_t pos_set: 1; /*1: pos is set; 0: point_id is set*/
# } lv_chart_cursor_t;
-lv_chart_cursor = [ # valid LVGL9
+lv_chart_cursor = [ # valid LVGL91
[lv_point, "pos"],
[int32_t, "point_id"],
[lv_color, "color"],
@@ -701,17 +440,6 @@ lv_chart_cursor = [ # valid LVGL9
]
lv_chart_cursor = ct.structure(lv_chart_cursor, "lv_chart_cursor")
-# lv_chart_tick_dsc = [ # valid LVGL8.3
-# [lv_coord_t, "major_len"],
-# [lv_coord_t, "minor_len"],
-# [lv_coord_t, "draw_size"],
-# [uint16_t_15, "minor_cnt"],
-# [uint16_t_15, "major_cnt"],
-# [uint8_t_1, "label_en"],
-# ]
-# lv_chart_tick_dsc = ct.structure(lv_chart_tick_dsc, "lv_chart_tick_dsc")
-
-
#- --------- class system --------- -#
lv_obj_class_ptr = ptr
lv_obj_ptr = ptr
@@ -746,7 +474,7 @@ lv_event_code = ct.i32
# uint32_t instance_size : 16;
# uint32_t theme_inheritable : 1; /**< Value from ::lv_obj_class_theme_inheritable_t*/
# };
-lv_obj_class = [ # valid LVGL9
+lv_obj_class = [ # valid LVGL91
[lv_obj_class_ptr, "base_class"],
[constructor_cb, "constructor_cb"],
[destructor_cb, "destructor_cb"],
@@ -773,7 +501,7 @@ lv_obj_class = ct.structure(lv_obj_class, "lv_obj_class")
# uint8_t stop_processing : 1;
# uint8_t stop_bubbling : 1;
# };
-lv_event = [ # valid LVGL9
+lv_event = [ # valid LVGL91
[lv_obj_ptr, "target"],
[lv_obj_ptr, "current_target"],
[lv_event_code, "code"],
@@ -790,19 +518,22 @@ lv_event = ct.structure(lv_event, "lv_event")
# lv_image structures
# typedef struct {
-# lv_image_header_t header; /**< A header describing the basics of the image*/
-# uint32_t data_size; /**< Size of the image in bytes*/
-# const uint8_t * data; /**< Pointer to the data of the image*/
+# lv_image_header_t header; /**< A header describing the basics of the image*/
+# uint32_t data_size; /**< Size of the image in bytes*/
+# const uint8_t * data; /**< Pointer to the data of the image*/
+# const void * reserved; /**< A reserved field to make it has same size as lv_draw_buf_t*/
# } lv_image_dsc_t;
-lv_image_dsc = [ # valid LVGL9
+lv_image_dsc = [ # valid LVGL91
[lv_image_header, "header"],
[uint32_t, "data_size"],
[ptr, "data"],
+ [ptr, "reserved"],
]
lv_image_dsc = ct.structure(lv_image_dsc, "lv_image_dsc")
#######################################################################
# lv_style
+
# typedef struct {
# const lv_style_prop_t * props; /**< An array with the properties to animate.*/
# void * user_data; /**< A custom user data that will be passed to the animation's user_data */
@@ -810,7 +541,7 @@ lv_image_dsc = ct.structure(lv_image_dsc, "lv_image_dsc")
# uint32_t time; /**< Duration of the transition in [ms]*/
# uint32_t delay; /**< Delay before the transition in [ms]*/
# } lv_style_transition_dsc_t;
-lv_style_transition_dsc = [ # valid LVGL9
+lv_style_transition_dsc = [ # valid LVGL91
[ptr, "props"],
[ptr, "user_data"],
[ptr, "path_xcb"],
@@ -821,18 +552,12 @@ lv_style_transition_dsc = ct.structure(lv_style_transition_dsc, "lv_style_transi
#######################################################################
# lv_color
-# lv_color_hsv = [ # valid LVGL8
-# [uint16_t, "h"],
-# [uint8_t, "s"],
-# [uint8_t, "v"],
-# ]
-# lv_color_hsv = ct.structure(lv_color_hsv, "lv_color_hsv")
# typedef struct _lv_color_filter_dsc_t {
# lv_color_filter_cb_t filter_cb;
# void * user_data;
# } lv_color_filter_dsc_t;
-lv_color_filter_dsc = [ # valid LVGL9
+lv_color_filter_dsc = [ # valid LVGL91
[ptr, "filter_cb"],
[ptr, "user_data"],
]
@@ -850,7 +575,7 @@ lv_color_filter_dsc = ct.structure(lv_color_filter_dsc, "lv_color_filter_dsc")
# uint32_t paused : 1;
# uint32_t auto_delete : 1;
# };
-lv_timer_ntv = [ # valid LVGL9
+lv_timer_ntv = [ # valid LVGL91
[uint32_t, "period"],
[uint32_t, "last_run"],
[ptr, "timer_cb"],
@@ -861,115 +586,25 @@ lv_timer_ntv = [ # valid LVGL9
]
lv_timer_ntv = ct.structure(lv_timer_ntv, "lv_timer_ntv")
-# #######################################################################
-# lv_anim native structure, is superseded by lv_anim
-
-# /** Describes an animation*/
-# struct _lv_anim_t {
-# void * var; /**
- English | 中文 | Português do Brasil | 日本語
+ English | 中文 | Português do Brasil | 日本語
@@ -24,8 +24,7 @@
Docs |
Forum |
Demos |
-Services |
-SquareLine Studio
+Services
@@ -37,9 +36,6 @@ LVGL is the most popular free and open source embedded graphics library to creat
**Feature Rich**
It has all the features to create modern and beautiful GUIs: 30+ built-in widgets, a powerful style system, web inspired layout managers, and a typography system supporting many languages. To integrate LVGL into your platform, all you need is at least 32kB RAM and 128 kB Flash, a C compiler, a frame buffer, and at least an 1/10 screen sized buffer for rendering.
-**UI Editor**
-SquareLine Studio is a professional yet affordable drag and drop UI editor for LVGL. It runs on Windows, Linux and MacOS too and you can try it out even without registering to the website.
-
**Services**
Our team is ready to help you with graphics design, UI implementation and consulting services. Contact us if you need some support during the development of your next GUI project.
@@ -73,7 +69,6 @@ Our team is ready to help you with graphics design, UI implementation and consul
**Docs, Tools, and Services**
- Detailed [Documentation](https://docs.lvgl.io/) with [100+ simple examples](https://docs.lvgl.io/master/index.html)
- - [SquareLine Studio](https://squareline.io/) - A professional and easy-to-use UI editor software to speed up and simplify the UI development.
- [Services](https://lvgl.io/services) such as User interface design, Implementation and Consulting to make UI development simpler and faster.
## :heart: Sponsor
@@ -444,11 +439,6 @@ This list will guide you to get started with LVGL step-by-step.
9. If you have questions go to the [Forum](http://forum.lvgl.io/)
10. Read the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) guide to see how you can help to improve LVGL (15 minutes)
-**Go for More**
-
- 11. Download and try out [SquareLine Studio](https://squareline.io/).
- 12. Contact us for [Services](https://lvgl.io/services).
-
## :handshake: Services
LVGL LLC was established to provide a solid background for LVGL library and to offer several type of services to help you in UI development. With 15+ years of experience in the user interface and graphics industry we can help you the bring your UI to the next level.
@@ -469,7 +459,7 @@ LVGL is an open project and contribution is very welcome. There are many ways to
For a detailed description of contribution opportunities visit the [Contributing](https://docs.lvgl.io/master/CONTRIBUTING.html) section of the documentation.
-More than 300 people already left their fingerprint in LVGL. Be one them! See your here! :slightly_smiling_face:
+More than 300 people already left their fingerprint in LVGL. Be one them! See you here! :slightly_smiling_face:
diff --git a/lib/libesp32_lvgl/lvgl/library.json b/lib/libesp32_lvgl/lvgl/library.json
index beb14edd3..5e9d5f8b3 100644
--- a/lib/libesp32_lvgl/lvgl/library.json
+++ b/lib/libesp32_lvgl/lvgl/library.json
@@ -1,6 +1,6 @@
{
"name": "lvgl",
- "version": "9.0.0",
+ "version": "9.1.0",
"keywords": "graphics, gui, embedded, tft, lvgl",
"description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.",
"repository": {
diff --git a/lib/libesp32_lvgl/lvgl/library.properties b/lib/libesp32_lvgl/lvgl/library.properties
index 11cacf03d..d80cdf791 100644
--- a/lib/libesp32_lvgl/lvgl/library.properties
+++ b/lib/libesp32_lvgl/lvgl/library.properties
@@ -1,5 +1,5 @@
name=lvgl
-version=9.0.0
+version=9.1.0
author=kisvegabor
maintainer=kisvegabor,embeddedt,pete-pjb
sentence=Full-featured Graphics Library for Embedded Systems
diff --git a/lib/libesp32_lvgl/lvgl/lv_conf_template.h b/lib/libesp32_lvgl/lvgl/lv_conf_template.h
index 742d95cb0..64dcc9eaf 100644
--- a/lib/libesp32_lvgl/lvgl/lv_conf_template.h
+++ b/lib/libesp32_lvgl/lvgl/lv_conf_template.h
@@ -1,6 +1,6 @@
/**
* @file lv_conf.h
- * Configuration file for v9.0.0
+ * Configuration file for v9.1.0
*/
/*
@@ -17,6 +17,11 @@
#ifndef LV_CONF_H
#define LV_CONF_H
+/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */
+#if 0 && defined(__ASSEMBLY__)
+#include "my_include.h"
+#endif
+
/*====================
COLOR SETTINGS
*====================*/
@@ -54,7 +59,7 @@
#undef LV_MEM_POOL_INCLUDE
#undef LV_MEM_POOL_ALLOC
#endif
-#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/
+#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/
/*====================
HAL SETTINGS
@@ -94,6 +99,14 @@
/*Align the start address of draw_buf addresses to this bytes*/
#define LV_DRAW_BUF_ALIGN 4
+/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
+ * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
+ * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
+ * and can't be drawn in chunks. */
+
+/*The target buffer size for simple layer chunks.*/
+#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
+
#define LV_USE_DRAW_SW 1
#if LV_USE_DRAW_SW == 1
/* Set the number of draw unit.
@@ -104,14 +117,9 @@
/* Use Arm-2D to accelerate the sw render */
#define LV_USE_DRAW_ARM2D_SYNC 0
- /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
- * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
- * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
- * and can't be drawn in chunks. */
-
- /*The target buffer size for simple layer chunks.*/
- #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
-
+ /* Enable native helium assembly to be compiled */
+ #define LV_USE_NATIVE_HELIUM_ASM 0
+
/* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only
* 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */
#define LV_DRAW_SW_COMPLEX 1
@@ -176,6 +184,19 @@
/* Enable VG-Lite assert. */
#define LV_VG_LITE_USE_ASSERT 0
+/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */
+#define LV_VG_LITE_FLUSH_MAX_COUNT 8
+
+/* Enable border to simulate shadow
+ * NOTE: which usually improves performance,
+ * but does not guarantee the same rendering quality as the software. */
+#define LV_VG_LITE_USE_BOX_SHADOW 0
+
+/* VG-Lite gradient image maximum cache number.
+ * NOTE: The memory usage of a single gradient image is 4K bytes.
+ */
+#define LV_VG_LITE_GRAD_CACHE_SIZE 32
+
#endif
/*=======================
@@ -310,6 +331,9 @@
/*Enable 16 pixels alignment*/
#define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1
+ /*Buffer address alignment*/
+ #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64
+
/*Enable multi-thread render*/
#define LV_VG_LITE_THORVG_THREAD_RENDER 0
@@ -627,6 +651,12 @@
#define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif
+/*API for LittleFs. */
+#define LV_USE_FS_LITTLEFS 0
+#if LV_USE_FS_LITTLEFS
+ #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+#endif
+
/*LODEPNG decoder library*/
#define LV_USE_LODEPNG 0
@@ -667,16 +697,11 @@
/*FreeType library*/
#define LV_USE_FREETYPE 0
#if LV_USE_FREETYPE
- /*Memory used by FreeType to cache characters in kilobytes*/
- #define LV_FREETYPE_CACHE_SIZE 768
-
/*Let FreeType to use LVGL memory and file porting*/
#define LV_FREETYPE_USE_LVGL_PORT 0
- /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
- /* (0:use system defaults) */
- #define LV_FREETYPE_CACHE_FT_FACES 8
- #define LV_FREETYPE_CACHE_FT_SIZES 8
+ /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached.
+ *The higher the value, the more memory will be used.*/
#define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256
#endif
@@ -699,9 +724,6 @@
/* Enable ThorVG by assuming that its installed and linked to the project */
#define LV_USE_THORVG_EXTERNAL 0
-/*Enable LZ4 compress/decompress lib*/
-#define LV_USE_LZ4 0
-
/*Use lvgl built-in LZ4 lib*/
#define LV_USE_LZ4_INTERNAL 0
@@ -740,7 +762,7 @@
#endif
/*1: Show the used memory and the memory fragmentation
- * Requires `LV_USE_BUILTIN_MALLOC = 1`
+ * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN`
* Requires `LV_USE_SYSMON = 1`*/
#define LV_USE_MEM_MONITOR 0
#if LV_USE_MEM_MONITOR
@@ -826,11 +848,12 @@
/*Use SDL to open window on PC and handle mouse and keyboard*/
#define LV_USE_SDL 0
#if LV_USE_SDL
- #define LV_SDL_INCLUDE_PATH
- #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
- #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
- #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
- #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #define LV_SDL_INCLUDE_PATH
+ #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
+ #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
+ #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
+ #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/
#endif
/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/
@@ -883,6 +906,20 @@
/*Driver for evdev input devices*/
#define LV_USE_EVDEV 0
+/*Driver for libinput input devices*/
+#define LV_USE_LIBINPUT 0
+
+#if LV_USE_LIBINPUT
+ #define LV_LIBINPUT_BSD 0
+
+ /*Full keyboard support*/
+ #define LV_LIBINPUT_XKB 0
+ #if LV_LIBINPUT_XKB
+ /*"setxkbmap -query" can help find the right values for your keyboard*/
+ #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL }
+ #endif
+#endif
+
/*Drivers for LCD devices connected via SPI/parallel port*/
#define LV_USE_ST7735 0
#define LV_USE_ST7789 0
@@ -907,9 +944,6 @@
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
#define LV_USE_DEMO_WIDGETS 0
-#if LV_USE_DEMO_WIDGETS
- #define LV_DEMO_WIDGETS_SLIDESHOW 0
-#endif
/*Demonstrate the usage of encoder and keyboard*/
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
diff --git a/lib/libesp32_lvgl/lvgl/lvgl.h b/lib/libesp32_lvgl/lvgl/lvgl.h
index 76314d729..ba10357da 100644
--- a/lib/libesp32_lvgl/lvgl/lvgl.h
+++ b/lib/libesp32_lvgl/lvgl/lvgl.h
@@ -14,7 +14,7 @@ extern "C" {
* CURRENT VERSION OF LVGL
***************************/
#define LVGL_VERSION_MAJOR 9
-#define LVGL_VERSION_MINOR 0
+#define LVGL_VERSION_MINOR 1
#define LVGL_VERSION_PATCH 0
#define LVGL_VERSION_INFO ""
@@ -109,13 +109,15 @@ extern "C" {
#include "src/layouts/lv_layout.h"
#include "src/draw/lv_draw.h"
+#include "src/draw/lv_draw_buf.h"
#include "src/draw/lv_draw_vector.h"
#include "src/themes/lv_theme.h"
#include "src/drivers/lv_drivers.h"
-#include "src/lv_api_map.h"
+#include "src/lv_api_map_v8.h"
+#include "src/lv_api_map_v9_0.h"
#include "src/core/lv_global.h"
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_global.h b/lib/libesp32_lvgl/lvgl/src/core/lv_global.h
index ed006224c..3fa568f28 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_global.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_global.h
@@ -27,7 +27,6 @@ extern "C" {
#include "../misc/lv_color_op.h"
#include "../misc/lv_ll.h"
#include "../misc/lv_log.h"
-#include "../misc/lv_profiler_builtin.h"
#include "../misc/lv_style.h"
#include "../misc/lv_timer.h"
#include "../others/sysmon/lv_sysmon.h"
@@ -57,6 +56,14 @@ struct _snippet_stack;
struct _lv_freetype_context_t;
#endif
+#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
+struct _lv_profiler_builtin_ctx_t;
+#endif
+
+#if LV_USE_NUTTX
+struct _lv_nuttx_ctx_t;
+#endif
+
typedef struct _lv_global_t {
bool inited;
bool deinit_in_progress; /**< Can be used e.g. in the LV_EVENT_DELETE to deinit the drivers too */
@@ -84,7 +91,6 @@ typedef struct _lv_global_t {
uint32_t memory_zero;
uint32_t math_rand_seed;
- lv_area_transform_cache_t area_trans_cache;
lv_event_t * event_header;
uint32_t event_last_register_id;
@@ -153,6 +159,10 @@ typedef struct _lv_global_t {
lv_fs_drv_t win32_fs_drv;
#endif
+#if LV_USE_FS_LITTLEFS
+ lv_fs_drv_t littlefs_fs_drv;
+#endif
+
#if LV_USE_FREETYPE
struct _lv_freetype_context_t * ft_context;
#endif
@@ -170,7 +180,7 @@ typedef struct _lv_global_t {
#endif
#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
- lv_profiler_builtin_ctx_t profiler_context;
+ struct _lv_profiler_builtin_ctx_t * profiler_context;
#endif
#if LV_USE_FILE_EXPLORER != 0
@@ -193,6 +203,11 @@ typedef struct _lv_global_t {
void * objid_array;
uint32_t objid_count;
#endif
+
+#if LV_USE_NUTTX
+ struct _lv_nuttx_ctx_t * nuttx_ctx;
+#endif
+
void * user_data;
} lv_global_t;
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_group.c b/lib/libesp32_lvgl/lvgl/src/core/lv_group.c
index f7a7cbb14..44b41d8b2 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_group.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_group.c
@@ -75,6 +75,7 @@ lv_group_t * lv_group_create(void)
void lv_group_delete(lv_group_t * group)
{
/*Defocus the currently focused object*/
+ LV_ASSERT_NULL(group);
if(group->obj_focus != NULL) {
lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group));
lv_obj_invalidate(*group->obj_focus);
@@ -172,8 +173,9 @@ void lv_group_swap_obj(lv_obj_t * obj1, lv_obj_t * obj2)
else if((*obj_i) == obj2)(*obj_i) = obj1;
}
- if(*g1->obj_focus == obj1) lv_group_focus_obj(obj2);
- else if(*g1->obj_focus == obj2) lv_group_focus_obj(obj1);
+ lv_obj_t * focused = lv_group_get_focused(g1);
+ if(focused == obj1) lv_group_focus_obj(obj2);
+ else if(focused == obj2) lv_group_focus_obj(obj1);
}
@@ -220,6 +222,8 @@ void lv_group_remove_obj(lv_obj_t * obj)
void lv_group_remove_all_objs(lv_group_t * group)
{
+ LV_ASSERT_NULL(group);
+
/*Defocus the currently focused object*/
if(group->obj_focus != NULL) {
lv_obj_send_event(*group->obj_focus, LV_EVENT_DEFOCUSED, get_indev(group));
@@ -271,6 +275,8 @@ void lv_group_focus_obj(lv_obj_t * obj)
void lv_group_focus_next(lv_group_t * group)
{
+ LV_ASSERT_NULL(group);
+
bool focus_changed = focus_next_core(group, _lv_ll_get_head, _lv_ll_get_next);
if(group->edge_cb) {
if(!focus_changed)
@@ -280,6 +286,8 @@ void lv_group_focus_next(lv_group_t * group)
void lv_group_focus_prev(lv_group_t * group)
{
+ LV_ASSERT_NULL(group);
+
bool focus_changed = focus_next_core(group, _lv_ll_get_tail, _lv_ll_get_prev);
if(group->edge_cb) {
if(!focus_changed)
@@ -289,12 +297,16 @@ void lv_group_focus_prev(lv_group_t * group)
void lv_group_focus_freeze(lv_group_t * group, bool en)
{
+ LV_ASSERT_NULL(group);
+
if(en == false) group->frozen = 0;
else group->frozen = 1;
}
lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c)
{
+ LV_ASSERT_NULL(group);
+
lv_obj_t * act = lv_group_get_focused(group);
if(act == NULL) return LV_RESULT_OK;
@@ -305,17 +317,21 @@ lv_result_t lv_group_send_data(lv_group_t * group, uint32_t c)
void lv_group_set_focus_cb(lv_group_t * group, lv_group_focus_cb_t focus_cb)
{
+ if(group == NULL) return;
+
group->focus_cb = focus_cb;
}
void lv_group_set_edge_cb(lv_group_t * group, lv_group_edge_cb_t edge_cb)
{
+ LV_ASSERT_NULL(group);
+
group->edge_cb = edge_cb;
}
void lv_group_set_editing(lv_group_t * group, bool edit)
{
- if(group == NULL) return;
+ LV_ASSERT_NULL(group);
uint8_t en_val = edit ? 1 : 0;
if(en_val == group->editing) return; /*Do not set the same mode again*/
@@ -333,11 +349,13 @@ void lv_group_set_editing(lv_group_t * group, bool edit)
void lv_group_set_refocus_policy(lv_group_t * group, lv_group_refocus_policy_t policy)
{
+ LV_ASSERT_NULL(group);
group->refocus_policy = policy & 0x01;
}
void lv_group_set_wrap(lv_group_t * group, bool en)
{
+ LV_ASSERT_NULL(group);
group->wrap = en ? 1 : 0;
}
@@ -375,6 +393,7 @@ bool lv_group_get_wrap(lv_group_t * group)
uint32_t lv_group_get_obj_count(lv_group_t * group)
{
+ LV_ASSERT_NULL(group);
return _lv_ll_get_len(&group->obj_ll);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c
index 29708ea1f..f05b53854 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c
@@ -25,7 +25,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
#define LV_OBJ_DEF_WIDTH (LV_DPX(100))
#define LV_OBJ_DEF_HEIGHT (LV_DPX(50))
#define STYLE_TRANSITION_MAX 32
@@ -424,19 +424,18 @@ static void lv_obj_draw(lv_event_t * e)
info->res = LV_COVER_RES_NOT_COVER;
return;
}
- const lv_grad_dsc_t * grad_dsc = lv_obj_get_style_bg_grad(obj, 0);
- if(grad_dsc) {
- uint32_t i;
- for(i = 0; i < grad_dsc->stops_count; i++) {
- if(grad_dsc->stops[i].opa < LV_OPA_MAX) {
- info->res = LV_COVER_RES_NOT_COVER;
- return;
- }
+ }
+ const lv_grad_dsc_t * grad_dsc = lv_obj_get_style_bg_grad(obj, 0);
+ if(grad_dsc) {
+ uint32_t i;
+ for(i = 0; i < grad_dsc->stops_count; i++) {
+ if(grad_dsc->stops[i].opa < LV_OPA_MAX) {
+ info->res = LV_COVER_RES_NOT_COVER;
+ return;
}
}
}
info->res = LV_COVER_RES_COVER;
-
}
else if(code == LV_EVENT_DRAW_MAIN) {
lv_layer_t * layer = lv_event_get_layer(e);
@@ -741,7 +740,7 @@ static void update_obj_state(lv_obj_t * obj, lv_state_t new_state)
lv_obj_invalidate(obj);
obj->state = new_state;
-
+ _lv_obj_update_layer_type(obj);
_lv_obj_style_transition_dsc_t * ts = lv_malloc_zeroed(sizeof(_lv_obj_style_transition_dsc_t) * STYLE_TRANSITION_MAX);
uint32_t tsi = 0;
uint32_t i;
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_class.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_class.c
index fd483ee05..1d7b932f5 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_class.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_class.c
@@ -15,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_draw.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_draw.c
index 2f4632515..7587e7164 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_draw.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_draw.c
@@ -15,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
/**********************
* TYPEDEFS
@@ -292,8 +292,6 @@ void lv_obj_refresh_ext_draw_size(lv_obj_t * obj)
int32_t s_new = 0;
lv_obj_send_event(obj, LV_EVENT_REFR_EXT_DRAW_SIZE, &s_new);
- if(s_new != s_old) lv_obj_invalidate(obj);
-
/*Store the result if the special attrs already allocated*/
if(obj->spec_attr) {
obj->spec_attr->ext_draw_size = s_new;
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.c
index bafcdcf3c..0553f3d77 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.c
@@ -13,7 +13,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
/**********************
* TYPEDEFS
@@ -92,13 +92,12 @@ lv_result_t lv_obj_event_base(const lv_obj_class_t * class_p, lv_event_t * e)
return res;
}
-void lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter,
- void * user_data)
+lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_obj_allocate_spec_attr(obj);
- lv_event_add(&obj->spec_attr->event_list, event_cb, filter, user_data);
+ return lv_event_add(&obj->spec_attr->event_list, event_cb, filter, user_data);
}
uint32_t lv_obj_get_event_count(lv_obj_t * obj)
@@ -139,6 +138,14 @@ bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb)
return false;
}
+bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc)
+{
+ LV_ASSERT_NULL(obj);
+ LV_ASSERT_NULL(dsc);
+ if(obj->spec_attr == NULL) return false;
+ return lv_event_remove_dsc(&obj->spec_attr->event_list, dsc);
+}
+
uint32_t lv_obj_remove_event_cb_with_user_data(lv_obj_t * obj, lv_event_cb_t event_cb, void * user_data)
{
LV_ASSERT_NULL(obj);
@@ -235,6 +242,19 @@ uint32_t lv_event_get_key(lv_event_t * e)
}
}
+int32_t lv_event_get_rotary_diff(lv_event_t * e)
+{
+ if(e->code == LV_EVENT_ROTARY) {
+ int32_t * r = lv_event_get_param(e);
+ if(r) return *r;
+ else return 0;
+ }
+ else {
+ LV_LOG_WARN("Not interpreted with this event code");
+ return 0;
+ }
+}
+
lv_anim_t * lv_event_get_scroll_anim(lv_event_t * e)
{
if(e->code == LV_EVENT_SCROLL_BEGIN) {
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.h b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.h
index 580692e61..40a002d8a 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_event.h
@@ -99,9 +99,9 @@ lv_obj_t * lv_event_get_target_obj(lv_event_t * e);
* @param filter an event code (e.g. `LV_EVENT_CLICKED`) on which the event should be called. `LV_EVENT_ALL` can be used to receive all the events.
* @param event_cb the new event function
* @param user_data custom data data will be available in `event_cb`
+ * @return handler to the event. It can be used in `lv_obj_remove_event_dsc`.
*/
-void lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter,
- void * user_data);
+lv_event_dsc_t * lv_obj_add_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data);
uint32_t lv_obj_get_event_count(lv_obj_t * obj);
@@ -111,6 +111,8 @@ bool lv_obj_remove_event(lv_obj_t * obj, uint32_t index);
bool lv_obj_remove_event_cb(lv_obj_t * obj, lv_event_cb_t event_cb);
+bool lv_obj_remove_event_dsc(lv_obj_t * obj, lv_event_dsc_t * dsc);
+
/**
* Remove an event_cb with user_data
* @param obj pointer to a obj
@@ -149,6 +151,13 @@ const lv_area_t * lv_event_get_old_size(lv_event_t * e);
*/
uint32_t lv_event_get_key(lv_event_t * e);
+/**
+ * Get the signed rotary encoder diff. passed as parameter to an event. Can be used in `LV_EVENT_ROTARY`
+ * @param e pointer to an event
+ * @return the triggering key or NULL if called on an unrelated event
+ */
+int32_t lv_event_get_rotary_diff(lv_event_t * e);
+
/**
* Get the animation descriptor of a scrolling. Can be used in `LV_EVENT_SCROLL_BEGIN`
* @param e pointer to an event
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.c
index d79af8b44..0e8ecaa52 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.c
@@ -15,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
#define update_layout_mutex LV_GLOBAL_DEFAULT()->layout_update_mutex
/**********************
@@ -28,7 +28,7 @@
static int32_t calc_content_width(lv_obj_t * obj);
static int32_t calc_content_height(lv_obj_t * obj);
static void layout_update_core(lv_obj_t * obj);
-static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv);
+static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv);
/**********************
* STATIC VARIABLES
@@ -762,36 +762,40 @@ void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, boo
}
}
-void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv)
+void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags)
+{
+ lv_obj_transform_point_array(obj, p, 1, flags);
+}
+
+void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count,
+ lv_obj_point_transform_flag_t flags)
{
if(obj) {
lv_layer_type_t layer_type = _lv_obj_get_layer_type(obj);
bool do_tranf = layer_type == LV_LAYER_TYPE_TRANSFORM;
- if(inv) {
- if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv);
- if(do_tranf) transform_point(obj, p, inv);
+ bool recursive = flags & LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE;
+ bool inverse = flags & LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE;
+ if(inverse) {
+ if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags);
+ if(do_tranf) transform_point_array(obj, points, count, inverse);
}
else {
- if(do_tranf) transform_point(obj, p, inv);
- if(recursive) lv_obj_transform_point(lv_obj_get_parent(obj), p, recursive, inv);
+ if(do_tranf) transform_point_array(obj, points, count, inverse);
+ if(recursive) lv_obj_transform_point_array(lv_obj_get_parent(obj), points, count, flags);
}
}
}
-void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool recursive,
- bool inv)
+void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags)
{
lv_point_t p[4] = {
{area->x1, area->y1},
- {area->x1, area->y2},
- {area->x2, area->y1},
- {area->x2, area->y2},
+ {area->x1, area->y2 + 1},
+ {area->x2 + 1, area->y1},
+ {area->x2 + 1, area->y2 + 1},
};
- lv_obj_transform_point(obj, &p[0], recursive, inv);
- lv_obj_transform_point(obj, &p[1], recursive, inv);
- lv_obj_transform_point(obj, &p[2], recursive, inv);
- lv_obj_transform_point(obj, &p[3], recursive, inv);
+ lv_obj_transform_point_array(obj, p, 4, flags);
area->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x);
area->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x);
@@ -808,7 +812,13 @@ void lv_obj_invalidate_area(const lv_obj_t * obj, const lv_area_t * area)
lv_area_t area_tmp;
lv_area_copy(&area_tmp, area);
+
if(!lv_obj_area_is_visible(obj, &area_tmp)) return;
+ if(obj->spec_attr && obj->spec_attr->layer_type == LV_LAYER_TYPE_TRANSFORM) {
+ /*Make the area slightly larger to avoid rounding errors.
+ *5 is an empirical value*/
+ lv_area_increase(&area_tmp, 5, 5);
+ }
_lv_inv_area(lv_obj_get_display(obj), &area_tmp);
}
@@ -853,7 +863,7 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
/*The area is not on the object*/
if(!_lv_area_intersect(area, area, &obj_coords)) return false;
- lv_obj_get_transformed_area(obj, area, true, false);
+ lv_obj_get_transformed_area(obj, area, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE);
/*Truncate recursively to the parents*/
lv_obj_t * parent = lv_obj_get_parent(obj);
@@ -868,7 +878,7 @@ bool lv_obj_area_is_visible(const lv_obj_t * obj, lv_area_t * area)
lv_area_increase(&parent_coords, parent_ext_size, parent_ext_size);
}
- lv_obj_get_transformed_area(parent, &parent_coords, true, false);
+ lv_obj_get_transformed_area(parent, &parent_coords, LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE);
if(!_lv_area_intersect(area, area, &parent_coords)) return false;
parent = lv_obj_get_parent(parent);
@@ -1118,11 +1128,13 @@ static void layout_update_core(lv_obj_t * obj)
}
}
-static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv)
+static void transform_point_array(const lv_obj_t * obj, lv_point_t * p, size_t p_count, bool inv)
{
int32_t angle = lv_obj_get_style_transform_rotation(obj, 0);
int32_t scale_x = lv_obj_get_style_transform_scale_x_safe(obj, 0);
int32_t scale_y = lv_obj_get_style_transform_scale_y_safe(obj, 0);
+ if(scale_x == 0) scale_x = 1;
+ if(scale_y == 0) scale_y = 1;
if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) return;
@@ -1143,9 +1155,9 @@ static void transform_point(const lv_obj_t * obj, lv_point_t * p, bool inv)
if(inv) {
angle = -angle;
- scale_x = (256 * 256) / scale_x;
- scale_y = (256 * 256) / scale_y;
+ scale_x = (256 * 256 + scale_x - 1) / scale_x;
+ scale_y = (256 * 256 + scale_y - 1) / scale_y;
}
- lv_point_transform(p, angle, scale_x, scale_y, &pivot, !inv);
+ lv_point_array_transform(p, p_count, angle, scale_x, scale_y, &pivot, !inv);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.h b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.h
index 823355e43..eafc6f149 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_pos.h
@@ -23,6 +23,20 @@ extern "C" {
* TYPEDEFS
**********************/
+typedef enum {
+ /** No flags */
+ LV_OBJ_POINT_TRANSFORM_FLAG_NONE = 0x00,
+
+ /** Consider the transformation properties of the parents too */
+ LV_OBJ_POINT_TRANSFORM_FLAG_RECURSIVE = 0x01,
+
+ /** Execute the inverse of the transformation (-angle and 1/zoom) */
+ LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE = 0x02,
+
+ /** Both inverse and recursive*/
+ LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE = 0x03,
+} lv_obj_point_transform_flag_t;
+
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -335,19 +349,27 @@ void lv_obj_move_children_by(lv_obj_t * obj, int32_t x_diff, int32_t y_diff, boo
* Transform a point using the angle and zoom style properties of an object
* @param obj pointer to an object whose style properties should be used
* @param p a point to transform, the result will be written back here too
- * @param recursive consider the transformation properties of the parents too
- * @param inv do the inverse of the transformation (-angle and 1/zoom)
+ * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t`
*/
-void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, bool recursive, bool inv);
+void lv_obj_transform_point(const lv_obj_t * obj, lv_point_t * p, lv_obj_point_transform_flag_t flags);
+
+/**
+ * Transform an array of points using the angle and zoom style properties of an object
+ * @param obj pointer to an object whose style properties should be used
+ * @param points the array of points to transform, the result will be written back here too
+ * @param count number of points in the array
+ * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t`
+ */
+void lv_obj_transform_point_array(const lv_obj_t * obj, lv_point_t points[], size_t count,
+ lv_obj_point_transform_flag_t flags);
/**
* Transform an area using the angle and zoom style properties of an object
* @param obj pointer to an object whose style properties should be used
* @param area an area to transform, the result will be written back here too
- * @param recursive consider the transformation properties of the parents too
- * @param inv do the inverse of the transformation (-angle and 1/zoom)
+ * @param flags OR-ed valued of :cpp:enum:`lv_obj_point_transform_flag_t`
*/
-void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, bool recursive, bool inv);
+void lv_obj_get_transformed_area(const lv_obj_t * obj, lv_area_t * area, lv_obj_point_transform_flag_t flags);
/**
* Mark an area of an object as invalid.
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_scroll.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_scroll.c
index f21ebc513..1add20222 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_scroll.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_scroll.c
@@ -15,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
#define SCROLL_ANIM_TIME_MIN 200 /*ms*/
#define SCROLL_ANIM_TIME_MAX 400 /*ms*/
#define SCROLLBAR_MIN_SIZE (LV_DPX(10))
@@ -91,25 +91,25 @@ void lv_obj_set_scroll_snap_y(lv_obj_t * obj, lv_scroll_snap_t align)
lv_scrollbar_mode_t lv_obj_get_scrollbar_mode(const lv_obj_t * obj)
{
- if(obj->spec_attr) return obj->spec_attr->scrollbar_mode;
+ if(obj->spec_attr) return (lv_scrollbar_mode_t) obj->spec_attr->scrollbar_mode;
else return LV_SCROLLBAR_MODE_AUTO;
}
lv_dir_t lv_obj_get_scroll_dir(const lv_obj_t * obj)
{
- if(obj->spec_attr) return obj->spec_attr->scroll_dir;
+ if(obj->spec_attr) return (lv_dir_t) obj->spec_attr->scroll_dir;
else return LV_DIR_ALL;
}
lv_scroll_snap_t lv_obj_get_scroll_snap_x(const lv_obj_t * obj)
{
- if(obj->spec_attr) return obj->spec_attr->scroll_snap_x;
+ if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_x;
else return LV_SCROLL_SNAP_NONE;
}
lv_scroll_snap_t lv_obj_get_scroll_snap_y(const lv_obj_t * obj)
{
- if(obj->spec_attr) return obj->spec_attr->scroll_snap_y;
+ if(obj->spec_attr) return (lv_scroll_snap_t) obj->spec_attr->scroll_snap_y;
else return LV_SCROLL_SNAP_NONE;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c
index 4bc708c18..2273c0e41 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.c
@@ -15,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
#define style_refr LV_GLOBAL_DEFAULT()->style_refresh
#define style_trans_ll_p &(LV_GLOBAL_DEFAULT()->style_trans_ll)
#define _style_custom_prop_flag_lookup_table LV_GLOBAL_DEFAULT()->style_custom_prop_flag_lookup_table
@@ -300,12 +300,7 @@ void lv_obj_refresh_style(lv_obj_t * obj, lv_style_selector_t selector, lv_style
/*Cache the layer type*/
if((part == LV_PART_ANY || part == LV_PART_MAIN) && is_layer_refr) {
- lv_layer_type_t layer_type = calculate_layer_type(obj);
- if(obj->spec_attr) obj->spec_attr->layer_type = layer_type;
- else if(layer_type != LV_LAYER_TYPE_NONE) {
- lv_obj_allocate_spec_attr(obj);
- obj->spec_attr->layer_type = layer_type;
- }
+ _lv_obj_update_layer_type(obj);
}
if(prop == LV_STYLE_PROP_ANY || is_ext_draw) {
@@ -325,70 +320,6 @@ void lv_obj_enable_style_refresh(bool en)
style_refr = en;
}
-static inline lv_style_value_t lv_style_prop_get_default_inlined(lv_style_prop_t prop)
-{
- const lv_color_t black = LV_COLOR_MAKE(0x00, 0x00, 0x00);
- const lv_color_t white = LV_COLOR_MAKE(0xff, 0xff, 0xff);
- switch(prop) {
- case LV_STYLE_TRANSFORM_SCALE_X:
- case LV_STYLE_TRANSFORM_SCALE_Y:
- return (lv_style_value_t) {
- .num = LV_SCALE_NONE
- };
- case LV_STYLE_BG_COLOR:
- return (lv_style_value_t) {
- .color = black
- };
- case LV_STYLE_BG_GRAD_COLOR:
- case LV_STYLE_BORDER_COLOR:
- case LV_STYLE_SHADOW_COLOR:
- case LV_STYLE_OUTLINE_COLOR:
- case LV_STYLE_ARC_COLOR:
- case LV_STYLE_LINE_COLOR:
- case LV_STYLE_TEXT_COLOR:
- case LV_STYLE_IMAGE_RECOLOR:
- return (lv_style_value_t) {
- .color = white
- };
- case LV_STYLE_OPA:
- case LV_STYLE_OPA_LAYERED:
- case LV_STYLE_BORDER_OPA:
- case LV_STYLE_TEXT_OPA:
- case LV_STYLE_IMAGE_OPA:
- case LV_STYLE_BG_GRAD_OPA:
- case LV_STYLE_BG_MAIN_OPA:
- case LV_STYLE_BG_IMAGE_OPA:
- case LV_STYLE_OUTLINE_OPA:
- case LV_STYLE_SHADOW_OPA:
- case LV_STYLE_LINE_OPA:
- case LV_STYLE_ARC_OPA:
- return (lv_style_value_t) {
- .num = LV_OPA_COVER
- };
- case LV_STYLE_BG_GRAD_STOP:
- return (lv_style_value_t) {
- .num = 255
- };
- case LV_STYLE_BORDER_SIDE:
- return (lv_style_value_t) {
- .num = LV_BORDER_SIDE_FULL
- };
- case LV_STYLE_TEXT_FONT:
- return (lv_style_value_t) {
- .ptr = LV_FONT_DEFAULT
- };
- case LV_STYLE_MAX_WIDTH:
- case LV_STYLE_MAX_HEIGHT:
- return (lv_style_value_t) {
- .num = LV_COORD_MAX
- };
- default:
- return (lv_style_value_t) {
- .ptr = 0
- };
- }
-}
-
lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_style_prop_t prop)
{
LV_ASSERT_NULL(obj)
@@ -400,7 +331,7 @@ lv_style_value_t lv_obj_get_style_prop(const lv_obj_t * obj, lv_part_t part, lv_
found = get_selector_style_prop(obj, selector, prop, &value_act);
if(found == LV_STYLE_RES_FOUND) return value_act;
- return lv_style_prop_get_default_inlined(prop);
+ return lv_style_prop_get_default(prop);
}
bool lv_obj_has_style_prop(const lv_obj_t * obj, lv_style_selector_t selector, lv_style_prop_t prop)
@@ -670,6 +601,16 @@ lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part)
return opa_final;
}
+void _lv_obj_update_layer_type(lv_obj_t * obj)
+{
+ lv_layer_type_t layer_type = calculate_layer_type(obj);
+ if(obj->spec_attr) obj->spec_attr->layer_type = layer_type;
+ else if(layer_type != LV_LAYER_TYPE_NONE) {
+ lv_obj_allocate_spec_attr(obj);
+ obj->spec_attr->layer_type = layer_type;
+ }
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -754,7 +695,7 @@ static lv_style_res_t get_prop_core(const lv_obj_t * obj, lv_style_selector_t se
const lv_part_t part = lv_obj_style_get_selector_part(selector);
const lv_state_t state = lv_obj_style_get_selector_state(selector);
const lv_state_t state_inv = ~state;
- const bool skip_trans = obj->skip_trans;
+ const bool skip_trans = (const bool) obj->skip_trans;
int32_t weight = -1;
lv_style_res_t found;
uint32_t i;
@@ -932,7 +873,7 @@ static void trans_anim_cb(void * _tr, int32_t v)
break;
}
- lv_style_value_t old_value;
+ lv_style_value_t old_value = {0};
bool refr = true;
if(lv_style_get_prop(obj->styles[i].style, tr->prop, &old_value)) {
if(value_final.ptr == old_value.ptr && lv_color_eq(value_final.color, old_value.color) &&
@@ -1016,6 +957,7 @@ static lv_layer_type_t calculate_layer_type(lv_obj_t * obj)
if(lv_obj_get_style_transform_skew_x(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM;
if(lv_obj_get_style_transform_skew_y(obj, 0) != 0) return LV_LAYER_TYPE_TRANSFORM;
if(lv_obj_get_style_opa_layered(obj, 0) != LV_OPA_COVER) return LV_LAYER_TYPE_SIMPLE;
+ if(lv_obj_get_style_bitmap_mask_src(obj, 0) != NULL) return LV_LAYER_TYPE_SIMPLE;
if(lv_obj_get_style_blend_mode(obj, 0) != LV_BLEND_MODE_NORMAL) return LV_LAYER_TYPE_SIMPLE;
return LV_LAYER_TYPE_NONE;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.h b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.h
index 3b52d8a38..56639492f 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style.h
@@ -352,6 +352,13 @@ static inline int32_t lv_obj_get_style_transform_scale_y_safe(const lv_obj_t * o
*/
lv_opa_t lv_obj_get_style_opa_recursive(const lv_obj_t * obj, lv_part_t part);
+/**
+ * Update the layer type of a widget bayed on its current styles.
+ * The result will be stored in `obj->spec_attr->layer_type`
+ * @param obj the object whose layer should be updated
+ */
+void _lv_obj_update_layer_type(lv_obj_t * obj);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.c
index 489962205..f9b21e807 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.c
@@ -690,8 +690,7 @@ void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selec
lv_obj_set_local_style_prop(obj, LV_STYLE_OPA_LAYERED, v, selector);
}
-void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value,
- lv_style_selector_t selector)
+void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector)
{
lv_style_value_t v = {
.ptr = value
@@ -754,8 +753,23 @@ void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_sel
};
lv_obj_set_local_style_prop(obj, LV_STYLE_BASE_DIR, v, selector);
}
-#if LV_USE_FLEX
+void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const lv_image_dsc_t * value, lv_style_selector_t selector)
+{
+ lv_style_value_t v = {
+ .ptr = value
+ };
+ lv_obj_set_local_style_prop(obj, LV_STYLE_BITMAP_MASK_SRC, v, selector);
+}
+
+void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_obj_set_local_style_prop(obj, LV_STYLE_ROTARY_SENSITIVITY, v, selector);
+}
+#if LV_USE_FLEX
void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector)
{
@@ -800,7 +814,6 @@ void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector
#if LV_USE_GRID
-
void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector)
{
lv_style_value_t v = {
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.h b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.h
index a8d67e837..c3bd10761 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_style_gen.h
@@ -6,9 +6,14 @@
**********************************************************************
*/
+
#ifndef LV_OBJ_STYLE_GEN_H
#define LV_OBJ_STYLE_GEN_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include "../misc/lv_area.h"
#include "../misc/lv_style.h"
#include "../core/lv_obj_style.h"
@@ -225,8 +230,7 @@ static inline lv_color_t lv_obj_get_style_bg_grad_color(const lv_obj_t * obj, ui
static inline lv_color_t lv_obj_get_style_bg_grad_color_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_BG_GRAD_COLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_GRAD_COLOR));
return v.color;
}
@@ -286,8 +290,7 @@ static inline lv_color_t lv_obj_get_style_bg_image_recolor(const lv_obj_t * obj,
static inline lv_color_t lv_obj_get_style_bg_image_recolor_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_BG_IMAGE_RECOLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BG_IMAGE_RECOLOR));
return v.color;
}
@@ -311,8 +314,7 @@ static inline lv_color_t lv_obj_get_style_border_color(const lv_obj_t * obj, uin
static inline lv_color_t lv_obj_get_style_border_color_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_BORDER_COLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_BORDER_COLOR));
return v.color;
}
@@ -354,8 +356,7 @@ static inline lv_color_t lv_obj_get_style_outline_color(const lv_obj_t * obj, ui
static inline lv_color_t lv_obj_get_style_outline_color_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_OUTLINE_COLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_OUTLINE_COLOR));
return v.color;
}
@@ -403,8 +404,7 @@ static inline lv_color_t lv_obj_get_style_shadow_color(const lv_obj_t * obj, uin
static inline lv_color_t lv_obj_get_style_shadow_color_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_SHADOW_COLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_SHADOW_COLOR));
return v.color;
}
@@ -428,8 +428,7 @@ static inline lv_color_t lv_obj_get_style_image_recolor(const lv_obj_t * obj, ui
static inline lv_color_t lv_obj_get_style_image_recolor_filtered(const lv_obj_t * obj, uint32_t part)
{
- lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part,
- LV_STYLE_IMAGE_RECOLOR));
+ lv_style_value_t v = _lv_obj_style_apply_color_filter(obj, part, lv_obj_get_style_prop(obj, part, LV_STYLE_IMAGE_RECOLOR));
return v.color;
}
@@ -637,8 +636,19 @@ static inline lv_base_dir_t lv_obj_get_style_base_dir(const lv_obj_t * obj, uint
return (lv_base_dir_t)v.num;
}
-#if LV_USE_FLEX
+static inline const lv_image_dsc_t * lv_obj_get_style_bitmap_mask_src(const lv_obj_t * obj, uint32_t part)
+{
+ lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_BITMAP_MASK_SRC);
+ return (const lv_image_dsc_t *)v.ptr;
+}
+static inline uint32_t lv_obj_get_style_rotary_sensitivity(const lv_obj_t * obj, uint32_t part)
+{
+ lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_ROTARY_SENSITIVITY);
+ return (uint32_t)v.num;
+}
+
+#if LV_USE_FLEX
static inline lv_flex_flow_t lv_obj_get_style_flex_flow(const lv_obj_t * obj, uint32_t part)
{
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_FLEX_FLOW);
@@ -672,7 +682,6 @@ static inline uint8_t lv_obj_get_style_flex_grow(const lv_obj_t * obj, uint32_t
#endif /*LV_USE_FLEX*/
#if LV_USE_GRID
-
static inline const int32_t * lv_obj_get_style_grid_column_dsc_array(const lv_obj_t * obj, uint32_t part)
{
lv_style_value_t v = lv_obj_get_style_prop(obj, part, LV_STYLE_GRID_COLUMN_DSC_ARRAY);
@@ -820,8 +829,7 @@ void lv_obj_set_style_radius(lv_obj_t * obj, int32_t value, lv_style_selector_t
void lv_obj_set_style_clip_corner(lv_obj_t * obj, bool value, lv_style_selector_t selector);
void lv_obj_set_style_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_opa_layered(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
-void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value,
- lv_style_selector_t selector);
+void lv_obj_set_style_color_filter_dsc(lv_obj_t * obj, const lv_color_filter_dsc_t * value, lv_style_selector_t selector);
void lv_obj_set_style_color_filter_opa(lv_obj_t * obj, lv_opa_t value, lv_style_selector_t selector);
void lv_obj_set_style_anim(lv_obj_t * obj, const lv_anim_t * value, lv_style_selector_t selector);
void lv_obj_set_style_anim_duration(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector);
@@ -829,27 +837,32 @@ void lv_obj_set_style_transition(lv_obj_t * obj, const lv_style_transition_dsc_t
void lv_obj_set_style_blend_mode(lv_obj_t * obj, lv_blend_mode_t value, lv_style_selector_t selector);
void lv_obj_set_style_layout(lv_obj_t * obj, uint16_t value, lv_style_selector_t selector);
void lv_obj_set_style_base_dir(lv_obj_t * obj, lv_base_dir_t value, lv_style_selector_t selector);
+void lv_obj_set_style_bitmap_mask_src(lv_obj_t * obj, const lv_image_dsc_t * value, lv_style_selector_t selector);
+void lv_obj_set_style_rotary_sensitivity(lv_obj_t * obj, uint32_t value, lv_style_selector_t selector);
#if LV_USE_FLEX
-
- void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector);
- void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector);
+void lv_obj_set_style_flex_flow(lv_obj_t * obj, lv_flex_flow_t value, lv_style_selector_t selector);
+void lv_obj_set_style_flex_main_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_flex_cross_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_flex_track_place(lv_obj_t * obj, lv_flex_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_flex_grow(lv_obj_t * obj, uint8_t value, lv_style_selector_t selector);
#endif /*LV_USE_FLEX*/
#if LV_USE_GRID
-
- void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
- void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_column_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_column_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_row_dsc_array(lv_obj_t * obj, const int32_t * value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_row_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_column_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_x_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_column_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_row_pos(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_y_align(lv_obj_t * obj, lv_grid_align_t value, lv_style_selector_t selector);
+void lv_obj_set_style_grid_cell_row_span(lv_obj_t * obj, int32_t value, lv_style_selector_t selector);
#endif /*LV_USE_GRID*/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
#endif /* LV_OBJ_STYLE_GEN_H */
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_tree.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_tree.c
index 2aa07d8d9..5b8fd420b 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj_tree.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj_tree.c
@@ -20,7 +20,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_obj_class
+#define MY_CLASS (&lv_obj_class)
#define disp_ll_p &(LV_GLOBAL_DEFAULT()->disp_ll)
#define OBJ_DUMP_STRING_LEN 128
@@ -484,6 +484,15 @@ static void lv_obj_delete_async_cb(void * obj)
lv_obj_delete(obj);
}
+static void obj_indev_reset(lv_indev_t * indev, lv_obj_t * obj)
+{
+ /*Wait for release to avoid accidentally triggering other obj to be clicked*/
+ lv_indev_wait_release(indev);
+
+ /*Reset the input device*/
+ lv_indev_reset(indev, obj);
+}
+
static void obj_delete_core(lv_obj_t * obj)
{
if(obj->is_deleting)
@@ -516,7 +525,7 @@ static void obj_delete_core(lv_obj_t * obj)
lv_indev_type_t indev_type = lv_indev_get_type(indev);
if(indev_type == LV_INDEV_TYPE_POINTER || indev_type == LV_INDEV_TYPE_BUTTON) {
if(indev->pointer.act_obj == obj || indev->pointer.last_obj == obj || indev->pointer.scroll_obj == obj) {
- lv_indev_reset(indev, obj);
+ obj_indev_reset(indev, obj);
}
if(indev->pointer.last_pressed == obj) {
indev->pointer.last_pressed = NULL;
@@ -524,7 +533,7 @@ static void obj_delete_core(lv_obj_t * obj)
}
if(indev->group == group && obj == lv_indev_get_active_obj()) {
- lv_indev_reset(indev, obj);
+ obj_indev_reset(indev, obj);
}
indev = lv_indev_get_next(indev);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_refr.c b/lib/libesp32_lvgl/lvgl/src/core/lv_refr.c
index 5bedd063b..fbd1c8a87 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_refr.c
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_refr.c
@@ -679,7 +679,13 @@ static void refr_area_part(lv_layer_t * layer)
}
/*If the screen is transparent initialize it when the flushing is ready*/
if(lv_color_format_has_alpha(disp_refr->color_format)) {
- lv_draw_buf_clear(layer->draw_buf, &disp_refr->refreshed_area);
+ lv_area_t a = disp_refr->refreshed_area;
+ if(disp_refr->render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) {
+ /*The area always starts at 0;0*/
+ lv_area_move(&a, -disp_refr->refreshed_area.x1, -disp_refr->refreshed_area.y1);
+ }
+
+ lv_draw_buf_clear(layer->draw_buf, &a);
}
lv_obj_t * top_act_scr = NULL;
@@ -820,19 +826,18 @@ static void refr_obj_and_children(lv_layer_t * layer, lv_obj_t * top_obj)
}
static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_type_t layer_type,
- lv_area_t * layer_area_out)
+ lv_area_t * layer_area_out, lv_area_t * obj_draw_size_out)
{
int32_t ext_draw_size = _lv_obj_get_ext_draw_size(obj);
- lv_area_t obj_coords_ext;
- lv_obj_get_coords(obj, &obj_coords_ext);
- lv_area_increase(&obj_coords_ext, ext_draw_size, ext_draw_size);
+ lv_obj_get_coords(obj, obj_draw_size_out);
+ lv_area_increase(obj_draw_size_out, ext_draw_size, ext_draw_size);
if(layer_type == LV_LAYER_TYPE_TRANSFORM) {
/*Get the transformed area and clip it to the current clip area.
*This area needs to be updated on the screen.*/
lv_area_t clip_coords_for_obj;
- lv_area_t tranf_coords = obj_coords_ext;
- lv_obj_get_transformed_area(obj, &tranf_coords, false, false);
+ lv_area_t tranf_coords = *obj_draw_size_out;
+ lv_obj_get_transformed_area(obj, &tranf_coords, LV_OBJ_POINT_TRANSFORM_FLAG_NONE);
if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &tranf_coords)) {
return LV_RESULT_INVALID;
}
@@ -841,8 +846,8 @@ static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_t
*It will tell which area of the non-transformed widget needs to be redrawn
*in order to cover transformed area after transformation.*/
lv_area_t inverse_clip_coords_for_obj = clip_coords_for_obj;
- lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, false, true);
- if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, &obj_coords_ext)) {
+ lv_obj_get_transformed_area(obj, &inverse_clip_coords_for_obj, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE);
+ if(!_lv_area_intersect(&inverse_clip_coords_for_obj, &inverse_clip_coords_for_obj, obj_draw_size_out)) {
return LV_RESULT_INVALID;
}
@@ -851,7 +856,7 @@ static lv_result_t layer_get_area(lv_layer_t * layer, lv_obj_t * obj, lv_layer_t
}
else if(layer_type == LV_LAYER_TYPE_SIMPLE) {
lv_area_t clip_coords_for_obj;
- if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, &obj_coords_ext)) {
+ if(!_lv_area_intersect(&clip_coords_for_obj, &layer->_clip_area, obj_draw_size_out)) {
return LV_RESULT_INVALID;
}
*layer_area_out = clip_coords_for_obj;
@@ -891,7 +896,8 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
if(opa < LV_OPA_MIN) return;
lv_area_t layer_area_full;
- lv_result_t res = layer_get_area(layer, obj, layer_type, &layer_area_full);
+ lv_area_t obj_draw_size;
+ lv_result_t res = layer_get_area(layer, obj, layer_type, &layer_area_full, &obj_draw_size);
if(res != LV_RESULT_OK) return;
/*Simple layers can be subdivied into smaller layers*/
@@ -900,8 +906,8 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
if(layer_type == LV_LAYER_TYPE_SIMPLE) {
int32_t w = lv_area_get_width(&layer_area_full);
uint8_t px_size = lv_color_format_get_size(disp_refr->color_format);
- max_rgb_row_height = LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE / w / px_size;
- max_argb_row_height = LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE / w / sizeof(lv_color32_t);
+ max_rgb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / px_size;
+ max_argb_row_height = LV_DRAW_LAYER_SIMPLE_BUF_SIZE / w / sizeof(lv_color32_t);
}
lv_area_t layer_area_act;
@@ -925,10 +931,22 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
area_need_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE, &layer_area_act);
lv_obj_redraw(new_layer, obj);
+ lv_point_t pivot = {
+ .x = lv_obj_get_style_transform_pivot_x(obj, 0),
+ .y = lv_obj_get_style_transform_pivot_y(obj, 0)
+ };
+
+ if(LV_COORD_IS_PCT(pivot.x)) {
+ pivot.x = (LV_COORD_GET_PCT(pivot.x) * lv_area_get_width(&obj->coords)) / 100;
+ }
+ if(LV_COORD_IS_PCT(pivot.y)) {
+ pivot.y = (LV_COORD_GET_PCT(pivot.y) * lv_area_get_height(&obj->coords)) / 100;
+ }
+
lv_draw_image_dsc_t layer_draw_dsc;
lv_draw_image_dsc_init(&layer_draw_dsc);
- layer_draw_dsc.pivot.x = obj->coords.x1 + lv_obj_get_style_transform_pivot_x(obj, 0) - new_layer->buf_area.x1;
- layer_draw_dsc.pivot.y = obj->coords.y1 + lv_obj_get_style_transform_pivot_y(obj, 0) - new_layer->buf_area.y1;
+ layer_draw_dsc.pivot.x = obj->coords.x1 + pivot.x - new_layer->buf_area.x1;
+ layer_draw_dsc.pivot.y = obj->coords.y1 + pivot.y - new_layer->buf_area.y1;
layer_draw_dsc.opa = opa;
layer_draw_dsc.rotation = lv_obj_get_style_transform_rotation(obj, 0);
@@ -940,6 +958,8 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
layer_draw_dsc.skew_y = lv_obj_get_style_transform_skew_y(obj, 0);
layer_draw_dsc.blend_mode = lv_obj_get_style_blend_mode(obj, 0);
layer_draw_dsc.antialias = disp_refr->antialiasing;
+ layer_draw_dsc.bitmap_mask_src = lv_obj_get_style_bitmap_mask_src(obj, 0);
+ layer_draw_dsc.original_area = obj_draw_size;
layer_draw_dsc.src = new_layer;
lv_draw_layer(layer, &layer_draw_dsc, &layer_area_act);
@@ -952,9 +972,9 @@ void refr_obj(lv_layer_t * layer, lv_obj_t * obj)
static uint32_t get_max_row(lv_display_t * disp, int32_t area_w, int32_t area_h)
{
bool has_alpha = lv_color_format_has_alpha(disp->color_format);
- uint32_t px_size_disp = lv_color_format_get_size(disp->color_format);
- uint8_t px_size_render = has_alpha ? sizeof(lv_color32_t) : px_size_disp;
- int32_t max_row = (uint32_t)disp->buf_act->data_size / LV_MAX(px_size_render, px_size_disp) / area_w;
+ lv_color_format_t cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : disp->color_format;
+ uint32_t stride = lv_draw_buf_width_to_stride(area_w, cf);
+ int32_t max_row = (uint32_t)disp->buf_act->data_size / stride;
if(max_row > area_h) max_row = area_h;
@@ -1055,6 +1075,8 @@ static void wait_for_flushing(lv_display_t * disp)
LV_PROFILER_BEGIN;
LV_LOG_TRACE("begin");
+ lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_START, NULL);
+
if(disp->flush_wait_cb) {
disp->flush_wait_cb(disp);
}
@@ -1063,6 +1085,8 @@ static void wait_for_flushing(lv_display_t * disp)
}
disp->flushing_last = 0;
+ lv_display_send_event(disp, LV_EVENT_FLUSH_WAIT_FINISH, NULL);
+
LV_LOG_TRACE("end");
LV_PROFILER_END;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_refr.h b/lib/libesp32_lvgl/lvgl/src/core/lv_refr.h
index e92732edd..537b9eedd 100644
--- a/lib/libesp32_lvgl/lvgl/src/core/lv_refr.h
+++ b/lib/libesp32_lvgl/lvgl/src/core/lv_refr.h
@@ -61,7 +61,7 @@ void _lv_refr_deinit(void);
void lv_refr_now(lv_display_t * disp);
/**
- * Redrawn on object an all its children using the passed draw context
+ * Redrawn on object and all its children using the passed draw context
* @param layer pointer to a layer where to draw.
* @param obj the start object from the redraw should start
*/
diff --git a/lib/libesp32_lvgl/lvgl/src/display/lv_display.c b/lib/libesp32_lvgl/lvgl/src/display/lv_display.c
index d67a9a44b..2e839f45a 100644
--- a/lib/libesp32_lvgl/lvgl/src/display/lv_display.c
+++ b/lib/libesp32_lvgl/lvgl/src/display/lv_display.c
@@ -84,6 +84,7 @@ lv_display_t * lv_display_create(int32_t hor_res, int32_t ver_res)
disp->layer_head->color_format = disp->color_format;
disp->inv_en_cnt = 1;
+ disp->last_activity_time = lv_tick_get();
_lv_ll_init(&disp->sync_areas, sizeof(lv_area_t));
@@ -406,8 +407,8 @@ void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint3
LV_ASSERT_MSG(w != 0 && h != 0, "display resolution is 0");
/* buf1 or buf2 is not aligned according to LV_DRAW_BUF_ALIGN */
- LV_ASSERT_MSG(buf1 == lv_draw_buf_align(buf1, cf), "buf1 is not aligned: %p", buf1);
- LV_ASSERT_MSG(buf2 == NULL || buf2 == lv_draw_buf_align(buf2, cf), "buf2 is not aligned: %p", buf2);
+ LV_ASSERT_FORMAT_MSG(buf1 == lv_draw_buf_align(buf1, cf), "buf1 is not aligned: %p", buf1);
+ LV_ASSERT_FORMAT_MSG(buf2 == NULL || buf2 == lv_draw_buf_align(buf2, cf), "buf2 is not aligned: %p", buf2);
uint32_t stride = lv_draw_buf_width_to_stride(w, cf);
if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) {
@@ -416,8 +417,8 @@ void lv_display_set_buffers(lv_display_t * disp, void * buf1, void * buf2, uint3
LV_ASSERT_MSG(h != 0, "the buffer is too small");
}
else {
- LV_ASSERT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)",
- render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT");
+ LV_ASSERT_FORMAT_MSG(stride * h <= buf_size, "%s mode requires screen sized buffer(s)",
+ render_mode == LV_DISPLAY_RENDER_MODE_FULL ? "FULL" : "DIRECT");
}
lv_draw_buf_init(&disp->_static_buf1, w, h, cf, stride, buf1, buf_size);
@@ -916,6 +917,13 @@ void * lv_display_get_driver_data(lv_display_t * disp)
return disp->driver_data;
}
+lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp)
+{
+ if(!disp) disp = lv_display_get_default();
+ if(!disp) return NULL;
+ return disp->buf_act;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/display/lv_display.h b/lib/libesp32_lvgl/lvgl/src/display/lv_display.h
index da0c38f7d..c3ce14775 100644
--- a/lib/libesp32_lvgl/lvgl/src/display/lv_display.h
+++ b/lib/libesp32_lvgl/lvgl/src/display/lv_display.h
@@ -534,6 +534,7 @@ void lv_display_set_user_data(lv_display_t * disp, void * user_data);
void lv_display_set_driver_data(lv_display_t * disp, void * driver_data);
void * lv_display_get_user_data(lv_display_t * disp);
void * lv_display_get_driver_data(lv_display_t * disp);
+lv_draw_buf_t * lv_display_get_buf_active(lv_display_t * disp);
/**********************
* MACROS
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw.c
index b4c9b4abd..c73585e11 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw.c
@@ -213,12 +213,10 @@ bool lv_draw_dispatch_layer(lv_display_t * disp, lv_layer_t * layer)
lv_free(layer_drawn);
}
}
- if(t->type == LV_DRAW_TASK_TYPE_LABEL) {
- lv_draw_label_dsc_t * draw_label_dsc = t->draw_dsc;
- if(draw_label_dsc->text_local) {
- lv_free((void *)draw_label_dsc->text);
- draw_label_dsc->text = NULL;
- }
+ lv_draw_label_dsc_t * draw_label_dsc = lv_draw_task_get_label_dsc(t);
+ if(draw_label_dsc && draw_label_dsc->text_local) {
+ lv_free((void *)draw_label_dsc->text);
+ draw_label_dsc->text = NULL;
}
lv_free(t->draw_dsc);
@@ -370,6 +368,7 @@ void * lv_draw_layer_alloc_buf(lv_layer_t * layer)
/*If the buffer of the layer is not allocated yet, allocate it now*/
int32_t w = lv_area_get_width(&layer->buf_area);
int32_t h = lv_area_get_height(&layer->buf_area);
+ uint32_t layer_size_byte = h * lv_draw_buf_width_to_stride(w, layer->color_format);
layer->draw_buf = lv_draw_buf_create(w, h, layer->color_format, 0);
@@ -378,13 +377,11 @@ void * lv_draw_layer_alloc_buf(lv_layer_t * layer)
return NULL;
}
+ _draw_info.used_memory_for_layers_kb += get_layer_size_kb(layer_size_byte);
+ LV_LOG_INFO("Layer memory used: %" LV_PRIu32 " kB\n", _draw_info.used_memory_for_layers_kb);
+
if(lv_color_format_has_alpha(layer->color_format)) {
- lv_area_t a;
- a.x1 = 0;
- a.y1 = 0;
- a.x2 = w - 1;
- a.y2 = h - 1;
- lv_draw_buf_clear(layer->draw_buf, &a);
+ lv_draw_buf_clear(layer->draw_buf, NULL);
}
return layer->draw_buf->data;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.c
index 9f8a8b0f9..634c0429e 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.c
@@ -43,6 +43,11 @@ void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc)
dsc->color = lv_color_black();
}
+lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_ARC ? (lv_draw_arc_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_arc(lv_layer_t * layer, const lv_draw_arc_dsc_t * dsc)
{
if(dsc->opa <= LV_OPA_MIN) return;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.h
index e4e09987f..726bd68c8 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_arc.h
@@ -50,6 +50,13 @@ typedef struct {
*/
void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc);
+/**
+ * Try to get an arc draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_ARC
+ */
+lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task);
+
/**
* Create an arc draw task.
* @param layer pointer to a layer
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.c
index fba6a4d1d..bd7f7406e 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.c
@@ -70,9 +70,20 @@ void * lv_draw_buf_align(void * data, lv_color_format_t color_format)
else return NULL;
}
-void lv_draw_buf_invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area)
+void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area)
{
- if(handlers.invalidate_cache_cb) handlers.invalidate_cache_cb(buf, stride, color_format, area);
+ if(handlers.invalidate_cache_cb) {
+ LV_ASSERT_NULL(draw_buf);
+ const lv_image_header_t * header = &draw_buf->header;
+ lv_area_t full;
+ if(area == NULL) {
+ full = (lv_area_t) {
+ 0, 0, header->w - 1, header->h - 1
+ };
+ area = &full;
+ }
+ handlers.invalidate_cache_cb(draw_buf, area);
+ }
}
void lv_draw_buf_clear(lv_draw_buf_t * draw_buf, const lv_area_t * a)
@@ -110,9 +121,20 @@ void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area,
uint8_t * src_bufc;
int32_t line_width;
+ /*Source and dest color format must be same. Color conversion is not supported yet.*/
+ LV_ASSERT_FORMAT_MSG(dest->header.cf == src->header.cf, "Color format mismatch: %d != %d",
+ dest->header.cf, src->header.cf);
+
if(dest_area == NULL) line_width = dest->header.w;
else line_width = lv_area_get_width(dest_area);
+ /* For indexed image, copy the palette if we are copying full image area*/
+ if(dest_area == NULL || src_area == NULL) {
+ if(LV_COLOR_FORMAT_IS_INDEXED(dest->header.cf)) {
+ lv_memcpy(dest->data, src->data, LV_COLOR_INDEXED_PALETTE_SIZE(dest->header.cf) * sizeof(lv_color32_t));
+ }
+ }
+
/*Check source and dest area have same width*/
if((src_area == NULL && line_width != src->header.w) || \
(src_area != NULL && line_width != lv_area_get_width(src_area))) {
@@ -121,10 +143,10 @@ void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area,
}
if(src_area) src_bufc = lv_draw_buf_goto_xy(src, src_area->x1, src_area->y1);
- else src_bufc = src->data;
+ else src_bufc = lv_draw_buf_goto_xy(src, 0, 0);
if(dest_area) dest_bufc = lv_draw_buf_goto_xy(dest, dest_area->x1, dest_area->y1);
- else dest_bufc = dest->data;
+ else dest_bufc = lv_draw_buf_goto_xy(dest, 0, 0);
int32_t start_y, end_y;
if(dest_area) {
@@ -138,10 +160,10 @@ void lv_draw_buf_copy(lv_draw_buf_t * dest, const lv_area_t * dest_area,
uint32_t dest_stride = dest->header.stride;
uint32_t src_stride = src->header.stride;
- line_width *= lv_color_format_get_size(dest->header.cf); /*Pixel to bytes*/
+ uint32_t line_bytes = (line_width * lv_color_format_get_bpp(dest->header.cf) + 7) >> 3;
for(; start_y <= end_y; start_y++) {
- lv_memcpy(dest_bufc, src_bufc, line_width);
+ lv_memcpy(dest_bufc, src_bufc, line_bytes);
dest_bufc += dest_stride;
src_bufc += src_stride;
}
@@ -161,7 +183,14 @@ lv_result_t lv_draw_buf_init(lv_draw_buf_t * draw_buf, uint32_t w, uint32_t h, l
return LV_RESULT_INVALID;
}
- lv_image_header_init(&draw_buf->header, w, h, cf, stride, 0);
+ lv_image_header_t * header = &draw_buf->header;
+ header->w = w;
+ header->h = h;
+ header->cf = cf;
+ header->stride = stride;
+ header->flags = 0;
+ header->magic = LV_IMAGE_HEADER_MAGIC;
+
draw_buf->data = lv_draw_buf_align(data, cf);
draw_buf->unaligned_data = data;
draw_buf->data_size = data_size;
@@ -230,7 +259,7 @@ lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t
uint32_t size = _calculate_draw_buf_size(w, h, cf, stride);
if(size > draw_buf->data_size) {
- LV_LOG_INFO("Draw buf too small for new shape");
+ LV_LOG_TRACE("Draw buf too small for new shape");
return NULL;
}
@@ -262,49 +291,73 @@ void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y)
if(buf == NULL) return NULL;
uint8_t * data = buf->data;
+
+ /*Skip palette*/
+ data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t);
data += buf->header.stride * y;
- if(x == 0)
- return data;
+ if(x == 0) return data;
return data + x * lv_color_format_get_size(buf->header.cf);
}
-lv_draw_buf_t * lv_draw_buf_adjust_stride(const lv_draw_buf_t * src, uint32_t stride)
+lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride)
{
LV_ASSERT_NULL(src);
LV_ASSERT_NULL(src->data);
- if(src == NULL) return NULL;
- if(src->data == NULL) return NULL;
+ if(src == NULL) return LV_RESULT_INVALID;
+ if(src->data == NULL) return LV_RESULT_INVALID;
const lv_image_header_t * header = &src->header;
+ uint32_t w = header->w;
+ uint32_t h = header->h;
/*Use global stride*/
- if(stride == 0) stride = lv_draw_buf_width_to_stride(header->w, header->cf);
+ if(stride == 0) stride = lv_draw_buf_width_to_stride(w, header->cf);
/*Check if stride already match*/
- if(header->stride == stride) return NULL;
+ if(header->stride == stride) return LV_RESULT_OK;
/*Calculate the minimal stride allowed from bpp*/
uint32_t bpp = lv_color_format_get_bpp(header->cf);
- uint32_t min_stride = (header->w * bpp + 7) >> 3;
+ uint32_t min_stride = (w * bpp + 7) >> 3;
if(stride < min_stride) {
LV_LOG_WARN("New stride is too small. min: %" LV_PRId32, min_stride);
- return NULL;
+ return LV_RESULT_INVALID;
}
- lv_draw_buf_t * dst = lv_draw_buf_create(header->w, header->h, header->cf, stride);
- if(dst == NULL) return NULL;
-
- uint8_t * dst_data = dst->data;
- const uint8_t * src_data = src->data;
- for(int32_t y = 0; y < src->header.h; y++) {
- lv_memcpy(dst_data, src_data, min_stride);
- src_data += src->header.stride;
- dst_data += dst->header.stride;
+ /*Check if buffer has enough space. */
+ uint32_t new_size = _calculate_draw_buf_size(w, h, header->cf, stride);
+ if(new_size > src->data_size) {
+ return LV_RESULT_INVALID;
}
- return dst;
+ uint32_t offset = LV_COLOR_INDEXED_PALETTE_SIZE(header->cf) * 4;
+
+ if(stride > header->stride) {
+ /*Copy from the last line to the first*/
+ uint8_t * src_data = src->data + offset + header->stride * (h - 1);
+ uint8_t * dst_data = src->data + offset + stride * (h - 1);
+ for(uint32_t y = 0; y < h; y++) {
+ lv_memmove(dst_data, src_data, min_stride);
+ src_data -= header->stride;
+ dst_data -= stride;
+ }
+ }
+ else {
+ /*Copy from the first line to the last*/
+ uint8_t * src_data = src->data + offset;
+ uint8_t * dst_data = src->data + offset;
+ for(uint32_t y = 0; y < h; y++) {
+ lv_memmove(dst_data, src_data, min_stride);
+ src_data += header->stride;
+ dst_data += stride;
+ }
+ }
+
+ src->header.stride = stride;
+
+ return LV_RESULT_OK;
}
lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf)
@@ -358,6 +411,21 @@ lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf)
alpha += alpha_stride;
}
}
+ else if(cf == LV_COLOR_FORMAT_ARGB8565) {
+ uint32_t h = draw_buf->header.h;
+ uint32_t w = draw_buf->header.w;
+ uint32_t stride = draw_buf->header.stride;
+ uint8_t * line = (uint8_t *)draw_buf->data;
+ for(uint32_t y = 0; y < h; y++) {
+ uint8_t * pixel = line;
+ for(uint32_t x = 0; x < w; x++) {
+ uint8_t alpha = pixel[2];
+ lv_color16_premultiply((lv_color16_t *)pixel, alpha);
+ pixel += 3;
+ }
+ line += stride;
+ }
+ }
else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) {
/*Pass*/
}
@@ -370,6 +438,20 @@ lv_result_t lv_draw_buf_premultiply(lv_draw_buf_t * draw_buf)
return LV_RESULT_OK;
}
+void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color)
+{
+ LV_ASSERT_NULL(draw_buf);
+ if(draw_buf == NULL) return;
+
+ if(!LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) {
+ LV_LOG_WARN("Not indexed color format");
+ return;
+ }
+
+ uint8_t * buf = (uint8_t *)draw_buf->data;
+ lv_memcpy(&buf[index * sizeof(color)], &color, sizeof(color));
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.h
index 4b14262cf..499285b9a 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_buf.h
@@ -15,7 +15,8 @@ extern "C" {
*********************/
#include "../misc/lv_area.h"
#include "../misc/lv_color.h"
-#include "lv_image_buf.h"
+#include "../stdlib/lv_string.h"
+#include "lv_image_dsc.h"
/*********************
* DEFINES
@@ -32,7 +33,7 @@ LV_EXPORT_CONST_INT(LV_STRIDE_AUTO);
typedef struct {
lv_image_header_t header;
uint32_t data_size; /*Total buf size in bytes*/
- void * data;
+ uint8_t * data;
void * unaligned_data; /*Unaligned address of `data`, used internally by lvgl*/
} lv_draw_buf_t;
@@ -56,11 +57,13 @@ typedef struct {
static uint8_t buf_##name[_LV_DRAW_BUF_SIZE(_w, _h, _cf)]; \
static lv_draw_buf_t name = { \
.header = { \
- .w = (_w), \
- .h = (_h), \
+ .magic = LV_IMAGE_HEADER_MAGIC, \
.cf = (_cf), \
.flags = LV_IMAGE_FLAGS_MODIFIABLE, \
+ .w = (_w), \
+ .h = (_h), \
.stride = _LV_DRAW_BUF_STRIDE(_w, _cf), \
+ .reserved_2 = 0, \
}, \
.data_size = sizeof(buf_##name), \
.data = buf_##name, \
@@ -73,8 +76,7 @@ typedef void (*lv_draw_buf_free_cb)(void * draw_buf);
typedef void * (*lv_draw_buf_align_cb)(void * buf, lv_color_format_t color_format);
-typedef void (*lv_draw_buf_invalidate_cache_cb)(void * buf, uint32_t stride, lv_color_format_t color_format,
- const lv_area_t * area);
+typedef void (*lv_draw_buf_invalidate_cache_cb)(const lv_draw_buf_t * draw_buf, const lv_area_t * area);
typedef uint32_t (*lv_draw_buf_width_to_stride_cb)(uint32_t w, lv_color_format_t color_format);
@@ -112,12 +114,11 @@ void * lv_draw_buf_align(void * buf, lv_color_format_t color_format);
/**
* Invalidate the cache of the buffer
- * @param buf a memory address to invalidate
- * @param stride stride of the buffer
- * @param color_format color format of the buffer
- * @param area the area to invalidate in the buffer
+ * @param draw_buf the draw buffer needs to be invalidated
+ * @param area the area to invalidate in the buffer,
+ * use NULL to invalidate the whole draw buffer address range
*/
-void lv_draw_buf_invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area);
+void lv_draw_buf_invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area);
/**
* Calculate the stride in bytes based on a width and color format
@@ -195,7 +196,7 @@ lv_draw_buf_t * lv_draw_buf_reshape(lv_draw_buf_t * draw_buf, lv_color_format_t
uint32_t stride);
/**
- * Destroy a draw buf by free the actual buffer if it's marked as LV_IMAGE_FLAGS_MODIFIABLE in header.
+ * Destroy a draw buf by free the actual buffer if it's marked as LV_IMAGE_FLAGS_ALLOCATED in header.
* Then free the lv_draw_buf_t struct.
*/
void lv_draw_buf_destroy(lv_draw_buf_t * buf);
@@ -206,9 +207,12 @@ void lv_draw_buf_destroy(lv_draw_buf_t * buf);
void * lv_draw_buf_goto_xy(const lv_draw_buf_t * buf, uint32_t x, uint32_t y);
/**
- * Adjust the stride of a draw buf.
+ * Adjust the stride of a draw buf in place.
+ * @param src pointer to a draw buffer
+ * @param stride the new stride in bytes for image. Use LV_STRIDE_AUTO for automatic calculation.
+ * @return LV_RESULT_OK: success or LV_RESULT_INVALID: failed
*/
-lv_draw_buf_t * lv_draw_buf_adjust_stride(const lv_draw_buf_t * src, uint32_t stride);
+lv_result_t lv_draw_buf_adjust_stride(lv_draw_buf_t * src, uint32_t stride);
/**
* Premultiply draw buffer color with alpha channel.
@@ -224,6 +228,16 @@ static inline bool lv_draw_buf_has_flag(lv_draw_buf_t * draw_buf, lv_image_flags
return draw_buf->header.flags & flag;
}
+static inline void lv_draw_buf_set_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag)
+{
+ draw_buf->header.flags |= flag;
+}
+
+static inline void lv_draw_buf_clear_flag(lv_draw_buf_t * draw_buf, lv_image_flags_t flag)
+{
+ draw_buf->header.flags &= ~flag;
+}
+
/**
* As of now, draw buf share same definition as `lv_image_dsc_t`.
* And is interchangeable with `lv_image_dsc_t`.
@@ -237,7 +251,43 @@ static inline void lv_draw_buf_from_image(lv_draw_buf_t * buf, const lv_image_ds
static inline void lv_draw_buf_to_image(const lv_draw_buf_t * buf, lv_image_dsc_t * img)
{
- lv_memcpy(img, buf, sizeof(lv_image_dsc_t));
+ lv_memcpy((void *)img, buf, sizeof(lv_image_dsc_t));
+}
+
+/**
+ * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8`
+ * @param draw_buf pointer to an image descriptor
+ * @param index the palette color to set:
+ * - for `LV_COLOR_FORMAT_I1`: 0..1
+ * - for `LV_COLOR_FORMAT_I2`: 0..3
+ * - for `LV_COLOR_FORMAT_I4`: 0..15
+ * - for `LV_COLOR_FORMAT_I8`: 0..255
+ * @param color the color to set in lv_color32_t format
+ */
+void lv_draw_buf_set_palette(lv_draw_buf_t * draw_buf, uint8_t index, lv_color32_t color);
+
+/**
+ * @deprecated Use lv_draw_buf_set_palette instead.
+ */
+static inline void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c)
+{
+ LV_LOG_WARN("Deprecated API, use lv_draw_buf_set_palette instead.");
+ lv_draw_buf_set_palette((lv_draw_buf_t *)dsc, id, c);
+}
+
+/**
+ * @deprecated Use lv_draw_buffer_create/destroy instead.
+ * Free the data pointer and dsc struct of an image.
+ */
+static inline void lv_image_buf_free(lv_image_dsc_t * dsc)
+{
+ LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy instead.");
+ if(dsc != NULL) {
+ if(dsc->data != NULL)
+ lv_free((void *)dsc->data);
+
+ lv_free((void *)dsc);
+ }
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.c
index cb89fbda2..941b631c1 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.c
@@ -51,9 +51,15 @@ void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc)
dsc->scale_x = LV_SCALE_NONE;
dsc->scale_y = LV_SCALE_NONE;
dsc->antialias = LV_COLOR_DEPTH > 8 ? 1 : 0;
+ dsc->original_area.x2 = LV_COORD_MIN; /*Indicate invalid area by default by setting a negative size*/
dsc->base.dsc_size = sizeof(lv_draw_image_dsc_t);
}
+lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_IMAGE ? (lv_draw_image_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_layer(lv_layer_t * layer, const lv_draw_image_dsc_t * dsc, const lv_area_t * coords)
{
lv_draw_task_t * t = lv_draw_add_task(layer, coords);
@@ -214,6 +220,33 @@ void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image
lv_image_decoder_close(&decoder_dsc);
}
+void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle,
+ uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot)
+{
+ if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) {
+ res->x1 = 0;
+ res->y1 = 0;
+ res->x2 = w - 1;
+ res->y2 = h - 1;
+ return;
+ }
+
+ lv_point_t p[4] = {
+ {0, 0},
+ {w, 0},
+ {0, h},
+ {w, h},
+ };
+ lv_point_transform(&p[0], angle, scale_x, scale_y, pivot, true);
+ lv_point_transform(&p[1], angle, scale_x, scale_y, pivot, true);
+ lv_point_transform(&p[2], angle, scale_x, scale_y, pivot, true);
+ lv_point_transform(&p[3], angle, scale_x, scale_y, pivot, true);
+ res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x);
+ res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) - 1;
+ res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y);
+ res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) - 1;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.h
index 4965c773e..a6a9be568 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_image.h
@@ -15,7 +15,7 @@ extern "C" {
*********************/
#include "lv_draw.h"
#include "lv_image_decoder.h"
-#include "lv_image_buf.h"
+#include "lv_draw_buf.h"
#include "../misc/lv_style.h"
/*********************
@@ -55,9 +55,14 @@ typedef struct _lv_draw_image_dsc_t {
lv_opa_t opa;
lv_blend_mode_t blend_mode : 4;
- uint16_t antialias : 1;
- uint16_t tile : 1;
+ uint16_t antialias : 1;
+ uint16_t tile : 1;
lv_draw_image_sup_t * sup;
+
+ /** Might be used to indicate the original size of the image if only a small portion is rendered now.
+ * Used when a part of a layer is rendered to show the total layer size*/
+ lv_area_t original_area;
+ const lv_image_dsc_t * bitmap_mask_src;
} lv_draw_image_dsc_t;
/**
@@ -83,6 +88,13 @@ typedef void (*lv_draw_image_core_cb)(lv_draw_unit_t * draw_unit, const lv_draw_
*/
void lv_draw_image_dsc_init(lv_draw_image_dsc_t * dsc);
+/**
+ * Try to get an image draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_IMAGE
+ */
+lv_draw_image_dsc_t * lv_draw_task_get_image_dsc(lv_draw_task_t * task);
+
/**
* Create an image draw task
* @param layer pointer to a layer
@@ -131,6 +143,19 @@ void _lv_draw_image_normal_helper(lv_draw_unit_t * draw_unit, const lv_draw_imag
void _lv_draw_image_tiled_helper(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc,
const lv_area_t * coords, lv_draw_image_core_cb draw_core_cb);
+/**
+ * Get the area of a rectangle if its rotated and scaled
+ * @param res store the coordinates here
+ * @param w width of the rectangle to transform
+ * @param h height of the rectangle to transform
+ * @param angle angle of rotation
+ * @param scale_x zoom in x direction, (256 no zoom)
+ * @param scale_y zoom in y direction, (256 no zoom)
+ * @param pivot x,y pivot coordinates of rotation
+ */
+void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle,
+ uint16_t scale_x, uint16_t scale_y, const lv_point_t * pivot);
+
#ifdef __cplusplus
} /*extern "C"*/
#endif
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.c
index 81a11e87b..515fbc446 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.c
@@ -61,12 +61,17 @@ void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc)
dsc->base.dsc_size = sizeof(lv_draw_label_dsc_t);
}
+lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_LABEL ? (lv_draw_label_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(lv_draw_glyph_dsc_t));
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc,
+void LV_ATTRIBUTE_FAST_MEM lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc,
const lv_area_t * coords)
{
if(dsc->opa <= LV_OPA_MIN) return;
@@ -93,7 +98,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_layer_t * layer, const lv_draw_label
LV_PROFILER_END;
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc,
+void LV_ATTRIBUTE_FAST_MEM lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc,
const lv_point_t * point, uint32_t unicode_letter)
{
if(dsc->opa <= LV_OPA_MIN) return;
@@ -401,7 +406,7 @@ static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc,
if(g.resolved_font) {
lv_draw_buf_t * draw_buf = NULL;
- if(g.bpp < LV_IMGFONT_BPP) {
+ if(LV_FONT_GLYPH_FORMAT_NONE < g.format && g.format < LV_FONT_GLYPH_FORMAT_IMAGE) {
/*Only check draw buf for bitmap glyph*/
draw_buf = lv_draw_buf_reshape(dsc->_draw_buf, 0, g.box_w, g.box_h, LV_STRIDE_AUTO);
if(draw_buf == NULL) {
@@ -417,21 +422,10 @@ static void draw_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * dsc,
}
dsc->glyph_data = (void *)lv_font_get_glyph_bitmap(&g, letter, draw_buf);
- if(dsc->glyph_data == NULL) {
- dsc->format = LV_DRAW_LETTER_BITMAP_FORMAT_INVALID;
- }
- else if(g.bpp == LV_IMGFONT_BPP) {
- dsc->format = LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE;
- }
- else if(g.bpp == LV_VECFONT_BPP) {
- dsc->format = LV_DRAW_LETTER_VECTOR_FORMAT;
- }
- else {
- dsc->format = LV_DRAW_LETTER_BITMAP_FORMAT_A8;
- }
+ dsc->format = dsc->glyph_data ? g.format : LV_FONT_GLYPH_FORMAT_NONE;
}
else {
- dsc->format = LV_DRAW_LETTER_BITMAP_FORMAT_INVALID;
+ dsc->format = LV_FONT_GLYPH_FORMAT_NONE;
}
dsc->letter_coords = &letter_coords;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.h
index 05df99192..f0b962802 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_label.h
@@ -72,16 +72,9 @@ typedef struct {
lv_draw_label_hint_t * hint;
} lv_draw_label_dsc_t;
-typedef enum {
- LV_DRAW_LETTER_BITMAP_FORMAT_INVALID,
- LV_DRAW_LETTER_BITMAP_FORMAT_A8,
- LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE,
- LV_DRAW_LETTER_VECTOR_FORMAT,
-} lv_draw_glyph_bitmap_format_t;
-
typedef struct {
void * glyph_data; /*Depends on `format` field, it could be image source or draw buf of bitmap or vector data.*/
- lv_draw_glyph_bitmap_format_t format;
+ lv_font_glyph_format_t format;
const lv_area_t * letter_coords;
const lv_area_t * bg_coords;
const lv_font_glyph_dsc_t * g;
@@ -113,7 +106,14 @@ typedef void(*lv_draw_glyph_cb_t)(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_
* Initialize a label draw descriptor
* @param dsc pointer to a draw descriptor
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label_dsc_init(lv_draw_label_dsc_t * dsc);
+
+/**
+ * Try to get a label draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LABEL
+ */
+lv_draw_label_dsc_t * lv_draw_task_get_label_dsc(lv_draw_task_t * task);
/**
* Initialize a glyph draw descriptor.
@@ -128,8 +128,8 @@ void lv_draw_glyph_dsc_init(lv_draw_glyph_dsc_t * dsc);
* @param dsc pointer to draw descriptor
* @param coords coordinates of the character
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc,
- const lv_area_t * coords);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_label(lv_layer_t * layer, const lv_draw_label_dsc_t * dsc,
+ const lv_area_t * coords);
/**
* Crate a draw task to render a single character
@@ -138,8 +138,8 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_label(lv_layer_t * layer, const lv_draw_label
* @param point position of the label
* @param unicode_letter the letter to draw
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc,
- const lv_point_t * point, uint32_t unicode_letter);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_character(lv_layer_t * layer, lv_draw_label_dsc_t * dsc,
+ const lv_point_t * point, uint32_t unicode_letter);
/**
* Should be used during rendering the characters to get the position and other
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.c
index 759f9808d..f906699c1 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.c
@@ -35,7 +35,7 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(lv_draw_line_dsc_t));
dsc->width = 1;
@@ -43,7 +43,12 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc)
dsc->color = lv_color_black();
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc)
+lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_LINE ? (lv_draw_line_dsc_t *)task->draw_dsc : NULL;
+}
+
+void LV_ATTRIBUTE_FAST_MEM lv_draw_line(lv_layer_t * layer, const lv_draw_line_dsc_t * dsc)
{
LV_PROFILER_BEGIN;
lv_area_t a;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.h
index f7a95ea14..f070d0fe4 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_line.h
@@ -51,6 +51,13 @@ typedef struct {
*/
void lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc);
+/**
+ * Try to get a line draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_LINE
+ */
+lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task);
+
/**
* Create a line draw task
* @param layer pointer to a layer
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.c
index d470aeaff..ed1ff2b44 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.c
@@ -36,12 +36,17 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(lv_draw_mask_rect_dsc_t));
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc)
+lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_MASK_RECTANGLE ? (lv_draw_mask_rect_dsc_t *)task->draw_dsc : NULL;
+}
+
+void LV_ATTRIBUTE_FAST_MEM lv_draw_mask_rect(lv_layer_t * layer, const lv_draw_mask_rect_dsc_t * dsc)
{
if(!lv_color_format_has_alpha(layer->color_format)) {
LV_LOG_WARN("Only layers with alpha channel can be masked");
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.h
index 9c8af1b9b..6357647e9 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_mask.h
@@ -40,7 +40,14 @@ typedef struct {
* Initialize a rectangle mask draw descriptor.
* @param dsc pointer to a draw descriptor
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_rect_dsc_init(lv_draw_mask_rect_dsc_t * dsc);
+
+/**
+ * Try to get a rectangle mask draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_MASK_RECTANGLE
+ */
+lv_draw_mask_rect_dsc_t * lv_draw_task_get_mask_rect_dsc(lv_draw_task_t * task);
/**
* Create a draw task to mask a rectangle from the buffer
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.c
index a20c81c22..574d78a73 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.c
@@ -36,7 +36,7 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(lv_draw_rect_dsc_t));
dsc->bg_color = lv_color_white();
@@ -62,6 +62,11 @@ void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc)
dsc->base.dsc_size = sizeof(lv_draw_fill_dsc_t);
}
+lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_FILL ? (lv_draw_fill_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(*dsc));
@@ -70,6 +75,11 @@ void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc)
dsc->base.dsc_size = sizeof(lv_draw_border_dsc_t);
}
+lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_BORDER ? (lv_draw_border_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc)
{
lv_memzero(dsc, sizeof(*dsc));
@@ -77,6 +87,11 @@ void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc)
dsc->base.dsc_size = sizeof(lv_draw_box_shadow_dsc_t);
}
+lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_BOX_SHADOW ? (lv_draw_box_shadow_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_rect(lv_layer_t * layer, const lv_draw_rect_dsc_t * dsc, const lv_area_t * coords)
{
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.h
index bc1439f34..6fe3a82e7 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_rect.h
@@ -113,7 +113,7 @@ typedef struct {
* Initialize a rectangle draw descriptor.
* @param dsc pointer to a draw descriptor
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc);
/**
* Initialize a fill draw descriptor.
@@ -121,18 +121,39 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_rect_dsc_init(lv_draw_rect_dsc_t * dsc);
*/
void lv_draw_fill_dsc_init(lv_draw_fill_dsc_t * dsc);
+/**
+ * Try to get a fill draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_FILL
+ */
+lv_draw_fill_dsc_t * lv_draw_task_get_fill_dsc(lv_draw_task_t * task);
+
/**
* Initialize a border draw descriptor.
* @param dsc pointer to a draw descriptor
*/
void lv_draw_border_dsc_init(lv_draw_border_dsc_t * dsc);
+/**
+ * Try to get a border draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BORDER
+ */
+lv_draw_border_dsc_t * lv_draw_task_get_border_dsc(lv_draw_task_t * task);
+
/**
* Initialize a box shadow draw descriptor.
* @param dsc pointer to a draw descriptor
*/
void lv_draw_box_shadow_dsc_init(lv_draw_box_shadow_dsc_t * dsc);
+/**
+ * Try to get a box shadow draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_BOX_SHADOW
+ */
+lv_draw_box_shadow_dsc_t * lv_draw_task_get_box_shadow_dsc(lv_draw_task_t * task);
+
/**
* The rectangle is a wrapper for fill, border, bg. image and box shadow.
* Internally fill, border, image and box shadow draw tasks will be created.
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.c
index 86d236321..ae18968b5 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.c
@@ -49,6 +49,11 @@ void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc)
LV_PROFILER_END;
}
+lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task)
+{
+ return task->type == LV_DRAW_TASK_TYPE_TRIANGLE ? (lv_draw_triangle_dsc_t *)task->draw_dsc : NULL;
+}
+
void lv_draw_triangle(lv_layer_t * layer, const lv_draw_triangle_dsc_t * dsc)
{
LV_PROFILER_BEGIN;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.h
index 618908d4a..b825e5311 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_triangle.h
@@ -42,6 +42,13 @@ typedef struct {
*/
void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * draw_dsc);
+/**
+ * Try to get a triangle draw descriptor from a draw task.
+ * @param task draw task
+ * @return the task's draw descriptor or NULL if the task is not of type LV_DRAW_TASK_TYPE_TRIANGLE
+ */
+lv_draw_triangle_dsc_t * lv_draw_task_get_triangle_dsc(lv_draw_task_t * task);
+
/**
* Create a triangle draw task
* @param layer pointer to a layer
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.c
index 6873f25d7..5b8d66e99 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.c
@@ -14,6 +14,16 @@
#include "../stdlib/lv_string.h"
#include
#include
+#include
+
+#define MATH_PI 3.14159265358979323846f
+#define MATH_HALF_PI 1.57079632679489661923f
+
+#define DEG_TO_RAD 0.017453292519943295769236907684886f
+#define RAD_TO_DEG 57.295779513082320876798154814105f
+
+#define MATH_RADIANS(deg) ((deg) * DEG_TO_RAD)
+#define MATH_DEGRESS(rad) ((rad) * RAD_TO_DEG)
/*********************
* DEFINES
@@ -195,6 +205,24 @@ void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * m)
_multiply_matrix(matrix, m);
}
+void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point)
+{
+ float x = point->x;
+ float y = point->y;
+
+ point->x = x * matrix->m[0][0] + y * matrix->m[1][0] + matrix->m[0][2];
+ point->y = x * matrix->m[0][1] + y * matrix->m[1][1] + matrix->m[1][2];
+}
+
+void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path)
+{
+ lv_fpoint_t * pt = lv_array_front(&path->points);
+ uint32_t size = lv_array_size(&path->points);
+ for(uint32_t i = 0; i < size; i++) {
+ lv_matrix_transform_point(matrix, &pt[i]);
+ }
+}
+
/* path functions */
lv_vector_path_t * lv_vector_path_create(lv_vector_path_quality_t quality)
{
@@ -295,6 +323,36 @@ void lv_vector_path_close(lv_vector_path_t * path)
lv_array_push_back(&path->ops, &op);
}
+void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area)
+{
+ LV_ASSERT_NULL(path);
+ LV_ASSERT_NULL(area);
+
+ uint32_t len = lv_array_size(&path->points);
+ if(len == 0) {
+ lv_memzero(area, sizeof(lv_area_t));
+ return;
+ }
+
+ lv_fpoint_t * p = lv_array_front(&path->points);
+ float x1 = p[0].x;
+ float x2 = p[0].x;
+ float y1 = p[0].y;
+ float y2 = p[0].y;
+
+ for(uint32_t i = 1; i < len; i++) {
+ if(p[i].x < x1) x1 = p[i].x;
+ if(p[i].y < y1) y1 = p[i].y;
+ if(p[i].x > x2) x2 = p[i].x;
+ if(p[i].y > y2) y2 = p[i].y;
+ }
+
+ area->x1 = (int32_t)x1;
+ area->y1 = (int32_t)y1;
+ area->x2 = (int32_t)x2;
+ area->y2 = (int32_t)y2;
+}
+
void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect, float rx, float ry)
{
float x = rect->x1;
@@ -430,6 +488,87 @@ void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c
lv_vector_path_close(path);
}
+/**
+ * Add a arc to the path
+ * @param path pointer to a path
+ * @param c pointer to a `lv_fpoint_t` variable for center of the circle
+ * @param radius the radius for arc
+ * @param start_angle the start angle for arc
+ * @param sweep the sweep angle for arc, could be negative
+ * @param pie true: draw a pie, false: draw a arc
+ */
+void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle,
+ float sweep, bool pie)
+{
+ float cx = c->x;
+ float cy = c->y;
+
+ /* just circle */
+ if(sweep >= 360.0f || sweep <= -360.0f) {
+ lv_vector_path_append_circle(path, c, radius, radius);
+ return;
+ }
+
+ start_angle = MATH_RADIANS(start_angle);
+ sweep = MATH_RADIANS(sweep);
+
+ int n_curves = (int)ceil(fabsf(sweep / MATH_HALF_PI));
+ float sweep_sign = sweep < 0 ? -1.f : 1.f;
+ float fract = fmodf(sweep, MATH_HALF_PI);
+ fract = (fabsf(fract) < FLT_EPSILON) ? MATH_HALF_PI * sweep_sign : fract;
+
+ /* Start from here */
+ lv_fpoint_t start = {
+ .x = radius * cosf(start_angle),
+ .y = radius * sinf(start_angle),
+ };
+
+ if(pie) {
+ lv_vector_path_move_to(path, &(lv_fpoint_t) {
+ cx, cy
+ });
+ lv_vector_path_line_to(path, &(lv_fpoint_t) {
+ start.x + cx, start.y + cy
+ });
+ }
+
+ for(int i = 0; i < n_curves; ++i) {
+ float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract);
+ float end_x = radius * cosf(end_angle);
+ float end_y = radius * sinf(end_angle);
+
+ /* variables needed to calculate bezier control points */
+
+ /** get bezier control points using article:
+ * (http://itc.ktu.lt/index.php/ITC/article/view/11812/6479)
+ */
+ float ax = start.x;
+ float ay = start.y;
+ float bx = end_x;
+ float by = end_y;
+ float q1 = ax * ax + ay * ay;
+ float q2 = ax * bx + ay * by + q1;
+ float k2 = (4.0f / 3.0f) * ((sqrtf(2 * q1 * q2) - q2) / (ax * by - ay * bx));
+
+ /* Next start point is the current end point */
+ start.x = end_x;
+ start.y = end_y;
+
+ end_x += cx;
+ end_y += cy;
+
+ lv_fpoint_t ctrl1 = {ax - k2 * ay + cx, ay + k2 * ax + cy};
+ lv_fpoint_t ctrl2 = {bx + k2 * by + cx, by - k2 * bx + cy};
+ lv_fpoint_t end = {end_x, end_y};
+ lv_vector_path_cubic_to(path, &ctrl1, &ctrl2, &end);
+ start_angle = end_angle;
+ }
+
+ if(pie) {
+ lv_vector_path_close(path);
+ }
+}
+
void lv_vector_path_append_path(lv_vector_path_t * path, const lv_vector_path_t * subpath)
{
uint32_t ops_size = lv_array_size(&path->ops);
@@ -682,6 +821,7 @@ void lv_vector_clear_area(lv_vector_dsc_t * dsc, const lv_area_t * rect)
lv_memset(new_task, 0, sizeof(_lv_vector_draw_task));
new_task->dsc.fill_dsc.color = dsc->current_dsc.fill_dsc.color;
+ new_task->dsc.fill_dsc.opa = dsc->current_dsc.fill_dsc.opa;
lv_area_copy(&(new_task->dsc.scissor_area), rect);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.h
index a296c5a5c..675359d3d 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_vector.h
@@ -205,6 +205,20 @@ void lv_matrix_skew(lv_matrix_t * matrix, float skew_x, float skew_y);
*/
void lv_matrix_multiply(lv_matrix_t * matrix, const lv_matrix_t * matrix2);
+/**
+ * Transform the coordinates of a point using given matrix
+ * @param matrix pointer to a matrix
+ * @param point pointer to a point
+ */
+void lv_matrix_transform_point(const lv_matrix_t * matrix, lv_fpoint_t * point);
+
+/**
+ * Transform all the coordinates of a path using given matrix
+ * @param matrix pointer to a matrix
+ * @param path pointer to a path
+ */
+void lv_matrix_transform_path(const lv_matrix_t * matrix, lv_vector_path_t * path);
+
/**
* Create a vector graphic path object
* @param quality the quality hint of path
@@ -269,6 +283,13 @@ void lv_vector_path_cubic_to(lv_vector_path_t * path, const lv_fpoint_t * p1, co
*/
void lv_vector_path_close(lv_vector_path_t * path);
+/**
+ * Get the bounding box of a path
+ * @param path pointer to a path
+ * @param area pointer to a `lv_area_t` variable for bounding box
+ */
+void lv_vector_path_get_bounding(const lv_vector_path_t * path, lv_area_t * area);
+
/**
* Add a rectangle to the path
* @param path pointer to a path
@@ -287,6 +308,18 @@ void lv_vector_path_append_rect(lv_vector_path_t * path, const lv_area_t * rect,
*/
void lv_vector_path_append_circle(lv_vector_path_t * path, const lv_fpoint_t * c, float rx, float ry);
+/**
+ * Add a arc to the path
+ * @param path pointer to a path
+ * @param c pointer to a `lv_fpoint_t` variable for center of the circle
+ * @param radius the radius for arc
+ * @param start_angle the start angle for arc
+ * @param sweep the sweep angle for arc, could be negative
+ * @param pie true: draw a pie, false: draw a arc
+ */
+void lv_vector_path_append_arc(lv_vector_path_t * path, const lv_fpoint_t * c, float radius, float start_angle,
+ float sweep, bool pie);
+
/**
* Add an sub path to the path
* @param path pointer to a path
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.c
deleted file mode 100644
index 551c15db2..000000000
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * @file lv_image_buf.c
- *
- */
-
-/*********************
- * INCLUDES
- *********************/
-#include
-#include
-#include "lv_image_buf.h"
-#include "lv_draw_image.h"
-#include "../misc/lv_math.h"
-#include "../misc/lv_log.h"
-#include "../stdlib/lv_mem.h"
-#include "../stdlib/lv_string.h"
-
-/*********************
- * DEFINES
- *********************/
-
-/**********************
- * TYPEDEFS
- **********************/
-
-/**********************
- * STATIC PROTOTYPES
- **********************/
-
-/**********************
- * STATIC VARIABLES
- **********************/
-
-/**********************
- * MACROS
- **********************/
-
-/**********************
- * GLOBAL FUNCTIONS
- **********************/
-
-void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c)
-{
- if(dsc->header.cf < LV_COLOR_FORMAT_I1 || dsc->header.cf > LV_COLOR_FORMAT_I8) {
- LV_LOG_WARN("Not indexed color format");
- return;
- }
- uint8_t * buf = (uint8_t *)dsc->data;
- lv_memcpy(&buf[id * sizeof(c)], &c, sizeof(c));
-}
-
-void lv_image_buf_free(lv_image_dsc_t * dsc)
-{
- if(dsc != NULL) {
- if(dsc->data != NULL)
- lv_free((void *)dsc->data);
-
- lv_free(dsc);
- }
-}
-
-void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, uint16_t scale_x,
- uint16_t scale_y,
- const lv_point_t * pivot)
-{
- if(angle == 0 && scale_x == LV_SCALE_NONE && scale_y == LV_SCALE_NONE) {
- res->x1 = 0;
- res->y1 = 0;
- res->x2 = w - 1;
- res->y2 = h - 1;
- return;
- }
-
- lv_point_t p[4] = {
- {0, 0},
- {w, 0},
- {0, h},
- {w, h},
- };
- lv_point_transform(&p[0], angle, scale_x, scale_y, pivot, true);
- lv_point_transform(&p[1], angle, scale_x, scale_y, pivot, true);
- lv_point_transform(&p[2], angle, scale_x, scale_y, pivot, true);
- lv_point_transform(&p[3], angle, scale_x, scale_y, pivot, true);
- res->x1 = LV_MIN4(p[0].x, p[1].x, p[2].x, p[3].x);
- res->x2 = LV_MAX4(p[0].x, p[1].x, p[2].x, p[3].x) - 1;
- res->y1 = LV_MIN4(p[0].y, p[1].y, p[2].y, p[3].y);
- res->y2 = LV_MAX4(p[0].y, p[1].y, p[2].y, p[3].y) - 1;
-}
-
-/**********************
- * STATIC FUNCTIONS
- **********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.c
index 204edf994..c1d58558a 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.c
@@ -123,19 +123,19 @@ lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src
#if LV_CACHE_DEF_SIZE > 0
dsc->cache = img_cache_p;
- /*
- * Check the cache first
- * If the image is found in the cache, just return it.*/
- if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
+ /*Try cache first, unless we are told to ignore cache.*/
+ if(!(args && args->no_cache)) {
+ /*
+ * Check the cache first
+ * If the image is found in the cache, just return it.*/
+ if(try_cache(dsc) == LV_RESULT_OK) return LV_RESULT_OK;
+ }
#endif
/*Find the decoder that can open the image source, and get the header info in the same time.*/
dsc->decoder = image_decoder_get_info(src, &dsc->header);
if(dsc->decoder == NULL) return LV_RESULT_INVALID;
- /*Duplicate the source if it's a file*/
- if(dsc->src_type == LV_IMAGE_SRC_FILE) dsc->src = lv_strdup(dsc->src);
-
/*Make a copy of args*/
dsc->args = args ? *args : (lv_image_decoder_args_t) {
.stride_align = LV_DRAW_BUF_STRIDE_ALIGN != 1,
@@ -167,11 +167,6 @@ void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc)
{
if(dsc->decoder) {
if(dsc->decoder->close_cb) dsc->decoder->close_cb(dsc->decoder, dsc);
-
- if(dsc->src_type == LV_IMAGE_SRC_FILE) {
- lv_free((void *)dsc->src);
- dsc->src = NULL;
- }
}
}
@@ -264,13 +259,17 @@ lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_d
uint32_t stride_expect = lv_draw_buf_width_to_stride(decoded->header.w, decoded->header.cf);
if(decoded->header.stride != stride_expect) {
LV_LOG_TRACE("Stride mismatch");
- lv_draw_buf_t * aligned = lv_draw_buf_adjust_stride(decoded, stride_expect);
- if(aligned == NULL) {
- LV_LOG_ERROR("No memory for Stride adjust.");
- return NULL;
- }
+ lv_result_t res = lv_draw_buf_adjust_stride(decoded, stride_expect);
+ if(res != LV_RESULT_OK) {
+ lv_draw_buf_t * aligned = lv_draw_buf_create(decoded->header.w, decoded->header.h, decoded->header.cf, stride_expect);
+ if(aligned == NULL) {
+ LV_LOG_ERROR("No memory for Stride adjust.");
+ return NULL;
+ }
- decoded = aligned;
+ lv_draw_buf_copy(aligned, NULL, decoded, NULL);
+ decoded = aligned;
+ }
}
}
@@ -318,18 +317,20 @@ static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_he
lv_image_decoder_t * decoder;
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
- lv_image_header_cache_data_t search_key;
- search_key.src_type = src_type;
- search_key.src = src;
+ if(src_type == LV_IMAGE_SRC_FILE) {
+ lv_image_header_cache_data_t search_key;
+ search_key.src_type = src_type;
+ search_key.src = src;
- lv_cache_entry_t * entry = lv_cache_acquire(img_header_cache_p, &search_key, NULL);
+ lv_cache_entry_t * entry = lv_cache_acquire(img_header_cache_p, &search_key, NULL);
- if(entry) {
- lv_image_header_cache_data_t * cached_data = lv_cache_entry_get_data(entry);
- *header = cached_data->header;
- decoder = cached_data->decoder;
- lv_cache_release(img_header_cache_p, entry, NULL);
- return decoder;
+ if(entry) {
+ lv_image_header_cache_data_t * cached_data = lv_cache_entry_get_data(entry);
+ *header = cached_data->header;
+ decoder = cached_data->decoder;
+ lv_cache_release(img_header_cache_p, entry, NULL);
+ return decoder;
+ }
}
#endif
@@ -338,15 +339,21 @@ static lv_image_decoder_t * image_decoder_get_info(const void * src, lv_image_he
if(decoder->info_cb && decoder->open_cb) {
lv_result_t res = decoder->info_cb(decoder, src, header);
if(res == LV_RESULT_OK) {
- if(header->stride == 0) header->stride = img_width_to_stride(header);
+ if(header->stride == 0) {
+ LV_LOG_INFO("Image decoder didn't set stride. Calculate it from width.");
+ header->stride = img_width_to_stride(header);
+ }
break;
}
}
}
#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
- if(decoder) {
- if(src_type == LV_IMAGE_SRC_FILE) search_key.src = lv_strdup(src);
+ if(src_type == LV_IMAGE_SRC_FILE && decoder) {
+ lv_cache_entry_t * entry;
+ lv_image_header_cache_data_t search_key;
+ search_key.src_type = src_type;
+ search_key.src = lv_strdup(src);
search_key.decoder = decoder;
search_key.header = *header;
entry = lv_cache_add(img_header_cache_p, &search_key, NULL);
@@ -421,12 +428,23 @@ static lv_cache_compare_res_t image_decoder_cache_compare_cb(
static void image_decoder_cache_free_cb(lv_image_cache_data_t * entry, void * user_data)
{
- LV_UNUSED(user_data); /*Unused*/
-
const lv_image_decoder_t * decoder = entry->decoder;
- if(decoder && decoder->cache_free_cb) {
+ if(decoder == NULL) return; /* Why ? */
+
+ if(decoder->cache_free_cb) {
+ /* Decoder wants to free the cache by itself. */
decoder->cache_free_cb(entry, user_data);
}
+ else {
+ /* Destroy the decoded draw buffer if necessary. */
+ lv_draw_buf_t * decoded = (lv_draw_buf_t *)entry->decoded;
+ if(lv_draw_buf_has_flag(decoded, LV_IMAGE_FLAGS_ALLOCATED)) {
+ lv_draw_buf_destroy(decoded);
+ }
+
+ /*Free the duplicated file name*/
+ if(entry->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)entry->src);
+ }
}
static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc)
@@ -442,6 +460,7 @@ static lv_result_t try_cache(lv_image_decoder_dsc_t * dsc)
if(entry) {
lv_image_cache_data_t * cached_data = lv_cache_entry_get_data(entry);
dsc->decoded = cached_data->decoded;
+ dsc->decoder = (lv_image_decoder_t *)cached_data->decoder;
dsc->cache_entry = entry; /*Save the cache to release it in decoder_close*/
return LV_RESULT_OK;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.h
index 2979f08fc..d446eacdf 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_decoder.h
@@ -61,7 +61,7 @@ typedef struct _lv_image_decoder_dsc_t lv_image_decoder_dsc_t;
typedef struct _lv_image_decoder_args_t {
bool stride_align; /*Whether stride should be aligned*/
bool premultiply; /*Whether image should be premultiplied or not after decoding*/
- bool no_cache; /*Whether this image should be kept out of cache*/
+ bool no_cache; /*When set, decoded image won't be put to cache, and decoder open will also ignore cache.*/
bool use_indexed; /*Decoded indexed image as is. Convert to ARGB8888 if false.*/
} lv_image_decoder_args_t;
@@ -278,6 +278,15 @@ void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_dec
*/
void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb);
+/**
+ * Set a custom method to free cache data.
+ * Normally this is not needed. If the custom decoder allocates additional memory other than dsc->decoded
+ * draw buffer, then you need to register your own method to free it. By default the cache entry is free'ed
+ * in `image_decoder_cache_free_cb`.
+ *
+ * @param decoder pointer to the image decoder
+ * @param cache_free_cb the custom callback to free cache data. Refer to `image_decoder_cache_free_cb`.
+ */
void lv_image_decoder_set_cache_free_cb(lv_image_decoder_t * decoder, lv_cache_free_cb_t cache_free_cb);
#if LV_CACHE_DEF_SIZE > 0
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.h b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_dsc.h
similarity index 50%
rename from lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.h
rename to lib/libesp32_lvgl/lvgl/src/draw/lv_image_dsc.h
index 4c74ceef4..68c123ea3 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/lv_image_buf.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_image_dsc.h
@@ -1,5 +1,5 @@
/**
- * @file lv_image_buf.h
+ * @file lv_image_dsc.h
*
*/
@@ -13,21 +13,17 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include
-#include "../misc/lv_color.h"
-#include "../misc/lv_area.h"
-#include "../stdlib/lv_string.h"
+#include "../lv_conf_internal.h"
/*********************
* DEFINES
*********************/
-#define _LV_ZOOM_INV_UPSCALE 5
-
/** Magic number for lvgl image, 9 means lvgl version 9
* It must not be a valid ASCII character nor larger than 0x80. See `lv_image_src_get_type`.
*/
#define LV_IMAGE_HEADER_MAGIC (0x19)
+LV_EXPORT_CONST_INT(LV_IMAGE_HEADER_MAGIC);
/**********************
* TYPEDEFS
@@ -38,43 +34,38 @@ typedef enum _lv_image_flags_t {
* For RGB map of the image data, mark if it's pre-multiplied with alpha.
* For indexed image, this bit indicated palette data is pre-multiplied with alpha.
*/
- LV_IMAGE_FLAGS_PREMULTIPLIED = (1 << 0),
-
- /**
- * If the image data is malloced and can be processed in place.
- * In image decoder post processing, this flag means we modify it in-place.
- */
- LV_IMAGE_FLAGS_MODIFIABLE = (1 << 1),
-
- /**
- * Indicating it's a vector image instead of default raster image.
- * Some of the flags are not usable for vector image, like PREMULTIPLIED.
- */
- LV_IMAGE_FLAGS_VECTORS = (1 << 2),
-
+ LV_IMAGE_FLAGS_PREMULTIPLIED = 0x0001,
/**
* The image data is compressed, so decoder needs to decode image firstly.
* If this flag is set, the whole image will be decompressed upon decode, and
* `get_area_cb` won't be necessary.
*/
- LV_IMAGE_FLAGS_COMPRESSED = (1 << 3),
+ LV_IMAGE_FLAGS_COMPRESSED = 0x0008,
+
+ /*Below flags are applicable only for draw buffer header.*/
/**
* The image is allocated from heap, thus should be freed after use.
*/
- LV_IMAGE_FLAGS_ALLOCATED = (1 << 4),
+ LV_IMAGE_FLAGS_ALLOCATED = 0x0010,
+
+ /**
+ * If the image data is malloced and can be processed in place.
+ * In image decoder post processing, this flag means we modify it in-place.
+ */
+ LV_IMAGE_FLAGS_MODIFIABLE = 0x0020,
/**
* Flags reserved for user, lvgl won't use these bits.
*/
- LV_IMAGE_FLAGS_USER1 = 0x1000,
- LV_IMAGE_FLAGS_USER2 = 0x2000,
- LV_IMAGE_FLAGS_USER3 = 0x4000,
- LV_IMAGE_FLAGS_USER4 = 0x8000,
- LV_IMAGE_FLAGS_USER5 = 0x0100,
- LV_IMAGE_FLAGS_USER6 = 0x0200,
- LV_IMAGE_FLAGS_USER7 = 0x0400,
- LV_IMAGE_FLAGS_USER8 = 0x0800,
+ LV_IMAGE_FLAGS_USER1 = 0x0100,
+ LV_IMAGE_FLAGS_USER2 = 0x0200,
+ LV_IMAGE_FLAGS_USER3 = 0x0400,
+ LV_IMAGE_FLAGS_USER4 = 0x0800,
+ LV_IMAGE_FLAGS_USER5 = 0x1000,
+ LV_IMAGE_FLAGS_USER6 = 0x2000,
+ LV_IMAGE_FLAGS_USER7 = 0x4000,
+ LV_IMAGE_FLAGS_USER8 = 0x8000,
} lv_image_flags_t;
typedef enum {
@@ -125,65 +116,20 @@ typedef union {
} lv_yuv_buf_t;
/**
- * Struct to describe an image. Both decoded and raw image can share
- * the same struct.
- *
- * Image is also identical to lv_draw_buf_t for now.
- * Ideally, decoded image should be lv_draw_buf_t.
+ * Struct to describe a constant image resource.
+ * It's similar to lv_draw_buf_t, but the data is constant.
*/
typedef struct {
- lv_image_header_t header; /**< A header describing the basics of the image*/
- uint32_t data_size; /**< Size of the image in bytes*/
- const uint8_t * data; /**< Pointer to the data of the image*/
+ lv_image_header_t header; /**< A header describing the basics of the image*/
+ uint32_t data_size; /**< Size of the image in bytes*/
+ const uint8_t * data; /**< Pointer to the data of the image*/
+ const void * reserved; /**< A reserved field to make it has same size as lv_draw_buf_t*/
} lv_image_dsc_t;
/**********************
* GLOBAL PROTOTYPES
**********************/
-/**
- * Set the palette color of an indexed image. Valid only for `LV_COLOR_FORMAT_I1/2/4/8`
- * @param dsc pointer to an image descriptor
- * @param id the palette color to set:
- * - for `LV_COLOR_FORMAT_I1`: 0..1
- * - for `LV_COLOR_FORMAT_I2`: 0..3
- * - for `LV_COLOR_FORMAT_I4`: 0..15
- * - for `LV_COLOR_FORMAT_I8`: 0..255
- * @param c the color to set in lv_color32_t format
- */
-void lv_image_buf_set_palette(lv_image_dsc_t * dsc, uint8_t id, lv_color32_t c);
-
-/**
- * Free an allocated image buffer
- * @param dsc image buffer to free
- */
-void lv_image_buf_free(lv_image_dsc_t * dsc);
-
-/**
- * Get the area of a rectangle if its rotated and scaled
- * @param res store the coordinates here
- * @param w width of the rectangle to transform
- * @param h height of the rectangle to transform
- * @param angle angle of rotation
- * @param scale_x zoom in x direction, (256 no zoom)
- * @param scale_y zoom in y direction, (256 no zoom)
- * @param pivot x,y pivot coordinates of rotation
- */
-void _lv_image_buf_get_transformed_area(lv_area_t * res, int32_t w, int32_t h, int32_t angle, uint16_t scale_x,
- uint16_t scale_y,
- const lv_point_t * pivot);
-
-static inline void lv_image_header_init(lv_image_header_t * header, uint32_t w, uint32_t h, lv_color_format_t cf,
- uint32_t stride, lv_image_flags_t flags)
-{
- LV_ASSERT(header);
- lv_memzero(header, sizeof(*header));
- header->w = w;
- header->h = h;
- header->cf = cf;
- header->stride = stride;
- header->flags = flags;
-}
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c
index 7ba894e12..12b37de95 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_buf_pxp.c
@@ -33,7 +33,7 @@
* STATIC PROTOTYPES
**********************/
-static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area);
+static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area);
/**********************
* STATIC VARIABLES
@@ -58,17 +58,21 @@ void lv_draw_buf_pxp_init_handlers(void)
* STATIC FUNCTIONS
**********************/
-static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area)
+static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area)
{
+ const lv_image_header_t * header = &draw_buf->header;
+ uint32_t stride = header->stride;
+ lv_color_format_t cf = header->cf;
+
if(area->y1 == 0) {
uint16_t size = stride * lv_area_get_height(area);
/* Invalidate full buffer. */
- DEMO_CleanInvalidateCacheByAddr((void *)buf, size);
+ DCACHE_CleanInvalidateByRange((uint32_t)draw_buf->data, size);
return;
}
- const uint8_t * buf_u8 = buf;
+ const uint8_t * buf_u8 = draw_buf->data;
/* ARM require a 32 byte aligned address. */
uint8_t align_bytes = 32;
uint8_t bits_per_pixel = lv_color_format_get_bpp(cf);
@@ -99,7 +103,7 @@ static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf,
for(uint16_t y = 0; y < area_height; y++) {
const void * line_addr = buf_u8 + y * stride;
- DEMO_CleanInvalidateCacheByAddr((void *)line_addr, line_size);
+ DCACHE_CleanInvalidateByRange((uint32_t)line_addr, line_size);
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c
index 3bd0c8ba4..b8fd14cd8 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c
@@ -380,7 +380,7 @@ static void _pxp_execute_drawing(lv_draw_pxp_unit_t * u)
lv_area_move(&draw_area, -layer->buf_area.x1, -layer->buf_area.y1);
/* Invalidate only the drawing area */
- lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &draw_area);
+ lv_draw_buf_invalidate_cache(draw_buf, &draw_area);
switch(t->type) {
case LV_DRAW_TASK_TYPE_FILL:
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c
index ee474d721..28245f964 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_layer.c
@@ -68,7 +68,7 @@ void lv_draw_pxp_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * d
.x2 = draw_buf->header.w - 1,
.y2 = draw_buf->header.h - 1
};
- lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &area_to_draw);
+ lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw);
lv_draw_image_dsc_t new_draw_dsc = *draw_dsc;
new_draw_dsc.src = draw_buf;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c
index 393c9a6b2..dafb0156b 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_buf_vglite.c
@@ -37,7 +37,7 @@ static void * _buf_malloc(size_t size_bytes, lv_color_format_t cf);
static void * _buf_align(void * buf, lv_color_format_t cf);
-static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area);
+static void _invalidate_cache(const void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area);
static uint32_t _width_to_stride(uint32_t w, lv_color_format_t cf);
@@ -90,8 +90,12 @@ static void * _buf_align(void * buf, lv_color_format_t cf)
return buf_u8;
}
-static void _invalidate_cache(void * buf, uint32_t stride, lv_color_format_t cf, const lv_area_t * area)
+static void _invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area)
{
+ const lv_image_header_t * header = &draw_buf->header;
+ uint32_t stride = header->stride;
+ lv_color_format_t cf = header->cf;
+
if(area->y1 == 0) {
uint16_t size = stride * lv_area_get_height(area);
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c
index f701f6800..d4c951728 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c
@@ -228,7 +228,15 @@ static int32_t _vglite_evaluate(lv_draw_unit_t * u, lv_draw_task_t * t)
const lv_draw_image_dsc_t * draw_dsc = (lv_draw_image_dsc_t *) t->draw_dsc;
lv_layer_t * layer_to_draw = (lv_layer_t *)draw_dsc->src;
- if(!_vglite_src_cf_supported(layer_to_draw->color_format))
+#if LV_USE_VGLITE_BLIT_SPLIT
+ bool has_transform = (draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE ||
+ draw_dsc->scale_y != LV_SCALE_NONE);
+#endif
+ if(!_vglite_src_cf_supported(layer_to_draw->color_format)
+#if LV_USE_VGLITE_BLIT_SPLIT
+ || has_transform
+#endif
+ )
return 0;
if(t->preference_score > 80) {
@@ -352,10 +360,13 @@ static void _vglite_execute_drawing(lv_draw_vglite_unit_t * u)
return; /*Fully clipped, nothing to do*/
/* Invalidate the drawing area */
- lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &draw_area);
+ lv_draw_buf_invalidate_cache(draw_buf, &draw_area);
- /* Set scissor area */
- vglite_set_scissor(&clip_area);
+ /* Set scissor area, excluding the split blit case */
+#if LV_USE_VGLITE_BLIT_SPLIT
+ if(t->type != LV_DRAW_TASK_TYPE_IMAGE || t->type != LV_DRAW_TASK_TYPE_LAYER)
+#endif
+ vglite_set_scissor(&clip_area);
switch(t->type) {
case LV_DRAW_TASK_TYPE_LABEL:
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c
index b35d2c74a..6b0d4fe55 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c
@@ -573,8 +573,7 @@ static void _vglite_draw_arc(const lv_point_t * center, const lv_area_t * clip_a
bool donut = ((end_angle - start_angle) % 360 == 0) ? true : false;
vg_lite_buffer_t * vgbuf = vglite_get_dest_buf();
- /* path: max size = 16 cubic bezier (7 words each) */
- int32_t arc_path[16 * 7];
+ int32_t arc_path[ARC_PATH_DATA_MAX_SIZE];
lv_memzero(arc_path, sizeof(arc_path));
/*** Init path ***/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c
index 6dacad88b..b7ee0560c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_img.c
@@ -19,6 +19,7 @@
#include "lv_vglite_buf.h"
#include "lv_vglite_matrix.h"
#include "lv_vglite_utils.h"
+#include "lv_vglite_path.h"
#include "../../../misc/lv_log.h"
@@ -57,18 +58,6 @@
* STATIC PROTOTYPES
**********************/
-/**
- * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects.
- * By default, image is copied directly, with optional opacity.
- *
- * @param[in] dest_area Destination area with relative coordinates to dest buffer
- * @param[in] src_area Source area with relative coordinates to src buffer
- * @param[in] dsc Image descriptor
- *
- */
-static void _vglite_blit_single(const lv_area_t * dest_area, const lv_area_t * src_area,
- const lv_draw_image_dsc_t * dsc);
-
#if LV_USE_VGLITE_BLIT_SPLIT
/**
* Move buffer pointer as close as possible to area, but with respect to alignment requirements.
@@ -98,19 +87,31 @@ static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stri
static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t dest_stride, lv_color_format_t dest_cf,
const void * src_buf, lv_area_t * src_area, uint32_t src_stride, lv_color_format_t src_cf,
const lv_draw_image_dsc_t * dsc);
-#else
+#endif /*LV_USE_VGLITE_BLIT_SPLIT*/
+
/**
- * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation.
- * By default, image is copied directly, with optional opacity.
+ * VGlite blit - fill a path with an image pattern
+ *
+ *
+ * @param[in] dest_area Destination area with relative coordinates to dest buffer
+ * @param[in] clip_area Clip area with relative coordinates to dest buff
+ * @param[in] coords Coordinates of the image (relative to dest buff)
+ * @param[in] dsc Image descriptor
+ *
+ */
+static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords,
+ const lv_draw_image_dsc_t * dsc);
+
+/**
+ * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with or without effects.
*
- * @param[in] dest_area Area with relative coordinates to dest buffer
* @param[in] src_area Source area with relative coordinates to src buffer
* @param[in] dsc Image descriptor
*
*/
-static void _vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * src_area,
- const lv_draw_image_dsc_t * dsc);
-#endif /*LV_USE_VGLITE_BLIT_SPLIT*/
+static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t * dsc);
+
+static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc);
/**********************
* STATIC VARIABLES
@@ -160,7 +161,7 @@ void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
uint32_t src_stride = img_dsc->header.stride;
/* Set src_vgbuf structure. */
- vglite_set_src_buf(src_buf, lv_area_get_width(&src_area), lv_area_get_height(&src_area), src_stride, src_cf);
+ vglite_set_src_buf(src_buf, img_dsc->header.w, img_dsc->header.h, src_stride, src_cf);
#if LV_USE_VGLITE_BLIT_SPLIT
void * dest_buf = layer->draw_buf->data;
@@ -171,10 +172,12 @@ void lv_draw_vglite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
_vglite_blit_split(dest_buf, &blend_area, dest_stride, dest_cf,
src_buf, &src_area, src_stride, src_cf, dsc);
#else
- if(has_transform)
- _vglite_blit_transform(&blend_area, &src_area, dsc);
+ vglite_set_transformation_matrix(&blend_area, dsc);
+ bool is_tiled = dsc->tile;
+ if(is_tiled)
+ _vglite_draw_pattern(&clip_area, &relative_coords, dsc);
else
- _vglite_blit_single(&blend_area, &src_area, dsc);
+ _vglite_blit(&src_area, dsc);
#endif /*LV_USE_VGLITE_BLIT_SPLIT*/
}
@@ -196,23 +199,7 @@ static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t *
src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
- lv_color_t color;
- lv_opa_t opa;
-
- bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN);
- if(has_recolor) {
- color = dsc->recolor;
- opa = LV_OPA_MIX2(dsc->recolor_opa, dsc->opa);
- }
- else {
- color.red = 0xFF;
- color.green = 0xFF;
- color.blue = 0xFF;
- opa = dsc->opa;
- }
-
- lv_color32_t col32 = lv_color_to_32(color, opa);
- vg_lite_color_t vgcol = vglite_get_color(col32, false);
+ vg_lite_color_t vgcol = _vglite_recolor(dsc);
vg_lite_matrix_t * vgmatrix = vglite_get_matrix();
vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode);
@@ -222,16 +209,6 @@ static void _vglite_blit(const lv_area_t * src_area, const lv_draw_image_dsc_t *
vglite_run();
}
-static void _vglite_blit_single(const lv_area_t * dest_area, const lv_area_t * src_area,
- const lv_draw_image_dsc_t * dsc)
-{
- /* Set vgmatrix. */
- vglite_set_translation_matrix(dest_area);
-
- /* Start blit. */
- _vglite_blit(src_area, dsc);
-}
-
#if LV_USE_VGLITE_BLIT_SPLIT
static void _move_buf_close_to_area(void ** buf, lv_area_t * area, uint32_t stride, lv_color_format_t cf)
{
@@ -276,6 +253,9 @@ static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t
_move_buf_close_to_area((void **)&src_buf, src_area, src_stride, src_cf);
_move_buf_close_to_area(&dest_buf, dest_area, dest_stride, dest_cf);
+ /* Set clip area */
+ vglite_set_scissor(dest_area);
+
/* If we're in limit, do a single BLIT */
if((src_area->x2 < VGLITE_BLIT_SPLIT_THR) &&
(src_area->y2 < VGLITE_BLIT_SPLIT_THR)) {
@@ -284,7 +264,8 @@ static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t
vglite_set_dest_buf_ptr(dest_buf);
vglite_set_src_buf_ptr(src_buf);
- _vglite_blit_single(dest_area, src_area, dsc);
+ vglite_set_transformation_matrix(dest_area, dsc);
+ _vglite_blit(src_area, dsc);
VGLITE_TRACE("Single "
"Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
@@ -295,6 +276,8 @@ static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t
lv_area_get_width(src_area), lv_area_get_height(src_area),
lv_area_get_width(dest_area), lv_area_get_height(dest_area),
(uintptr_t)src_buf, (uintptr_t)dest_buf);
+
+ return;
};
/* Split the BLIT into multiple tiles */
@@ -371,7 +354,8 @@ static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t
vglite_set_dest_buf_ptr(tile_dest_buf);
vglite_set_src_buf_ptr(tile_src_buf);
- _vglite_blit_single(&tile_dest_area, &tile_src_area, dsc);
+ vglite_set_transformation_matrix(&tile_dest_area, dsc);
+ _vglite_blit(&tile_src_area, dsc);
VGLITE_TRACE("Tile [%d, %d] "
"Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | "
@@ -386,16 +370,72 @@ static void _vglite_blit_split(void * dest_buf, lv_area_t * dest_area, uint32_t
}
}
}
-#else
-static void _vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * src_area,
- const lv_draw_image_dsc_t * dsc)
-{
- /* Set vgmatrix. */
- vglite_set_transformation_matrix(dest_area, dsc);
-
- /* Start blit. */
- _vglite_blit(src_area, dsc);
-}
#endif /*LV_USE_VGLITE_BLIT_SPLIT*/
+static void _vglite_draw_pattern(const lv_area_t * clip_area, const lv_area_t * coords,
+ const lv_draw_image_dsc_t * dsc)
+{
+ /* Target buffer */
+ vg_lite_buffer_t * dst_vgbuf = vglite_get_dest_buf();
+
+ /* Path to draw */
+ int32_t path_data[RECT_PATH_DATA_MAX_SIZE];
+ uint32_t path_data_size;
+ vglite_create_rect_path_data(path_data, &path_data_size, 0, coords);
+ vg_lite_quality_t path_quality = VG_LITE_MEDIUM;
+
+ vg_lite_path_t path;
+ VGLITE_CHECK_ERROR(vg_lite_init_path(&path, VG_LITE_S32, path_quality, path_data_size, path_data,
+ (vg_lite_float_t)clip_area->x1, (vg_lite_float_t)clip_area->y1,
+ ((vg_lite_float_t)clip_area->x2) + 1.0f, ((vg_lite_float_t)clip_area->y2) + 1.0f));
+
+ /* Path Matrix */
+ vg_lite_matrix_t path_matrix;
+ vg_lite_identity(&path_matrix);
+
+ /* Pattern Image */
+ vg_lite_buffer_t * src_vgbuf = vglite_get_src_buf();
+ src_vgbuf->image_mode = VG_LITE_MULTIPLY_IMAGE_MODE;
+ src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT;
+
+ /* Pattern matrix */
+ vg_lite_matrix_t * vgmatrix = vglite_get_matrix();
+
+ /* Blend mode */
+ vg_lite_blend_t vgblend = vglite_get_blend_mode(dsc->blend_mode);
+
+ vg_lite_color_t vgcol = _vglite_recolor(dsc);
+
+ /* Filter */
+ bool has_trasform = (dsc->rotation != 0 || dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE);
+ vg_lite_filter_t filter = has_trasform ? VG_LITE_FILTER_BI_LINEAR : VG_LITE_FILTER_POINT;
+
+ /* Draw Pattern */
+ VGLITE_CHECK_ERROR(vg_lite_draw_pattern(dst_vgbuf, &path, VG_LITE_FILL_NON_ZERO, &path_matrix,
+ src_vgbuf, vgmatrix, vgblend, VG_LITE_PATTERN_REPEAT,
+ 0, vgcol, filter));
+}
+
+static vg_lite_color_t _vglite_recolor(const lv_draw_image_dsc_t * dsc)
+{
+ lv_color_t color;
+ lv_opa_t opa;
+
+ bool has_recolor = (dsc->recolor_opa > LV_OPA_MIN);
+ if(has_recolor) {
+ color = dsc->recolor;
+ opa = LV_OPA_MIX2(dsc->recolor_opa, dsc->opa);
+ }
+ else {
+ color.red = 0xFF;
+ color.green = 0xFF;
+ color.blue = 0xFF;
+ opa = dsc->opa;
+ }
+
+ lv_color32_t col32 = lv_color_to_32(color, opa);
+
+ return vglite_get_color(col32, false);
+}
+
#endif /*LV_USE_DRAW_VGLITE*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c
index 587f55f79..9c9dbe4a9 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_label.c
@@ -79,73 +79,81 @@ static void _draw_vglite_letter(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t
lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area)
{
if(glyph_draw_dsc) {
- if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_INVALID) {
+ switch(glyph_draw_dsc->format) {
+
+ case LV_FONT_GLYPH_FORMAT_NONE: {
#if LV_USE_FONT_PLACEHOLDER
- /* Draw a placeholder rectangle*/
- lv_draw_border_dsc_t border_draw_dsc;
- lv_draw_border_dsc_init(&border_draw_dsc);
- border_draw_dsc.opa = glyph_draw_dsc->opa;
- border_draw_dsc.color = glyph_draw_dsc->color;
- border_draw_dsc.width = 1;
- lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
+ /* Draw a placeholder rectangle*/
+ lv_draw_border_dsc_t border_draw_dsc;
+ lv_draw_border_dsc_init(&border_draw_dsc);
+ border_draw_dsc.opa = glyph_draw_dsc->opa;
+ border_draw_dsc.color = glyph_draw_dsc->color;
+ border_draw_dsc.width = 1;
+ lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
#endif
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_A8) {
- /*Do not draw transparent things*/
- if(glyph_draw_dsc->opa <= LV_OPA_MIN)
- return;
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: {
+ /*Do not draw transparent things*/
+ if(glyph_draw_dsc->opa <= LV_OPA_MIN)
+ return;
- lv_layer_t * layer = draw_unit->target_layer;
+ lv_layer_t * layer = draw_unit->target_layer;
- lv_area_t blend_area;
- if(!_lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area))
- return;
- lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1);
+ lv_area_t blend_area;
+ if(!_lv_area_intersect(&blend_area, glyph_draw_dsc->letter_coords, draw_unit->clip_area))
+ return;
+ lv_area_move(&blend_area, -layer->buf_area.x1, -layer->buf_area.y1);
- const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
- const void * mask_buf = draw_buf->data;
+ const lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
+ const void * mask_buf = draw_buf->data;
- uint32_t mask_width = lv_area_get_width(glyph_draw_dsc->letter_coords);
- uint32_t mask_height = lv_area_get_height(glyph_draw_dsc->letter_coords);
- uint32_t mask_stride = draw_buf->header.stride;
+ uint32_t mask_width = lv_area_get_width(glyph_draw_dsc->letter_coords);
+ uint32_t mask_height = lv_area_get_height(glyph_draw_dsc->letter_coords);
+ uint32_t mask_stride = draw_buf->header.stride;
- lv_area_t mask_area;
- mask_area.x1 = blend_area.x1 - (glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1);
- mask_area.y1 = blend_area.y1 - (glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1);
- mask_area.x2 = mask_width - 1;
- mask_area.y2 = mask_height - 1;
+ lv_area_t mask_area;
+ mask_area.x1 = blend_area.x1 - (glyph_draw_dsc->letter_coords->x1 - layer->buf_area.x1);
+ mask_area.y1 = blend_area.y1 - (glyph_draw_dsc->letter_coords->y1 - layer->buf_area.y1);
+ mask_area.x2 = mask_width - 1;
+ mask_area.y2 = mask_height - 1;
- if(!vglite_buf_aligned(mask_buf, mask_stride, LV_COLOR_FORMAT_A8)) {
- /* Draw a placeholder rectangle*/
- lv_draw_border_dsc_t border_draw_dsc;
- lv_draw_border_dsc_init(&border_draw_dsc);
- border_draw_dsc.opa = glyph_draw_dsc->opa;
- border_draw_dsc.color = glyph_draw_dsc->color;
- border_draw_dsc.width = 1;
- lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
- }
- else {
- /* Set src_vgbuf structure. */
- vglite_set_src_buf(mask_buf, mask_width, mask_height, mask_stride, LV_COLOR_FORMAT_A8);
+ if(!vglite_buf_aligned(mask_buf, mask_stride, LV_COLOR_FORMAT_A8)) {
+ /* Draw a placeholder rectangle*/
+ lv_draw_border_dsc_t border_draw_dsc;
+ lv_draw_border_dsc_init(&border_draw_dsc);
+ border_draw_dsc.opa = glyph_draw_dsc->opa;
+ border_draw_dsc.color = glyph_draw_dsc->color;
+ border_draw_dsc.width = 1;
+ lv_draw_vglite_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
+ }
+ else {
+ /* Set src_vgbuf structure. */
+ vglite_set_src_buf(mask_buf, mask_width, mask_height, mask_stride, LV_COLOR_FORMAT_A8);
- /* Set vgmatrix. */
- vglite_set_translation_matrix(&blend_area);
+ /* Set vgmatrix. */
+ vglite_set_translation_matrix(&blend_area);
- lv_draw_buf_invalidate_cache((void *)mask_buf, mask_stride, LV_COLOR_FORMAT_A8, &mask_area);
+ lv_draw_buf_invalidate_cache(draw_buf, &mask_area);
- _vglite_draw_letter(&mask_area, glyph_draw_dsc->color, glyph_draw_dsc->opa);
- }
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE) {
+ _vglite_draw_letter(&mask_area, glyph_draw_dsc->color, glyph_draw_dsc->opa);
+ }
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_IMAGE: {
#if LV_USE_IMGFONT
- lv_draw_img_dsc_t img_dsc;
- lv_draw_img_dsc_init(&img_dsc);
- img_dsc.angle = 0;
- img_dsc.zoom = LV_ZOOM_NONE;
- img_dsc.opa = glyph_draw_dsc->opa;
- img_dsc.src = glyph_draw_dsc->glyph_data;
- lv_draw_vglite_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
+ lv_draw_img_dsc_t img_dsc;
+ lv_draw_img_dsc_init(&img_dsc);
+ img_dsc.angle = 0;
+ img_dsc.zoom = LV_ZOOM_NONE;
+ img_dsc.opa = glyph_draw_dsc->opa;
+ img_dsc.src = glyph_draw_dsc->glyph_data;
+ lv_draw_vglite_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
#endif
+ }
+ break;
+ default:
+ break;
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c
index 3a46a142c..65283d0e2 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_layer.c
@@ -68,7 +68,7 @@ void lv_draw_vglite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
.x2 = draw_buf->header.w - 1,
.y2 = draw_buf->header.h - 1
};
- lv_draw_buf_invalidate_cache(draw_buf->data, draw_buf->header.stride, draw_buf->header.cf, &area_to_draw);
+ lv_draw_buf_invalidate_cache(draw_buf, &area_to_draw);
lv_draw_image_dsc_t new_draw_dsc = *draw_dsc;
new_draw_dsc.src = draw_buf;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c
index 3076c6c91..0594b53dc 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_matrix.c
@@ -61,15 +61,17 @@ void vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw
bool has_scale = (dsc->scale_x != LV_SCALE_NONE || dsc->scale_y != LV_SCALE_NONE);
bool has_rotation = (dsc->rotation != 0);
- vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &_vgmatrix);
- if(has_rotation)
- vg_lite_rotate(dsc->rotation / 10.0f, &_vgmatrix); /* angle is 1/10 degree */
- if(has_scale) {
- vg_lite_float_t scale_x = 1.0f * dsc->scale_x / LV_SCALE_NONE;
- vg_lite_float_t scale_y = 1.0f * dsc->scale_y / LV_SCALE_NONE;
- vg_lite_scale(scale_x, scale_y, &_vgmatrix);
+ if(has_scale || has_rotation) {
+ vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &_vgmatrix);
+ if(has_rotation)
+ vg_lite_rotate(dsc->rotation / 10.0f, &_vgmatrix); /* angle is 1/10 degree */
+ if(has_scale) {
+ vg_lite_float_t scale_x = 1.0f * dsc->scale_x / LV_SCALE_NONE;
+ vg_lite_float_t scale_y = 1.0f * dsc->scale_y / LV_SCALE_NONE;
+ vg_lite_scale(scale_x, scale_y, &_vgmatrix);
+ }
+ vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &_vgmatrix);
}
- vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &_vgmatrix);
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_path.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_path.h
index 6c92e50e6..f38593aeb 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_path.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_path.h
@@ -47,8 +47,14 @@ extern "C" {
* - 4 cubics for the corners
* - 4 lines for the sides
* - 1 end for the path end */
-#define RECT_PATH_DATA_MAX_SIZE 1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE
+#define RECT_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 4 * CUBIC_PATH_DATA_SIZE + 4 * LINE_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE)
+/* Maximum possible arc path size
+ * is in the rounded arc case:
+ * - 1 move for the path start
+ * - 16 cubics for the arc (5 inner, 5 outer) and corners (3 per corner)
+ * - 1 end for the path end */
+#define ARC_PATH_DATA_MAX_SIZE (1 * MOVE_PATH_DATA_SIZE + 16 * CUBIC_PATH_DATA_SIZE + 1 * END_PATH_DATA_SIZE)
/**********************
* TYPEDEFS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c b/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c
index 029a1b5a2..1d5a796d6 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d.c
@@ -28,10 +28,9 @@
static void execute_drawing(lv_draw_dave2d_unit_t * u);
#if defined(RENESAS_CORTEX_M85)
-#if (BSP_CFG_DCACHE_ENABLED)
-static void _dave2d_buf_invalidate_cache_cb(void * buf, uint32_t stride, lv_color_format_t color_format,
- const lv_area_t * area);
-#endif
+ #if (BSP_CFG_DCACHE_ENABLED)
+ static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area);
+ #endif
#endif
static int32_t _dave2d_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task);
@@ -123,12 +122,15 @@ static void lv_draw_buf_dave2d_init_handlers(void)
#if defined(RENESAS_CORTEX_M85)
#if (BSP_CFG_DCACHE_ENABLED)
-static void _dave2d_buf_invalidate_cache_cb(void * buf, uint32_t stride, lv_color_format_t color_format,
- const lv_area_t * area)
+static void _dave2d_buf_invalidate_cache_cb(const lv_draw_buf_t * draw_buf, const lv_area_t * area)
{
- uint8_t * address = buf;
+ const lv_image_header_t * header = &draw_buf->header;
+ uint32_t stride = header->stride;
+ lv_color_format_t cf = header->cf;
+
+ uint8_t * address = draw_buf->data;
int32_t i = 0;
- uint32_t bytes_per_pixel = lv_color_format_get_size(color_format);
+ uint32_t bytes_per_pixel = lv_color_format_get_size(cf);
int32_t width = lv_area_get_width(area);
int32_t lines = lv_area_get_height(area);
int32_t bytes_to_flush_per_line = (int32_t)width * (int32_t)bytes_per_pixel;
@@ -473,7 +475,7 @@ static void execute_drawing(lv_draw_dave2d_unit_t * u)
lv_area_move(&clipped_area, x, y);
/* Invalidate cache */
- lv_draw_buf_invalidate_cache(layer->draw_buf->data, layer->draw_buf->header.stride, layer->color_format, &clipped_area);
+ lv_draw_buf_invalidate_cache(layer->draw_buf, &clipped_area);
#endif
#endif
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c b/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c
index cc85f5e63..b36b2cf8f 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/renesas/dave2d/lv_draw_dave2d_label.c
@@ -63,73 +63,80 @@ static void lv_draw_dave2d_draw_letter_cb(lv_draw_unit_t * u, lv_draw_glyph_dsc_
(d2_border)clip_area.y2);
if(glyph_draw_dsc) {
- if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_INVALID) {
+ switch(glyph_draw_dsc->format) {
+ case LV_FONT_GLYPH_FORMAT_NONE: {
#if LV_USE_FONT_PLACEHOLDER
- /* Draw a placeholder rectangle*/
- lv_draw_border_dsc_t border_draw_dsc;
- lv_draw_border_dsc_init(&border_draw_dsc);
- border_draw_dsc.opa = glyph_draw_dsc->opa;
- border_draw_dsc.color = glyph_draw_dsc->color;
- border_draw_dsc.width = 1;
- //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords);
- lv_draw_dave2d_border(unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
+ /* Draw a placeholder rectangle*/
+ lv_draw_border_dsc_t border_draw_dsc;
+ lv_draw_border_dsc_init(&border_draw_dsc);
+ border_draw_dsc.opa = glyph_draw_dsc->opa;
+ border_draw_dsc.color = glyph_draw_dsc->color;
+ border_draw_dsc.width = 1;
+ //lv_draw_sw_border(u, &border_draw_dsc, glyph_draw_dsc->bg_coords);
+ lv_draw_dave2d_border(unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
#endif
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_A8) {
- lv_area_t mask_area = letter_coords;
- mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1;
- // lv_draw_sw_blend_dsc_t blend_dsc;
- // lv_memzero(&blend_dsc, sizeof(blend_dsc));
- // blend_dsc.color = glyph_draw_dsc->color;
- // blend_dsc.opa = glyph_draw_dsc->opa;
- // blend_dsc.mask_buf = glyph_draw_dsc->glyph_data;
- // blend_dsc.mask_area = &mask_area;
- // blend_dsc.blend_area = glyph_draw_dsc->letter_coords;
- // blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
- //lv_draw_sw_blend(u, &blend_dsc);
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_A1 ... LV_FONT_GLYPH_FORMAT_A8: {
+ lv_area_t mask_area = letter_coords;
+ mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1;
+ // lv_draw_sw_blend_dsc_t blend_dsc;
+ // lv_memzero(&blend_dsc, sizeof(blend_dsc));
+ // blend_dsc.color = glyph_draw_dsc->color;
+ // blend_dsc.opa = glyph_draw_dsc->opa;
+ // blend_dsc.mask_buf = glyph_draw_dsc->glyph_data;
+ // blend_dsc.mask_area = &mask_area;
+ // blend_dsc.blend_area = glyph_draw_dsc->letter_coords;
+ // blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
+ //lv_draw_sw_blend(u, &blend_dsc);
- lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
+ lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
#if defined(RENESAS_CORTEX_M85)
#if (BSP_CFG_DCACHE_ENABLED)
- d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size);
+ d1_cacheblockflush(unit->d2_handle, 0, draw_buf->data, draw_buf->data_size);
#endif
#endif
- d2_settexture(unit->d2_handle, (void *)draw_buf->data,
- (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8),
- lv_area_get_width(&letter_coords), lv_area_get_height(&letter_coords), d2_mode_alpha8);
- d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0);
- d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0);
- d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0);
- d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0);
+ d2_settexture(unit->d2_handle, (void *)draw_buf->data,
+ (d2_s32)lv_draw_buf_width_to_stride((uint32_t)lv_area_get_width(&letter_coords), LV_COLOR_FORMAT_A8),
+ lv_area_get_width(&letter_coords), lv_area_get_height(&letter_coords), d2_mode_alpha8);
+ d2_settexopparam(unit->d2_handle, d2_cc_red, glyph_draw_dsc->color.red, 0);
+ d2_settexopparam(unit->d2_handle, d2_cc_green, glyph_draw_dsc->color.green, 0);
+ d2_settexopparam(unit->d2_handle, d2_cc_blue, glyph_draw_dsc->color.blue, 0);
+ d2_settexopparam(unit->d2_handle, d2_cc_alpha, glyph_draw_dsc->opa, 0);
- d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply);
+ d2_settextureoperation(unit->d2_handle, d2_to_multiply, d2_to_multiply, d2_to_multiply, d2_to_multiply);
- d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0),
- D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1));
+ d2_settexturemapping(unit->d2_handle, D2_FIX4(letter_coords.x1), D2_FIX4(letter_coords.y1), D2_FIX16(0), D2_FIX16(0),
+ D2_FIX16(1), D2_FIX16(0), D2_FIX16(0), D2_FIX16(1));
- d2_settexturemode(unit->d2_handle, d2_tm_filter);
+ d2_settexturemode(unit->d2_handle, d2_tm_filter);
- d2_setfillmode(unit->d2_handle, d2_fm_texture);
+ d2_setfillmode(unit->d2_handle, d2_fm_texture);
- d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1),
- (d2_point)D2_FIX4(letter_coords.y1),
- (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)),
- (d2_point)D2_FIX4(lv_area_get_height(&letter_coords)));
+ d2_renderbox(unit->d2_handle, (d2_point)D2_FIX4(letter_coords.x1),
+ (d2_point)D2_FIX4(letter_coords.y1),
+ (d2_point)D2_FIX4(lv_area_get_width(&letter_coords)),
+ (d2_point)D2_FIX4(lv_area_get_height(&letter_coords)));
- d2_setfillmode(unit->d2_handle, current_fillmode);
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE) {
+ d2_setfillmode(unit->d2_handle, current_fillmode);
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_IMAGE: {
#if LV_USE_IMGFONT
- lv_draw_image_dsc_t img_dsc;
- lv_draw_image_dsc_init(&img_dsc);
- img_dsc.rotation = 0;
- img_dsc.scale_x = LV_SCALE_NONE;
- img_dsc.scale_y = LV_SCALE_NONE;
- img_dsc.opa = glyph_draw_dsc->opa;
- img_dsc.src = glyph_draw_dsc->glyph_data;
- //lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
+ lv_draw_image_dsc_t img_dsc;
+ lv_draw_image_dsc_init(&img_dsc);
+ img_dsc.rotation = 0;
+ img_dsc.scale_x = LV_SCALE_NONE;
+ img_dsc.scale_y = LV_SCALE_NONE;
+ img_dsc.opa = glyph_draw_dsc->opa;
+ img_dsc.src = glyph_draw_dsc->glyph_data;
+ //lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
#endif
+ }
+ break;
+ default:
+ break;
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.c
index 7ce1935df..cbb555d94 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.c
@@ -174,11 +174,11 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data)
lv_layer_t dest_layer;
lv_memzero(&dest_layer, sizeof(dest_layer));
- dest_layer.buf = lv_draw_buf_align(sdl_render_buf, LV_COLOR_FORMAT_ARGB8888);
+ lv_draw_buf_t draw_buf;
+ dest_layer.draw_buf = &draw_buf;
+ lv_draw_buf_init(dest_layer.draw_buf, lv_area_get_width(&task->area), lv_area_get_height(&task->area),
+ LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, sdl_render_buf, sizeof(sdl_render_buf));
dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888;
-
- lv_area_t a;
- _lv_area_intersect(&a, u->base_unit.clip_area, &task->area);
dest_layer.buf_area = task->area;
dest_layer._clip_area = task->area;
lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100);
@@ -224,7 +224,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data)
break;
case LV_DRAW_TASK_TYPE_IMAGE: {
lv_draw_image_dsc_t * image_dsc = task->draw_dsc;
- // SDL_Surface* loadImage(std::string path) {
const char * path = image_dsc->src;
SDL_Surface * surface = IMG_Load(&path[2]);
if(surface == NULL) {
@@ -307,6 +306,7 @@ static void blend_texture_layer(lv_draw_sdl_unit_t * u)
static void draw_from_cached_texture(lv_draw_sdl_unit_t * u)
{
+
lv_draw_task_t * t = u->task_act;
cache_data_t data_to_find;
@@ -344,8 +344,8 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u)
SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer));
- if(t->type == LV_DRAW_TASK_TYPE_IMAGE) {
- lv_draw_image_dsc_t * draw_dsc = t->draw_dsc;
+ lv_draw_image_dsc_t * draw_dsc = lv_draw_task_get_image_dsc(t);
+ if(draw_dsc) {
lv_area_t image_area;
image_area.x1 = 0;
image_area.y1 = 0;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.h
index 8f75ef473..b394ecca8 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl.h
@@ -17,7 +17,7 @@ extern "C" {
#if LV_USE_DRAW_SDL
-#include
+#include "../../misc/cache/lv_cache.h"
#include "../../misc/lv_area.h"
#include "../../misc/lv_color.h"
#include "../../display/lv_display.h"
@@ -52,8 +52,8 @@ typedef struct {
void lv_draw_sdl_init(void);
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sdl_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc,
- const lv_area_t * coords);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_image(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc,
+ const lv_area_t * coords);
void lv_draw_sdl_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t * dsc, const lv_area_t * coords);
@@ -65,7 +65,7 @@ void lv_draw_sdl_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * d
void lv_draw_sdl_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords);
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sdl_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sdl_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
void lv_draw_sdl_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t * draw_dsc, const lv_area_t * coords);
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h
index 62445ee22..3f16382f7 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/arm2d/lv_draw_sw_arm2d.h
@@ -200,11 +200,19 @@ static inline lv_result_t _lv_draw_sw_image_helium(
|| (LV_COLOR_FORMAT_RGB565A8 == src_cf))) {
break;
}
+ #if 0 /* a temporary patch */
if((LV_COLOR_FORMAT_XRGB8888 == des_cf)
&& !( (LV_COLOR_FORMAT_ARGB8888 == src_cf)
|| (LV_COLOR_FORMAT_XRGB8888 == src_cf))) {
break;
}
+ #else
+ if((LV_COLOR_FORMAT_XRGB8888 == des_cf)
+ || (LV_COLOR_FORMAT_RGB888 == des_cf)
+ || (LV_COLOR_FORMAT_ARGB8888 == des_cf)) {
+ break;
+ }
+ #endif
/* ------------- prepare parameters for arm-2d APIs - BEGIN --------- */
@@ -399,6 +407,7 @@ static inline lv_result_t _lv_draw_sw_image_helium(
LV_ASSERT(LV_COLOR_FORMAT_RGB565 == des_cf);
if(opa >= LV_OPA_MAX) {
+ #if ARM_2D_VERSION >= 10106
arm_2d_rgb565_tile_transform_only(
&source_tile,
&target_tile,
@@ -406,8 +415,21 @@ static inline lv_result_t _lv_draw_sw_image_helium(
source_center,
ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)),
draw_dsc->scale_x / 256.0f,
- &target_center
- );
+ &target_center);
+ #else
+
+ arm_2dp_rgb565_tile_transform_only_prepare(
+ NULL,
+ &source_tile,
+ source_center,
+ ARM_2D_ANGLE((draw_dsc->rotation / 10.0f)),
+ (float)(draw_dsc->scale_x / 256.0f));
+
+ arm_2dp_tile_transform(NULL,
+ &target_tile,
+ NULL,
+ &target_center);
+ #endif
}
else {
arm_2d_rgb565_tile_transform_only_with_opacity(
@@ -423,6 +445,7 @@ static inline lv_result_t _lv_draw_sw_image_helium(
}
}
+ #if 0 /* a temporary patch */
else if(LV_COLOR_FORMAT_ARGB8888 == src_cf) {
LV_ASSERT(LV_COLOR_FORMAT_XRGB8888 == des_cf);
@@ -488,6 +511,7 @@ static inline lv_result_t _lv_draw_sw_image_helium(
}
}
+ #endif
else {
break;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h
index 669b3a2d4..5640bde34 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_arm2d.h
@@ -35,242 +35,162 @@ extern "C" {
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \
- _lv_color_blend_to_rgb565_helium(dsc)
+ _lv_color_blend_to_rgb565_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \
- _lv_color_blend_to_rgb565_with_opa_helium(dsc)
+ _lv_color_blend_to_rgb565_with_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \
- _lv_color_blend_to_rgb565_with_mask_helium(dsc)
+ _lv_color_blend_to_rgb565_with_mask_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \
- _lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc)
+ _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \
- _lv_rgb565_blend_normal_to_rgb565_helium(dsc)
+ _lv_rgb565_blend_normal_to_rgb565_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \
- _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc)
+ _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \
- _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc)
+ _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \
- _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc)
+ _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb565_arm2d(dsc, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(dsc, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(dsc, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc, src_px_size)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \
- _lv_argb8888_blend_normal_to_rgb565_helium(dsc)
+ _lv_argb8888_blend_normal_to_rgb565_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \
- _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc)
+ _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \
- _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc)
+ _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \
- _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc)
+ _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(dsc)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \
- _lv_color_blend_to_rgb888_helium(dsc, dst_px_size)
+ _lv_color_blend_to_rgb888_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
- _lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size)
+ _lv_color_blend_to_rgb888_with_opa_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
- _lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size)
+ _lv_color_blend_to_rgb888_with_mask_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA
#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
- _lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
+ _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \
- _lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size)
+ _lv_rgb565_blend_normal_to_rgb888_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
- _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size)
+ _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
- _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size)
+ _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
- _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
+ _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size, src_px_size)
#endif
#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \
- _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size)
+ _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size, src_px_size)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \
- _lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size)
+ _lv_argb8888_blend_normal_to_rgb888_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
- _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size)
+ _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
- _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size)
+ _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(dsc, dst_px_size)
#endif
#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
- _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
-#endif
-
-#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888
-#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \
- _lv_color_blend_to_argb8888_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA
-#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \
- _lv_color_blend_to_argb8888_with_opa_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK
-#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \
- _lv_color_blend_to_argb8888_with_mask_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA
-#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \
- _lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888
-#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \
- _lv_rgb565_blend_normal_to_argb8888_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
-#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \
- _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
-#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \
- _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
-#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \
- _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888
-#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size)
-#endif
-
-#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
-#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size)
-#endif
-
-#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
-#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size)
-#endif
-
-#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
-#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \
- _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size)
-#endif
-
-#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888
-#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \
- _lv_argb8888_blend_normal_to_argb8888_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
-#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \
- _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
-#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \
- _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc)
-#endif
-
-#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
-#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \
- _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc)
+ _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(dsc, dst_px_size)
#endif
/**********************
@@ -281,7 +201,7 @@ extern "C" {
* GLOBAL PROTOTYPES
**********************/
-static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+static inline lv_result_t _lv_color_blend_to_rgb565_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t stride = (dsc->dest_stride) / sizeof(uint16_t);
@@ -292,7 +212,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fil
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t stride = (dsc->dest_stride) / sizeof(uint16_t);
@@ -304,7 +224,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t stride = (dsc->dest_stride) / sizeof(uint16_t);
@@ -317,7 +237,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t stride = (dsc->dest_stride) / sizeof(uint16_t);
@@ -331,7 +251,7 @@ static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
@@ -345,7 +265,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_b
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -359,7 +279,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -375,7 +295,7 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -398,8 +318,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
{
if(src_px_size == 3) {
return LV_RESULT_INVALID;
@@ -418,8 +338,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_b
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
{
if(src_px_size == 3) {
return LV_RESULT_INVALID;
@@ -451,8 +371,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
{
if(src_px_size == 3) {
return LV_RESULT_INVALID;
@@ -486,8 +406,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
{
if(src_px_size == 3) {
return LV_RESULT_INVALID;
@@ -527,7 +447,7 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -557,7 +477,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -605,7 +525,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_l
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -655,7 +575,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc)
{
arm_2d_size_t draw_size = {dsc->dest_w, dsc->dest_h};
int16_t des_stride = dsc->dest_stride / sizeof(uint16_t);
@@ -706,7 +626,7 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_heliu
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size)
+static inline lv_result_t _lv_color_blend_to_rgb888_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size)
{
if(dst_px_size == 3) {
return LV_RESULT_INVALID;
@@ -721,8 +641,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fil
}
-static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
return LV_RESULT_INVALID;
@@ -738,8 +658,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -757,8 +677,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -777,8 +697,8 @@ static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -799,8 +719,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_b
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -834,8 +754,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -870,8 +790,8 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -912,9 +832,9 @@ static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size,
- uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size,
+ uint32_t src_px_size)
{
if((dst_px_size == 3) || (src_px_size == 3)) {
return LV_RESULT_INVALID;
@@ -933,8 +853,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_helium(_lv_draw_sw_b
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size, uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
{
if((dst_px_size == 3) || (src_px_size == 3)) {
return LV_RESULT_INVALID;
@@ -954,8 +874,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(_lv_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size, uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
{
if((dst_px_size == 3) || (src_px_size == 3)) {
return LV_RESULT_INVALID;
@@ -976,8 +896,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(_lv
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size, uint32_t src_px_size)
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
{
if((dst_px_size == 3) || (src_px_size == 3)) {
return LV_RESULT_INVALID;
@@ -1004,8 +924,8 @@ static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -1028,8 +948,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
return LV_RESULT_INVALID;
@@ -1068,8 +988,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_l
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
@@ -1095,8 +1015,8 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t dst_px_size)
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_arm2d(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
{
if(dst_px_size == 3) {
return LV_RESULT_INVALID;
@@ -1127,307 +1047,6 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_heliu
return LV_RESULT_OK;
}
-static inline lv_result_t _lv_color_blend_to_argb8888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = &dsc->color
- };
-
- lv_color_blend_to_argb8888_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = &dsc->color
- };
- lv_color_blend_to_argb8888_with_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = &dsc->color,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_color_blend_to_argb8888_with_mask_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = &dsc->color,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_color_blend_to_argb8888_mix_mask_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- lv_rgb565_blend_normal_to_argb8888_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- lv_rgb565_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_rgb565_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- if(src_px_size == 3) {
- lv_rgb888_blend_normal_to_argb8888_helium(&asm_dsc);
- }
- else {
- lv_xrgb8888_blend_normal_to_argb8888_helium(&asm_dsc);
- }
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- if(src_px_size == 3) {
- lv_rgb888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
- }
- else {
- lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
- }
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- if(src_px_size == 3) {
- lv_rgb888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
- }
- else {
- lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
- }
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
- uint32_t src_px_size)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- if(src_px_size == 3) {
- lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
- }
- else {
- lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
- }
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- lv_argb8888_blend_normal_to_argb8888_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride
- };
- lv_argb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_argb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
-static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
-{
-#if 0
- asm_dsc_t asm_dsc = {
- .opa = dsc->opa,
- .dst_buf = dsc->dest_buf,
- .dst_w = dsc->dest_w,
- .dst_h = dsc->dest_h,
- .dst_stride = dsc->dest_stride,
- .src_buf = dsc->src_buf,
- .src_stride = dsc->src_stride,
- .mask_buf = dsc->mask_buf,
- .mask_stride = dsc->mask_stride
- };
- lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
-#endif
- return LV_RESULT_INVALID;
-}
-
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_helium.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_helium.h
deleted file mode 100644
index 03caed11f..000000000
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/arm2d/lv_blend_helium.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * @file lv_blend_arm2d.h
- *
- */
-
-#ifndef LV_BLEND_HELIUM_H
-#define LV_BLEND_HELIUM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*********************
- * INCLUDES
- *********************/
-
-#include "../../../../lv_conf_internal.h"
-
-/* detect whether helium is available based on arm compilers' standard */
-#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE
-
-#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE
-#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE
-#endif
-
-/*********************
- * DEFINES
- *********************/
-
-/**********************
- * TYPEDEFS
- **********************/
-
-/**********************
- * GLOBAL PROTOTYPES
- **********************/
-
-/**********************
- * TYPEDEFS
- **********************/
-
-/**********************
- * GLOBAL PROTOTYPES
- **********************/
-
-/*********************
- * POST INCLUDES
- *********************/
-/* use arm-2d as the default helium acceleration */
-#include "lv_blend_arm2d.h"
-
-#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */
-
-#ifdef __cplusplus
-} /*extern "C"*/
-#endif
-
-#endif /*LV_BLEND_HELIUM_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S
new file mode 100644
index 000000000..ec054e87e
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.S
@@ -0,0 +1,473 @@
+/**
+ * @file lv_blend_helium.S
+ *
+ */
+
+#ifndef __ASSEMBLY__
+#define __ASSEMBLY__
+#endif
+
+#include "lv_blend_helium.h"
+
+#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM
+
+.data
+reciprocal:
+.byte 0xFF, 0xE2, 0xCC, 0xB9, 0xAA, 0x9C, 0x91, 0x88
+
+.text
+.syntax unified
+.altmacro
+.p2align 2
+
+TMP .req r0
+DST_ADDR .req r1
+DST_W .req r2
+DST_H .req r3
+DST_STRIDE .req r4
+SRC_ADDR .req r5
+SRC_STRIDE .req r6
+MASK_ADDR .req r7
+MASK_STRIDE .req r8
+H .req r9
+OPA .req r10
+RCP .req r11
+S_B .qn q0
+S_G .qn q1
+S_R .qn q2
+S_A .qn q3
+D_B .qn q4
+D_G .qn q5
+D_R .qn q6
+D_A .qn q7
+N .qn q0
+V .qn q1
+R .qn q2
+L .qn q4
+
+.macro conv_888_to_565 reg
+ vsri.8 reg&_R, reg&_G, #5
+ vshr.u8 reg&_G, reg&_G, #2
+ vshr.u8 reg&_B, reg&_B, #3
+ vsli.8 reg&_B, reg&_G, #5
+.endm
+
+@ 16bpp is stored on R & B
+.macro ldst op, bpp, mem, reg, areg, cvt, alt_index, wb
+.if bpp == 0
+.if (reg == S) || (wb&1) @ exclude reg == D and !
+ ldr TMP, [mem&_ADDR]
+ vdup.8 reg&_B, TMP
+ lsr TMP, #8
+ vdup.8 reg&_G, TMP
+ lsr TMP, #8
+ vdup.8 reg&_R, TMP
+.if cvt && (wb&1)
+ conv_888_to_565 reg
+.endif
+.endif
+.elseif bpp == 8
+ v&op&rb.8 reg&_A, [mem&_ADDR], #16
+.elseif bpp == 16
+.if cvt && (op == st)
+ conv_888_to_565 reg
+.endif
+.if alt_index
+ v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A]
+.else
+ v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A]
+.endif
+.if cvt && (op == ld)
+ vshl.u8 reg&_G, reg&_R, #5
+ vsri.u8 reg&_G, reg&_B, #3
+ vshl.u8 reg&_B, reg&_B, #3
+ vsri.u8 reg&_R, reg&_R, #5
+ vsri.u8 reg&_G, reg&_G, #6
+ vsri.u8 reg&_B, reg&_B, #5
+.endif
+.if wb&0
+ add mem&_ADDR, #31
+.else
+ sub mem&_ADDR, #1
+.endif
+.elseif bpp >= 24
+.if alt_index || (bpp >= 31)
+ v&op&rb.8 reg&_B, [mem&_ADDR, areg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_G, [mem&_ADDR, areg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_R, [mem&_ADDR, areg&_A]
+.else
+ v&op&rb.8 reg&_B, [mem&_ADDR, reg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_G, [mem&_ADDR, reg&_A]
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_R, [mem&_ADDR, reg&_A]
+.endif
+.if (bpp == 32) || (bpp == 31) && (op == st)
+ add mem&_ADDR, #1
+ v&op&rb.8 reg&_A, [mem&_ADDR, areg&_A]
+.endif
+.if wb&0
+ .if bpp == 24
+ add mem&_ADDR, #46
+ .elseif (bpp == 32) || (bpp == 31) && (op == st)
+ add mem&_ADDR, #61
+ .else
+ add mem&_ADDR, #62
+ .endif
+.else
+ .if (bpp == 32) || (bpp == 31) && (op == st)
+ sub mem&_ADDR, #3
+ .else
+ sub mem&_ADDR, #2
+ .endif
+.endif
+.endif
+.endm
+
+.macro load_index bpp, reg, areg
+.if bpp > 0
+ mov TMP, #0
+.endif
+.if bpp == 8
+ vidup.u8 reg&_A, TMP, #1
+.elseif bpp == 16
+ vidup.u8 reg&_A, TMP, #2
+.elseif bpp == 24
+ vidup.u8 reg&_A, TMP, #1
+ mov TMP, #3
+ vmul.i8 reg&_A, reg&_A, TMP
+.elseif bpp >= 31
+ vidup.u8 areg&_A, TMP, #4
+.endif
+.endm
+
+.macro init src_bpp, dst_bpp, mask, opa
+ ldr DST_ADDR, [r0, #4]
+ ldr DST_W, [r0, #8]
+ ldr DST_H, [r0, #12]
+ ldr DST_STRIDE, [r0, #16]
+ ldr SRC_ADDR, [r0, #20]
+.if src_bpp > 0
+ ldr SRC_STRIDE, [r0, #24]
+.endif
+.if mask
+ ldr MASK_ADDR, [r0, #28]
+ ldr MASK_STRIDE, [r0, #32]
+.endif
+.if opa
+ ldr OPA, [r0]
+.else
+ mov OPA, #0xFF
+.endif
+ add TMP, DST_W, #0xF
+ bic TMP, TMP, #0xF
+.if dst_bpp == 32
+ ldr RCP, =(reciprocal - 8)
+.endif
+
+.if dst_bpp == 16
+ sub DST_STRIDE, DST_STRIDE, TMP, lsl #1
+.elseif dst_bpp == 24
+ sub DST_STRIDE, DST_STRIDE, TMP
+ sub DST_STRIDE, DST_STRIDE, TMP, lsl #1
+.elseif dst_bpp >= 31
+ sub DST_STRIDE, DST_STRIDE, TMP, lsl #2
+.endif
+.if mask
+ sub MASK_STRIDE, MASK_STRIDE, TMP
+.endif
+.if src_bpp == 0
+ .if mask || opa
+ ldst ld, src_bpp, SRC, S, D, 0, 0
+ vmov.u8 S_A, #0xFF
+ .else
+ ldst ld, src_bpp, SRC, D, S, (dst_bpp == 16), 0
+ vmov.u8 D_A, #0xFF
+ .endif
+.else
+ .if src_bpp == 16
+ sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1
+ .elseif src_bpp == 24
+ sub SRC_STRIDE, SRC_STRIDE, TMP
+ sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #1
+ .elseif src_bpp >= 31
+ sub SRC_STRIDE, SRC_STRIDE, TMP, lsl #2
+ .endif
+.endif
+.if (src_bpp < 32) && (mask == 0) && (opa == 0)
+ .if (src_bpp == 31) || (dst_bpp < 31)
+ load_index src_bpp, S, S
+ .endif
+ .if (dst_bpp < 31) && (dst_bpp != src_bpp)
+ load_index dst_bpp, D, D
+ .else
+ load_index dst_bpp, S, S
+ vmov.u8 D_A, #0xFF
+ .endif
+.endif
+.endm
+
+.macro vqrdmulh_u8 Qd, Qn, Qm @ 1 bit precision loss
+ vmulh.u8 Qd, Qn, Qm
+ vqshl.u8 Qd, Qd, #1
+.endm
+
+.macro premult mem, alpha
+ vrmulh.u8 mem&_B, mem&_B, alpha
+ vrmulh.u8 mem&_G, mem&_G, alpha
+ vrmulh.u8 mem&_R, mem&_R, alpha
+.endm
+
+.macro blend src_bpp, dst_bpp, mask, opa, mode
+.if (mask == 0) && (opa == 2) && (dst_bpp < 32)
+ vhadd.u8 D_B, D_B, S_B
+ vhadd.u8 D_G, D_G, S_G
+ vhadd.u8 D_R, D_R, S_R
+.else
+.if dst_bpp < 32
+ vmvn D_A, S_A
+ premult S, S_A
+ premult D, D_A
+.else
+ vpush {d0-d5}
+ vmvn N, S_A
+ vmvn D_A, D_A
+ vrmulh.u8 D_A, N, D_A
+ vmvn D_A, D_A @ D_A = 255 - LV_OPA_MIX2(255 - fg.alpha, 255 - bg.alpha)
+ vclz.i8 N, D_A @ n = clz(D_A)
+ vshl.u8 V, D_A, N @ v = D_A << n
+ vshl.u8 S_A, S_A, N
+ vshr.u8 N, V, #4 @ N is used as tmp from now on
+ vldrb.u8 R, [RCP, N] @ r = reciprocal[(v >> 4) - 8]
+ vrmulh.u8 N, V, R @ r = newton(v,r)
+ vmvn N, N @ = vqrdmulh.u8(vmvn(vrmulh(v, r)), r)
+ vqrdmulh_u8 R, N, R @ but vqrdmulh does not support u8, so we implement one
+ vrmulh.u8 N, V, R @ and do it twice
+ vmvn N, N
+ vqrdmulh_u8 R, N, R
+ vqrdmulh_u8 S_A, S_A, R @ S_A' = S_A * 255 / D_A = vrdmulh(S_A << n, r)
+ vpop {d0-d5}
+ premult S, S_A
+ vmvn S_A, S_A
+ premult D, S_A
+.endif
+ vqadd.u8 D_B, D_B, S_B
+ vqadd.u8 D_G, D_G, S_G
+ vqadd.u8 D_R, D_R, S_R
+.endif
+.if dst_bpp == 31
+ vmov.u8 D_A, #0xFF
+.endif
+.endm
+
+.macro blend_line src_bpp, dst_bpp, mask, opa, mode
+ wlstp.8 lr, DST_W, 1f
+2:
+.if (src_bpp < 32) && (mask == 0) && (opa == 0)
+@ no blend
+@ dst index: db < 31 ? (db == sb ? S : D) : S
+@ src index: sb < 31 && db >= 31 ? D(reload) : S
+ .if (src_bpp < 31) && (dst_bpp >= 31)
+ load_index src_bpp, D, D
+ .endif
+ .if src_bpp == 0
+ ldst st, dst_bpp, DST, D, S, 0, 0, !
+ .elseif (src_bpp == dst_bpp) || (src_bpp == 31) && (dst_bpp == 32)
+ .if dst_bpp < 31
+ .if src_bpp < 31
+ ldst ld, src_bpp, SRC, D, S, 0, 1, !
+ .else
+ ldst ld, src_bpp, SRC, D, S, 0, 0, !
+ .endif
+ ldst st, dst_bpp, DST, D, S, 0, 1, !
+ .else
+ ldst ld, src_bpp, SRC, D, S, 0, 0, !
+ ldst st, dst_bpp, DST, D, S, 0, 0, !
+ .endif
+ .else
+ .if (dst_bpp < 31) && (src_bpp < 31)
+ ldst ld, src_bpp, SRC, D, S, 1, 1, !
+ .else
+ ldst ld, src_bpp, SRC, D, S, 1, 0, !
+ .endif
+ .if (src_bpp < 31) && (dst_bpp >= 31)
+ vmov.u8 D_A, #0xFF
+ .endif
+ ldst st, dst_bpp, DST, D, S, 1, 0, !
+ .endif
+.elseif src_bpp < 32
+@ no src_a
+ load_index src_bpp, S, D
+ ldst ld, src_bpp, SRC, S, D, 1, 0, !
+ load_index dst_bpp, D, S
+ ldst ld, dst_bpp, DST, D, S, 1, 0
+ .if mask
+ ldst ld, 8, MASK, S, D, 1, 0, !
+ .if opa == 2
+ vshr.u8 S_A, S_A, #1
+ .elseif opa == 1
+ .if dst_bpp == 32
+ vpush {d14-d15}
+ .endif
+ vdup.8 D_A, OPA
+ vrmulh.u8 S_A, S_A, D_A
+ .if dst_bpp == 32
+ vpop {d14-d15}
+ .endif
+ .endif
+ .elseif opa == 1
+ vdup.8 S_A, OPA
+ .endif
+ blend src_bpp, dst_bpp, mask, opa, mode
+ .if (dst_bpp == 32) || mask || (opa == 1)
+ load_index dst_bpp, D, S
+ .endif
+ ldst st, dst_bpp, DST, D, S, 1, 0, !
+.else
+@ src_a (+mask) (+opa)
+ load_index dst_bpp, D, S
+ ldst ld, dst_bpp, DST, D, S, 1, 0
+ .if dst_bpp == 32
+ vpush {d14-d15}
+ .endif
+ load_index src_bpp, S, D
+ ldst ld, src_bpp, SRC, S, D, 1, 0, !
+ .if mask == 0
+ .if opa
+ vdup.8 D_A, OPA
+ vrmulh.u8 S_A, S_A, D_A
+ .endif
+ .else
+ ldst ld, 8, MASK, D, S, 1, 0, !
+ vrmulh.u8 S_A, S_A, D_A
+ .if opa
+ vdup.8 D_A, OPA
+ vrmulh.u8 S_A, S_A, D_A
+ .endif
+ .endif
+ .if dst_bpp == 32
+ vpop {d14-d15}
+ .endif
+ blend src_bpp, dst_bpp, mask, opa, mode
+ load_index dst_bpp, D, S
+ ldst st, dst_bpp, DST, D, S, 1, 0, !
+.endif
+ letp lr, 2b
+1:
+.endm
+
+.macro enter
+ push {r4-r11, lr}
+ vpush {d8-d15}
+.endm
+
+.macro exit
+ vpop {d8-d15}
+ pop {r4-r11, pc}
+.endm
+
+.macro preload mem, bpp
+.if bpp >= 31
+ pld [mem&_ADDR, DST_W, lsl #2]
+.elseif bpp == 24
+ add TMP, DST_W, DST_W, lsl #1
+ pld [mem&_ADDR, TMP]
+.elseif bpp == 16
+ pld [mem&_ADDR, DST_W, lsl #1]
+.elseif bpp == 8
+ pld [mem&_ADDR, DST_W]
+.endif
+.endm
+
+.macro next src_bpp, mask
+ add DST_ADDR, DST_ADDR, DST_STRIDE
+.if src_bpp > 0
+ add SRC_ADDR, SRC_ADDR, SRC_STRIDE
+.endif
+.if mask
+ add MASK_ADDR, MASK_ADDR, MASK_STRIDE
+.endif
+.endm
+
+.macro blender src_bpp, dst_bpp, mask, opa, mode
+ enter
+ init src_bpp, dst_bpp, mask, opa
+ movs H, DST_H
+ beq 0f
+ preload SRC, src_bpp
+.if mask || opa || (src_bpp == 32)
+ preload DST, dst_bpp
+.endif
+.if opa && (src_bpp < 32) && (dst_bpp < 32)
+4:
+@ 50% OPA can be accelerated (OPA == 0x7F/0x80)
+ add TMP, OPA, #1
+ tst TMP, #0x7E
+ bne 3f
+ blend_line src_bpp, dst_bpp, mask, 2, mode
+ next src_bpp, mask
+ subs H, #1
+ bne 4b
+ b 0f
+.endif
+3:
+ blend_line src_bpp, dst_bpp, mask, opa, mode
+ next src_bpp, mask
+ subs H, #1
+ bne 3b
+0:
+ exit
+.ltorg
+.endm
+
+.macro export name, src_bpp, dst_bpp, mask, opa, mode
+.thumb_func
+.func name
+.global name
+name&:
+ blender src_bpp, dst_bpp, mask, opa, mode
+.endfunc
+.endm
+
+.macro export_set src, dst, src_bpp, dst_bpp, mode
+.if src == color
+ export lv_&src&_blend_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode
+ export lv_&src&_blend_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode
+ export lv_&src&_blend_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode
+ export lv_&src&_blend_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode
+.else
+ export lv_&src&_blend_&mode&_to_&dst&_helium, src_bpp, dst_bpp, 0, 0, mode
+ export lv_&src&_blend_&mode&_to_&dst&_with_opa_helium, src_bpp, dst_bpp, 0, 1, mode
+ export lv_&src&_blend_&mode&_to_&dst&_with_mask_helium, src_bpp, dst_bpp, 1, 0, mode
+ export lv_&src&_blend_&mode&_to_&dst&_mix_mask_opa_helium, src_bpp, dst_bpp, 1, 1, mode
+.endif
+.endm
+
+export_set color, rgb565, 0, 16, normal
+export_set rgb565, rgb565, 16, 16, normal
+export_set rgb888, rgb565, 24, 16, normal
+export_set xrgb8888, rgb565, 31, 16, normal
+export_set argb8888, rgb565, 32, 16, normal
+export_set color, rgb888, 0, 24, normal
+export_set rgb565, rgb888, 16, 24, normal
+export_set rgb888, rgb888, 24, 24, normal
+export_set xrgb8888, rgb888, 31, 24, normal
+export_set argb8888, rgb888, 32, 24, normal
+export_set color, xrgb8888, 0, 31, normal
+export_set rgb565, xrgb8888, 16, 31, normal
+export_set rgb888, xrgb8888, 24, 31, normal
+export_set xrgb8888, xrgb8888, 31, 31, normal
+export_set argb8888, xrgb8888, 32, 31, normal
+export_set color, argb8888, 0, 32, normal
+export_set rgb565, argb8888, 16, 32, normal
+export_set rgb888, argb8888, 24, 32, normal
+export_set xrgb8888, argb8888, 31, 32, normal
+export_set argb8888, argb8888, 32, 32, normal
+
+#endif /*LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM && defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE && LV_USE_NATIVE_HELIUM_ASM*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h
new file mode 100644
index 000000000..f8964e9d9
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/helium/lv_blend_helium.h
@@ -0,0 +1,1313 @@
+/**
+ * @file lv_blend_helium.h
+ *
+ */
+
+#ifndef LV_BLEND_HELIUM_H
+#define LV_BLEND_HELIUM_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#if defined(_RTE_)
+#include "Pre_Include_Global.h"
+#include "lv_conf_cmsis.h"
+#endif
+
+#include "../../../../lv_conf_internal.h"
+
+/* detect whether helium is available based on arm compilers' standard */
+#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE
+
+#ifdef LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE
+#include LV_DRAW_SW_HELIUM_CUSTOM_INCLUDE
+#endif
+
+#if !defined(__ASSEMBLY__)
+
+/* Use arm2d functions if present */
+#include "../arm2d/lv_blend_arm2d.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+#if LV_USE_NATIVE_HELIUM_ASM
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565(dsc) \
+ _lv_color_blend_to_rgb565_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_OPA(dsc) \
+ _lv_color_blend_to_rgb565_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc) \
+ _lv_color_blend_to_rgb565_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB565_MIX_MASK_OPA(dsc) \
+ _lv_color_blend_to_rgb565_mix_mask_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565(dsc) \
+ _lv_rgb565_blend_normal_to_rgb565_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \
+ _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \
+ _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \
+ _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb565_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565(dsc) \
+ _lv_argb8888_blend_normal_to_rgb565_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_OPA(dsc) \
+ _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_WITH_MASK(dsc) \
+ _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB565_MIX_MASK_OPA(dsc) \
+ _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888(dsc, dst_px_size) \
+ _lv_color_blend_to_rgb888_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
+ _lv_color_blend_to_rgb888_with_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
+ _lv_color_blend_to_rgb888_with_mask_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
+ _lv_color_blend_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \
+ _lv_rgb565_blend_normal_to_rgb888_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
+ _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
+ _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
+ _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb888_helium(dsc, dst_px_size, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size, src_px_size) \
+ _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888(dsc, dst_px_size) \
+ _lv_argb8888_blend_normal_to_rgb888_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_OPA(dsc, dst_px_size) \
+ _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_WITH_MASK(dsc, dst_px_size) \
+ _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_RGB888_MIX_MASK_OPA(dsc, dst_px_size) \
+ _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(dsc, dst_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888
+#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888(dsc) \
+ _lv_color_blend_to_argb8888_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_OPA(dsc) \
+ _lv_color_blend_to_argb8888_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK
+#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_WITH_MASK(dsc) \
+ _lv_color_blend_to_argb8888_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA
+#define LV_DRAW_SW_COLOR_BLEND_TO_ARGB8888_MIX_MASK_OPA(dsc) \
+ _lv_color_blend_to_argb8888_mix_mask_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888(dsc) \
+ _lv_rgb565_blend_normal_to_argb8888_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \
+ _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \
+ _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB565_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \
+ _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_argb8888_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
+#define LV_DRAW_SW_RGB888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc, src_px_size) \
+ _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc, src_px_size)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888(dsc) \
+ _lv_argb8888_blend_normal_to_argb8888_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_OPA(dsc) \
+ _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_WITH_MASK(dsc) \
+ _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(dsc)
+#endif
+
+#ifndef LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA
+#define LV_DRAW_SW_ARGB8888_BLEND_NORMAL_TO_ARGB8888_MIX_MASK_OPA(dsc) \
+ _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(dsc)
+#endif
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ uint32_t opa;
+ void * dst_buf;
+ uint32_t dst_w;
+ uint32_t dst_h;
+ uint32_t dst_stride;
+ const void * src_buf;
+ uint32_t src_stride;
+ const lv_opa_t * mask_buf;
+ uint32_t mask_stride;
+} asm_dsc_t;
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+extern void lv_color_blend_to_rgb565_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb565_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+
+ lv_color_blend_to_rgb565_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb565_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb565_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+ lv_color_blend_to_rgb565_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb565_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb565_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_color_blend_to_rgb565_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_color_blend_to_rgb565_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb565_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_rgb565_blend_normal_to_rgb565_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_rgb565_blend_normal_to_rgb565_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_rgb565_blend_normal_to_rgb565_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_rgb565_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb565_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb565_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb565_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_argb8888_blend_normal_to_rgb565_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb565_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_argb8888_blend_normal_to_rgb565_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb565_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_argb8888_blend_normal_to_rgb565_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_argb8888_blend_normal_to_rgb565_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb888_helium(asm_dsc_t * dsc);
+extern void lv_color_blend_to_xrgb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+ if(dst_px_size == 3) {
+ lv_color_blend_to_rgb888_helium(&asm_dsc);
+ }
+ else {
+ lv_color_blend_to_xrgb8888_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_color_blend_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+ if(dst_px_size == 3) {
+ lv_color_blend_to_rgb888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_color_blend_to_xrgb8888_with_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_color_blend_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_color_blend_to_rgb888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_color_blend_to_xrgb8888_with_mask_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_color_blend_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_color_blend_to_rgb888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_color_blend_to_xrgb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb888_helium(asm_dsc_t * dsc);
+extern void lv_rgb565_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ lv_rgb565_blend_normal_to_rgb888_helium(&asm_dsc);
+ }
+ else {
+ lv_rgb565_blend_normal_to_xrgb8888_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ lv_rgb565_blend_normal_to_rgb888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_rgb565_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_rgb565_blend_normal_to_rgb888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_rgb565_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_rgb565_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_rgb565_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc);
+extern void lv_rgb888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb888_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb888_helium(&asm_dsc);
+ }
+ }
+ else {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_xrgb8888_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_xrgb8888_helium(&asm_dsc);
+ }
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc);
+ }
+ }
+ else {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc);
+ }
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc);
+ }
+ }
+ else {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc);
+ }
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size, uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc);
+ }
+ }
+ else {
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb888_helium(asm_dsc_t * dsc);
+extern void lv_argb8888_blend_normal_to_xrgb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ lv_argb8888_blend_normal_to_rgb888_helium(&asm_dsc);
+ }
+ else {
+ lv_argb8888_blend_normal_to_xrgb8888_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(dst_px_size == 3) {
+ lv_argb8888_blend_normal_to_rgb888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_argb8888_blend_normal_to_xrgb8888_with_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_argb8888_blend_normal_to_rgb888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_argb8888_blend_normal_to_xrgb8888_with_mask_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dst_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(dst_px_size == 3) {
+ lv_argb8888_blend_normal_to_rgb888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_argb8888_blend_normal_to_xrgb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_argb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_argb8888_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+
+ lv_color_blend_to_argb8888_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_argb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_argb8888_with_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color
+ };
+ lv_color_blend_to_argb8888_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_argb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_argb8888_with_mask_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_color_blend_to_argb8888_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_color_blend_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_color_blend_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_fill_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = &dsc->color,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_color_blend_to_argb8888_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_argb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_rgb565_blend_normal_to_argb8888_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_rgb565_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_rgb565_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_rgb565_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_argb8888_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_argb8888_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+extern void lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t src_px_size)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ if(src_px_size == 3) {
+ lv_rgb888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ else {
+ lv_xrgb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
+ }
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_argb8888_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_argb8888_blend_normal_to_argb8888_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_argb8888_with_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride
+ };
+ lv_argb8888_blend_normal_to_argb8888_with_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_argb8888_with_mask_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_with_mask_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_argb8888_blend_normal_to_argb8888_with_mask_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+extern void lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(asm_dsc_t * dsc);
+static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(_lv_draw_sw_blend_image_dsc_t * dsc)
+{
+ asm_dsc_t asm_dsc = {
+ .opa = dsc->opa,
+ .dst_buf = dsc->dest_buf,
+ .dst_w = dsc->dest_w,
+ .dst_h = dsc->dest_h,
+ .dst_stride = dsc->dest_stride,
+ .src_buf = dsc->src_buf,
+ .src_stride = dsc->src_stride,
+ .mask_buf = dsc->mask_buf,
+ .mask_stride = dsc->mask_stride
+ };
+ lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_helium(&asm_dsc);
+ return LV_RESULT_OK;
+}
+
+#endif /* LV_USE_NATIVE_HELIUM_ASM */
+
+#endif /* !defined(__ASSEMBLY__) */
+
+#endif /* defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE */
+
+/**********************
+ * MACROS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_BLEND_HELIUM_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c
index 0cdbca5a2..9ceee3b1c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend.c
@@ -93,6 +93,11 @@ void lv_draw_sw_blend(lv_draw_unit_t * draw_unit, const lv_draw_sw_blend_dsc_t *
return;
}
+ if(blend_dsc->mask_area && !_lv_area_intersect(&blend_area, &blend_area, blend_dsc->mask_area)) {
+ LV_PROFILER_END;
+ return;
+ }
+
_lv_draw_sw_blend_image_dsc_t image_dsc;
image_dsc.dest_w = lv_area_get_width(&blend_area);
image_dsc.dest_h = lv_area_get_height(&blend_area);
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
index 79a7accd5..c78c10cfd 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.c
@@ -19,7 +19,7 @@
#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON
#include "neon/lv_blend_neon.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM
- #include "arm2d/lv_blend_helium.h"
+ #include "helium/lv_blend_helium.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM
#include LV_DRAW_SW_ASM_CUSTOM_INCLUDE
#endif
@@ -44,20 +44,21 @@ typedef struct {
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc,
+ const uint8_t src_px_size);
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static inline lv_color32_t lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg,
- lv_color_mix_alpha_cache_t * cache);
+static inline lv_color32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg,
+ lv_color_mix_alpha_cache_t * cache);
static void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache);
-LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src,
- lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache);
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride);
+static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src,
+ lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache);
+static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride);
/**********************
* STATIC VARIABLES
@@ -135,7 +136,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, ui
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -244,7 +245,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_
}
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc)
{
switch(dsc->src_color_format) {
case LV_COLOR_FORMAT_RGB565:
@@ -269,7 +270,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -364,7 +365,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size)
+static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size)
{
int32_t w = dsc->dest_w;
@@ -482,7 +483,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -570,7 +571,7 @@ LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_d
}
}
-LV_ATTRIBUTE_FAST_MEM static inline lv_color32_t lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg,
+static inline lv_color32_t LV_ATTRIBUTE_FAST_MEM lv_color_32_32_mix(lv_color32_t fg, lv_color32_t bg,
lv_color_mix_alpha_cache_t * cache)
{
/*Pick the foreground if it's fully opaque or the Background is fully transparent*/
@@ -619,7 +620,7 @@ void lv_color_mix_with_alpha_cache_init(lv_color_mix_alpha_cache_t * cache)
cache->ratio_saved = 255;
}
-LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src,
+static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(lv_color32_t * dest, lv_color32_t src,
lv_blend_mode_t mode, lv_color_mix_alpha_cache_t * cache)
{
lv_color32_t res;
@@ -647,7 +648,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(lv_color32_t * d
*dest = lv_color_32_32_mix(res, *dest, cache);
}
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride)
+static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride)
{
return (void *)((uint8_t *)buf + stride);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h
index 66299f4e2..cfd431683 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_argb8888.h
@@ -28,9 +28,9 @@ extern "C" {
* GLOBAL PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_argb8888(_lv_draw_sw_blend_fill_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_argb8888(_lv_draw_sw_blend_image_dsc_t * dsc);
/**********************
* MACROS
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c
index 634ed7b46..84c19398d 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.c
@@ -19,7 +19,7 @@
#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON
#include "neon/lv_blend_neon.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM
- #include "arm2d/lv_blend_helium.h"
+ #include "helium/lv_blend_helium.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM
#include LV_DRAW_SW_ASM_CUSTOM_INCLUDE
#endif
@@ -36,15 +36,16 @@
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc,
+ const uint8_t src_px_size);
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static inline uint16_t lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix);
+static inline uint16_t /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix);
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride);
+static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride);
/**********************
* STATIC VARIABLES
@@ -135,7 +136,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, ui
* @param mask
* @param mask_stride
*/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -244,32 +245,22 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fi
/*Masked with full opacity*/
else if(mask && opa >= LV_OPA_MAX) {
if(LV_RESULT_INVALID == LV_DRAW_SW_COLOR_BLEND_TO_RGB565_WITH_MASK(dsc)) {
- uint32_t c32 = color16 + ((uint32_t)color16 << 16);
for(y = 0; y < h; y++) {
- for(x = 0; x < w && ((lv_uintptr_t)(mask) & 0x3); x++) {
+ x = 0;
+ if((lv_uintptr_t)(mask) & 0x1) {
dest_buf_u16[x] = lv_color_16_16_mix(color16, dest_buf_u16[x], mask[x]);
+ x++;
}
- for(; x <= w - 4; x += 4) {
- uint32_t mask32 = *((uint32_t *)&mask[x]);
- if(mask32 == 0xFFFFFFFF) {
- if((lv_uintptr_t)&dest_buf_u16[x] & 0x3) {
- dest_buf_u16[x] = color16;
- uint32_t * d32 = (uint32_t *)(&dest_buf_u16[x + 1]);
- *d32 = c32;
- dest_buf_u16[x + 3] = color16;
- }
- else {
- uint32_t * dest32 = (uint32_t *)&dest_buf_u16[x];
- dest32[0] = c32;
- dest32[1] = c32;
- }
+ for(; x <= w - 2; x += 2) {
+ uint16_t mask16 = *((uint16_t *)&mask[x]);
+ if(mask16 == 0xFFFF) {
+ dest_buf_u16[x + 0] = color16;
+ dest_buf_u16[x + 1] = color16;
}
- else if(mask32) {
+ else if(mask16 != 0) {
dest_buf_u16[x + 0] = lv_color_16_16_mix(color16, dest_buf_u16[x + 0], mask[x + 0]);
dest_buf_u16[x + 1] = lv_color_16_16_mix(color16, dest_buf_u16[x + 1], mask[x + 1]);
- dest_buf_u16[x + 2] = lv_color_16_16_mix(color16, dest_buf_u16[x + 2], mask[x + 2]);
- dest_buf_u16[x + 3] = lv_color_16_16_mix(color16, dest_buf_u16[x + 3], mask[x + 3]);
}
}
@@ -296,7 +287,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fi
}
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc)
{
switch(dsc->src_color_format) {
case LV_COLOR_FORMAT_RGB565:
@@ -321,7 +312,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_im
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -429,7 +420,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size)
+static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t src_px_size)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -514,7 +505,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc
case LV_BLEND_MODE_MULTIPLY:
res = ((dest_buf_c16[dest_x].red * (src_buf_u8[src_x + 2] >> 3)) >> 5) << 11;
res += ((dest_buf_c16[dest_x].green * (src_buf_u8[src_x + 1] >> 2)) >> 6) << 5;
- res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 1] >> 3)) >> 5;
+ res += (dest_buf_c16[dest_x].blue * (src_buf_u8[src_x + 0] >> 3)) >> 5;
break;
default:
LV_LOG_WARN("Not supported blend mode: %d", dsc->blend_mode);
@@ -537,7 +528,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -650,7 +641,7 @@ LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_d
}
}
-LV_ATTRIBUTE_FAST_MEM static inline uint16_t lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix)
+static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_24_16_mix(const uint8_t * c1, uint16_t c2, uint8_t mix)
{
if(mix == 0) {
return c2;
@@ -667,7 +658,7 @@ LV_ATTRIBUTE_FAST_MEM static inline uint16_t lv_color_24_16_mix(const uint8_t *
}
}
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride)
+static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride)
{
return (void *)((uint8_t *)buf + stride);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h
index b87611ee2..c7482f948 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb565.h
@@ -28,9 +28,9 @@ extern "C" {
* GLOBAL PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb565(_lv_draw_sw_blend_fill_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb565(_lv_draw_sw_blend_image_dsc_t * dsc);
/**********************
* MACROS
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c
index 17860a257..84e087f9e 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.c
@@ -19,7 +19,7 @@
#if LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_NEON
#include "neon/lv_blend_neon.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_HELIUM
- #include "arm2d/lv_blend_helium.h"
+ #include "helium/lv_blend_helium.h"
#elif LV_USE_DRAW_SW_ASM == LV_DRAW_SW_ASM_CUSTOM
#include LV_DRAW_SW_ASM_CUSTOM_INCLUDE
#endif
@@ -36,17 +36,20 @@
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size);
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size,
- uint32_t src_px_size);
+static void /* LV_ATTRIBUTE_FAST_MEM */ rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc,
+ const uint8_t dest_px_size,
+ uint32_t src_px_size);
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size);
+static void /* LV_ATTRIBUTE_FAST_MEM */ argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dest_px_size);
-LV_ATTRIBUTE_FAST_MEM static inline void lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix);
+static inline void /* LV_ATTRIBUTE_FAST_MEM */ lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix);
-LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode);
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride);
+static inline void /* LV_ATTRIBUTE_FAST_MEM */ blend_non_normal_pixel(uint8_t * dest, lv_color32_t src,
+ lv_blend_mode_t mode);
+static inline void * /* LV_ATTRIBUTE_FAST_MEM */ drawbuf_next_row(const void * buf, uint32_t stride);
/**********************
* STATIC VARIABLES
@@ -124,7 +127,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, ui
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -251,7 +254,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fi
}
}
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
+void LV_ATTRIBUTE_FAST_MEM lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
{
switch(dsc->src_color_format) {
@@ -277,7 +280,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_im
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
+static void LV_ATTRIBUTE_FAST_MEM rgb565_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -373,7 +376,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb565_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size,
+static void LV_ATTRIBUTE_FAST_MEM rgb888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, const uint8_t dest_px_size,
uint32_t src_px_size)
{
int32_t w = dsc->dest_w * dest_px_size;
@@ -471,7 +474,7 @@ LV_ATTRIBUTE_FAST_MEM static void rgb888_image_blend(_lv_draw_sw_blend_image_dsc
}
}
-LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
+static void LV_ATTRIBUTE_FAST_MEM argb8888_image_blend(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size)
{
int32_t w = dsc->dest_w;
int32_t h = dsc->dest_h;
@@ -554,7 +557,7 @@ LV_ATTRIBUTE_FAST_MEM static void argb8888_image_blend(_lv_draw_sw_blend_image_d
}
}
-LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode)
+static inline void LV_ATTRIBUTE_FAST_MEM blend_non_normal_pixel(uint8_t * dest, lv_color32_t src, lv_blend_mode_t mode)
{
uint8_t res[3] = {0, 0, 0};
switch(mode) {
@@ -580,7 +583,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void blend_non_normal_pixel(uint8_t * dest,
lv_color_24_24_mix(res, dest, src.alpha);
}
-LV_ATTRIBUTE_FAST_MEM static inline void lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix)
+static inline void LV_ATTRIBUTE_FAST_MEM lv_color_24_24_mix(const uint8_t * src, uint8_t * dest, uint8_t mix)
{
if(mix == 0) return;
@@ -598,7 +601,7 @@ LV_ATTRIBUTE_FAST_MEM static inline void lv_color_24_24_mix(const uint8_t * src,
}
}
-LV_ATTRIBUTE_FAST_MEM static inline void * drawbuf_next_row(const void * buf, uint32_t stride)
+static inline void * LV_ATTRIBUTE_FAST_MEM drawbuf_next_row(const void * buf, uint32_t stride)
{
return (void *)((uint8_t *)buf + stride);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h
index 9e46ef210..a97a58bfe 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/lv_draw_sw_blend_to_rgb888.h
@@ -28,9 +28,11 @@ extern "C" {
* GLOBAL PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc, uint32_t dest_px_size);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_color_to_rgb888(_lv_draw_sw_blend_fill_dsc_t * dsc,
+ uint32_t dest_px_size);
-LV_ATTRIBUTE_FAST_MEM void lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc, uint32_t dest_px_size);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_blend_image_to_rgb888(_lv_draw_sw_blend_image_dsc_t * dsc,
+ uint32_t dest_px_size);
/**********************
* MACROS
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S
index ff3cc113f..61577e22a 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.S
@@ -1,5 +1,5 @@
/**
- * @file lv_blend_to_neon.S
+ * @file lv_blend_neon.S
*
*/
@@ -335,14 +335,14 @@ TMP_Q1 .qn q14
vmov.u8 OPA, #0xFF
.endif
- sub DST_STRIDE, DST_STRIDE, DST_W
vmvn D_A, OPA
.if dst_bpp == 16
- lsl DST_STRIDE, DST_STRIDE, #1
+ sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1
.elseif dst_bpp == 24
- add DST_STRIDE, DST_STRIDE, DST_STRIDE, lsl #1
+ sub DST_STRIDE, DST_STRIDE, DST_W
+ sub DST_STRIDE, DST_STRIDE, DST_W, lsl #1
.elseif dst_bpp >= 31
- lsl DST_STRIDE, DST_STRIDE, #2
+ sub DST_STRIDE, DST_STRIDE, DST_W, lsl #2
.endif
.if src_bpp == 0
.if mask || opa
@@ -355,14 +355,14 @@ TMP_Q1 .qn q14
convert D, dst_bpp, 1
.endif
.else
+.if src_bpp == 16
+ sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1
+.elseif src_bpp == 24
sub SRC_STRIDE, SRC_STRIDE, DST_W
- .if src_bpp == 16
- lsl SRC_STRIDE, SRC_STRIDE, #1
- .elseif src_bpp == 24
- add SRC_STRIDE, SRC_STRIDE, SRC_STRIDE, lsl #1
- .elseif src_bpp >= 31
- lsl SRC_STRIDE, SRC_STRIDE, #2
- .endif
+ sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #1
+.elseif src_bpp >= 31
+ sub SRC_STRIDE, SRC_STRIDE, DST_W, lsl #2
+.endif
.endif
mvn FG_MASK, #0
mvn BG_MASK, #0
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h
index fe284ee4a..fbe7ea9b4 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/blend/neon/lv_blend_neon.h
@@ -1,10 +1,10 @@
/**
- * @file lv_blend_to_neon.h
+ * @file lv_blend_neon.h
*
*/
-#ifndef LV_BLEND_TO_NEON_H
-#define LV_BLEND_TO_NEON_H
+#ifndef LV_BLEND_NEON_H
+#define LV_BLEND_NEON_H
#ifdef __cplusplus
extern "C" {
@@ -1292,4 +1292,4 @@ static inline lv_result_t _lv_argb8888_blend_normal_to_argb8888_mix_mask_opa_neo
} /*extern "C"*/
#endif
-#endif /*LV_BLEND_TO_NEON_H*/
+#endif /*LV_BLEND_NEON_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.c
index fb1fd8d5d..4ced5d1d0 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.c
@@ -15,7 +15,7 @@
#include "../../stdlib/lv_string.h"
#include "../../core/lv_global.h"
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
#if LV_USE_THORVG_EXTERNAL
#include
#else
@@ -147,14 +147,14 @@ void lv_draw_sw_init(void)
#endif
}
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
tvg_engine_init(TVG_ENGINE_SW, 0);
#endif
}
void lv_draw_sw_deinit(void)
{
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
tvg_engine_term(TVG_ENGINE_SW);
#endif
@@ -264,6 +264,17 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
if(draw_dsc->skew_x != 0 || draw_dsc->skew_y != 0) {
return 0;
}
+
+ bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE ||
+ draw_dsc->scale_y != LV_SCALE_NONE ? true : false;
+
+ bool masked = draw_dsc->bitmap_mask_src != NULL;
+ if(masked && transformed) return 0;
+
+ lv_color_format_t cf = draw_dsc->header.cf;
+ if(masked && (cf == LV_COLOR_FORMAT_A8 || cf == LV_COLOR_FORMAT_RGB565A8)) {
+ return 0;
+ }
}
break;
default:
@@ -383,7 +394,7 @@ static void execute_drawing(lv_draw_sw_unit_t * u)
case LV_DRAW_TASK_TYPE_MASK_RECTANGLE:
lv_draw_sw_mask_rect((lv_draw_unit_t *)u, t->draw_dsc, &t->area);
break;
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
case LV_DRAW_TASK_TYPE_VECTOR:
lv_draw_sw_vector((lv_draw_unit_t *)u, t->draw_dsc);
break;
@@ -462,12 +473,12 @@ static void rotate90_argb8888(const uint32_t * src, uint32_t * dst, int32_t srcW
static void rotate180_argb8888(const uint32_t * src, uint32_t * dst, int32_t width, int32_t height, int32_t src_stride,
int32_t dest_stride)
{
+ LV_UNUSED(dest_stride);
if(LV_RESULT_OK == LV_DRAW_SW_ROTATE180_ARGB8888(src, dst, srcWidth, srcHeight, srcStride, dstStride)) {
return ;
}
src_stride /= sizeof(uint32_t);
- dest_stride /= sizeof(uint32_t);
for(int32_t y = 0; y < height; ++y) {
int32_t dstIndex = (height - y - 1) * src_stride;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.h
index bc0e39937..23f1c58dd 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw.h
@@ -162,7 +162,7 @@ void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_are
int32_t src_w, int32_t src_h, int32_t src_stride,
const lv_draw_image_dsc_t * draw_dsc, const lv_draw_image_sup_t * sup, lv_color_format_t cf, void * dest_buf);
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
/**
* Draw vector graphics with SW render.
* @param draw_unit pointer to a draw unit
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_arc.c
index e1093b5f5..5a205c173 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_arc.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_arc.c
@@ -270,5 +270,16 @@ static void get_rounded_area(int16_t angle, int32_t radius, uint8_t thickness, l
}
}
+#else /*LV_DRAW_SW_COMPLEX*/
+
+void lv_draw_sw_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * dsc, const lv_area_t * coords)
+{
+ LV_UNUSED(draw_unit);
+ LV_UNUSED(dsc);
+ LV_UNUSED(coords);
+
+ LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled");
+}
+
#endif /*LV_DRAW_SW_COMPLEX*/
#endif /*LV_USE_DRAW_SW*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c
index f5ea57010..67b93322c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_box_shadow.c
@@ -9,6 +9,8 @@
#include "lv_draw_sw.h"
#if LV_USE_DRAW_SW
+#if LV_DRAW_SW_COMPLEX
+
#include "blend/lv_draw_sw_blend.h"
#include "../../core/lv_global.h"
#include "../../misc/lv_math.h"
@@ -34,11 +36,9 @@
/**********************
* STATIC PROTOTYPES
**********************/
-#if LV_DRAW_SW_COMPLEX
-LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t s,
- int32_t r);
-LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf);
-#endif /*LV_DRAW_SW_COMPLEX*/
+static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t s,
+ int32_t r);
+static void /* LV_ATTRIBUTE_FAST_MEM */ shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf);
/**********************
* STATIC VARIABLES
@@ -552,14 +552,11 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_
lv_free(sh_buf);
lv_free(mask_buf);
}
-#endif /*LV_USE_DRAW_SW*/
/**********************
* STATIC FUNCTIONS
**********************/
-#if LV_DRAW_SW_COMPLEX
-
/**
* Calculate a blurred corner
* @param coords Coordinates of the shadow
@@ -567,7 +564,7 @@ void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_
* @param sw shadow width
* @param r radius
*/
-LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t sw,
+static void LV_ATTRIBUTE_FAST_MEM shadow_draw_corner_buf(const lv_area_t * coords, uint16_t * sh_buf, int32_t sw,
int32_t r)
{
int32_t sw_ori = sw;
@@ -648,13 +645,13 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_draw_corner_buf(const lv_area_t * coord
int32_t x;
lv_opa_t * res_buf = (lv_opa_t *)sh_buf;
for(x = 0; x < size * size; x++) {
- res_buf[x] = sh_buf[x];
+ res_buf[x] = (lv_opa_t) sh_buf[x];
}
#endif
}
-LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf)
+static void LV_ATTRIBUTE_FAST_MEM shadow_blur_corner(int32_t size, int32_t sw, uint16_t * sh_ups_buf)
{
int32_t s_left = sw >> 1;
int32_t s_right = (sw >> 1);
@@ -726,4 +723,18 @@ LV_ATTRIBUTE_FAST_MEM static void shadow_blur_corner(int32_t size, int32_t sw, u
lv_free(sh_ups_blur_buf);
}
+
+#else /*LV_DRAW_SW_COMPLEX*/
+
+void lv_draw_sw_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_shadow_dsc_t * dsc, const lv_area_t * coords)
+{
+ LV_UNUSED(draw_unit);
+ LV_UNUSED(dsc);
+ LV_UNUSED(coords);
+
+ LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled");
+}
+
#endif /*LV_DRAW_SW_COMPLEX*/
+
+#endif /*LV_DRAW_USE_SW*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.c
index 0759d943c..2e855644c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.c
@@ -79,7 +79,7 @@ lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * g, int32_t w, int32_t h)
return item;
}
-LV_ATTRIBUTE_FAST_MEM void lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range,
+void LV_ATTRIBUTE_FAST_MEM lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range,
int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out)
{
lv_grad_color_t tmp;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.h
index 19fa697b3..09bb3771c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_gradient.h
@@ -46,8 +46,8 @@ typedef struct _lv_gradient_cache_t {
* @param frac The current part used in the range. frac is in [0; range]
*/
-LV_ATTRIBUTE_FAST_MEM void lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range,
- int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_gradient_color_calculate(const lv_grad_dsc_t * dsc, int32_t range,
+ int32_t frac, lv_grad_color_t * color_out, lv_opa_t * opa_out);
/** Get a gradient cache from the given parameters */
lv_grad_t * lv_gradient_get(const lv_grad_dsc_t * gradient, int32_t w, int32_t h);
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_img.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_img.c
index c5518e88c..2f6dcf34a 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_img.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_img.c
@@ -179,6 +179,8 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
bool transformed = draw_dsc->rotation != 0 || draw_dsc->scale_x != LV_SCALE_NONE ||
draw_dsc->scale_y != LV_SCALE_NONE ? true : false;
+ bool masked = draw_dsc->bitmap_mask_src != NULL;
+
lv_draw_sw_blend_dsc_t blend_dsc;
const lv_draw_buf_t * decoded = decoder_dsc->decoded;
const uint8_t * src_buf = decoded->data;
@@ -191,7 +193,7 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
blend_dsc.blend_mode = draw_dsc->blend_mode;
blend_dsc.src_stride = img_stride;
- if(!transformed && cf == LV_COLOR_FORMAT_A8) {
+ if(!transformed && !masked && cf == LV_COLOR_FORMAT_A8) {
lv_area_t clipped_coords;
if(!_lv_area_intersect(&clipped_coords, img_coords, draw_unit->clip_area)) return;
@@ -205,7 +207,7 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
blend_dsc.blend_area = img_coords;
lv_draw_sw_blend(draw_unit, &blend_dsc);
}
- else if(!transformed && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa <= LV_OPA_MIN) {
+ else if(!transformed && !masked && cf == LV_COLOR_FORMAT_RGB565A8 && draw_dsc->recolor_opa <= LV_OPA_MIN) {
int32_t src_h = lv_area_get_height(img_coords);
int32_t src_w = lv_area_get_width(img_coords);
blend_dsc.src_area = img_coords;
@@ -225,14 +227,33 @@ static void img_draw_core(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
lv_draw_sw_blend(draw_unit, &blend_dsc);
}
/*The simplest case just copy the pixels into the draw_buf. Blending will convert the colors if needed*/
- else if(!transformed && draw_dsc->recolor_opa <= LV_OPA_MIN) {
+ else if(!transformed && !masked && draw_dsc->recolor_opa <= LV_OPA_MIN) {
blend_dsc.src_area = img_coords;
blend_dsc.src_buf = src_buf;
blend_dsc.blend_area = img_coords;
blend_dsc.src_color_format = cf;
lv_draw_sw_blend(draw_unit, &blend_dsc);
}
- /* check whethr it is possible to accelerate the operation in synchronouse mode */
+ /*Handle masked RGB565, RGB888, XRGB888, or ARGB8888 images*/
+ else if(!transformed && masked && draw_dsc->recolor_opa <= LV_OPA_MIN) {
+ blend_dsc.src_area = img_coords;
+ blend_dsc.src_buf = src_buf;
+ blend_dsc.blend_area = img_coords;
+ blend_dsc.src_color_format = cf;
+ blend_dsc.mask_buf = draw_dsc->bitmap_mask_src->data;
+ blend_dsc.mask_stride = draw_dsc->bitmap_mask_src->header.stride;
+
+ const lv_area_t * original_area;
+ if(lv_area_get_width(&draw_dsc->original_area) < 0) original_area = img_coords;
+ else original_area = &draw_dsc->original_area;
+
+ lv_area_t a = {0, 0, draw_dsc->bitmap_mask_src->header.w - 1, draw_dsc->bitmap_mask_src->header.h - 1};
+ lv_area_align(original_area, &a, LV_ALIGN_CENTER, 0, 0);
+ blend_dsc.mask_area = &a;
+ blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
+ lv_draw_sw_blend(draw_unit, &blend_dsc);
+ }
+ /* check whether it is possible to accelerate the operation in synchronouse mode */
else if(LV_RESULT_INVALID == LV_DRAW_SW_IMAGE(transformed, /* whether require transform */
cf, /* image format */
src_buf, /* image buffer */
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_letter.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_letter.c
index 10cd35c6f..74d862e39 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_letter.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_letter.c
@@ -30,8 +30,8 @@
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc,
- lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc,
+ lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area);
/**********************
* STATIC VARIABLES
@@ -62,49 +62,60 @@ void lv_draw_sw_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t * ds
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc,
+static void LV_ATTRIBUTE_FAST_MEM draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * glyph_draw_dsc,
lv_draw_fill_dsc_t * fill_draw_dsc, const lv_area_t * fill_area)
{
if(glyph_draw_dsc) {
- if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_INVALID) {
+ switch(glyph_draw_dsc->format) {
+ case LV_FONT_GLYPH_FORMAT_NONE: {
#if LV_USE_FONT_PLACEHOLDER
- /* Draw a placeholder rectangle*/
- lv_draw_border_dsc_t border_draw_dsc;
- lv_draw_border_dsc_init(&border_draw_dsc);
- border_draw_dsc.opa = glyph_draw_dsc->opa;
- border_draw_dsc.color = glyph_draw_dsc->color;
- border_draw_dsc.width = 1;
- lv_draw_sw_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
+ /* Draw a placeholder rectangle*/
+ lv_draw_border_dsc_t border_draw_dsc;
+ lv_draw_border_dsc_init(&border_draw_dsc);
+ border_draw_dsc.opa = glyph_draw_dsc->opa;
+ border_draw_dsc.color = glyph_draw_dsc->color;
+ border_draw_dsc.width = 1;
+ lv_draw_sw_border(draw_unit, &border_draw_dsc, glyph_draw_dsc->bg_coords);
#endif
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_A8) {
- lv_area_t mask_area = *glyph_draw_dsc->letter_coords;
- mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1;
- lv_draw_sw_blend_dsc_t blend_dsc;
- lv_memzero(&blend_dsc, sizeof(blend_dsc));
- blend_dsc.color = glyph_draw_dsc->color;
- blend_dsc.opa = glyph_draw_dsc->opa;
- lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
- blend_dsc.mask_buf = draw_buf->data;
- blend_dsc.mask_area = &mask_area;
- blend_dsc.mask_stride = draw_buf->header.stride;
- blend_dsc.blend_area = glyph_draw_dsc->letter_coords;
- blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_A1:
+ case LV_FONT_GLYPH_FORMAT_A2:
+ case LV_FONT_GLYPH_FORMAT_A4:
+ case LV_FONT_GLYPH_FORMAT_A8: {
+ lv_area_t mask_area = *glyph_draw_dsc->letter_coords;
+ mask_area.x2 = mask_area.x1 + lv_draw_buf_width_to_stride(lv_area_get_width(&mask_area), LV_COLOR_FORMAT_A8) - 1;
+ lv_draw_sw_blend_dsc_t blend_dsc;
+ lv_memzero(&blend_dsc, sizeof(blend_dsc));
+ blend_dsc.color = glyph_draw_dsc->color;
+ blend_dsc.opa = glyph_draw_dsc->opa;
+ lv_draw_buf_t * draw_buf = glyph_draw_dsc->glyph_data;
+ blend_dsc.mask_buf = draw_buf->data;
+ blend_dsc.mask_area = &mask_area;
+ blend_dsc.mask_stride = draw_buf->header.stride;
+ blend_dsc.blend_area = glyph_draw_dsc->letter_coords;
+ blend_dsc.mask_res = LV_DRAW_SW_MASK_RES_CHANGED;
- lv_draw_sw_blend(draw_unit, &blend_dsc);
- }
- else if(glyph_draw_dsc->format == LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE) {
+ lv_draw_sw_blend(draw_unit, &blend_dsc);
+ }
+ break;
+ case LV_FONT_GLYPH_FORMAT_IMAGE: {
#if LV_USE_IMGFONT
- lv_draw_image_dsc_t img_dsc;
- lv_draw_image_dsc_init(&img_dsc);
- img_dsc.rotation = 0;
- img_dsc.scale_x = LV_SCALE_NONE;
- img_dsc.scale_y = LV_SCALE_NONE;
- img_dsc.opa = glyph_draw_dsc->opa;
- img_dsc.src = glyph_draw_dsc->glyph_data;
- lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
+ lv_draw_image_dsc_t img_dsc;
+ lv_draw_image_dsc_init(&img_dsc);
+ img_dsc.rotation = 0;
+ img_dsc.scale_x = LV_SCALE_NONE;
+ img_dsc.scale_y = LV_SCALE_NONE;
+ img_dsc.opa = glyph_draw_dsc->opa;
+ img_dsc.src = glyph_draw_dsc->glyph_data;
+ lv_draw_sw_image(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords);
#endif
+ }
+ break;
+ default:
+ break;
}
+
}
if(fill_draw_dsc && fill_area) {
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_line.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_line.c
index 26011f036..aa5bd622d 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_line.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_line.c
@@ -26,9 +26,9 @@
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
-LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
+static void /* LV_ATTRIBUTE_FAST_MEM */ draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc);
/**********************
* STATIC VARIABLES
@@ -97,7 +97,7 @@ void lv_draw_sw_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
/**********************
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM draw_line_hor(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
{
int32_t w = dsc->width - 1;
int32_t w_half0 = w >> 1;
@@ -152,7 +152,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(lv_draw_unit_t * draw_unit, cons
i += diff;
dash_cnt += diff;
}
- else if(dash_cnt >= dsc->dash_gap + dsc->dash_width) {
+ else if(dash_cnt > dsc->dash_gap + dsc->dash_width) {
dash_cnt = 0;
}
else {
@@ -172,7 +172,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_hor(lv_draw_unit_t * draw_unit, cons
#endif /*LV_DRAW_SW_COMPLEX*/
}
-LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM draw_line_ver(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
{
int32_t w = dsc->width - 1;
int32_t w_half0 = w >> 1;
@@ -243,7 +243,7 @@ LV_ATTRIBUTE_FAST_MEM static void draw_line_ver(lv_draw_unit_t * draw_unit, cons
#endif /*LV_DRAW_SW_COMPLEX*/
}
-LV_ATTRIBUTE_FAST_MEM static void draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
+static void LV_ATTRIBUTE_FAST_MEM draw_line_skew(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t * dsc)
{
#if LV_DRAW_SW_COMPLEX
/*Keep the great y in p1*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.c
index 5790f6742..7c44197a1 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.c
@@ -32,30 +32,30 @@
/**********************
* STATIC PROTOTYPES
**********************/
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y, int32_t len,
- lv_draw_sw_mask_line_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y, int32_t len,
- lv_draw_sw_mask_radius_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y, int32_t len,
- lv_draw_sw_mask_angle_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y, int32_t len,
- lv_draw_sw_mask_fade_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y, int32_t len,
- lv_draw_sw_mask_map_param_t * param);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y, int32_t len,
+ lv_draw_sw_mask_line_param_t * param);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y, int32_t len,
+ lv_draw_sw_mask_radius_param_t * param);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y, int32_t len,
+ lv_draw_sw_mask_angle_param_t * param);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y, int32_t len,
+ lv_draw_sw_mask_fade_param_t * param);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y, int32_t len,
+ lv_draw_sw_mask_map_param_t * param);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y,
- int32_t len,
- lv_draw_sw_mask_line_param_t * p);
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y,
- int32_t len,
- lv_draw_sw_mask_line_param_t * p);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y,
+ int32_t len,
+ lv_draw_sw_mask_line_param_t * p);
+static lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x,
+ int32_t abs_y,
+ int32_t len,
+ lv_draw_sw_mask_line_param_t * p);
static void circ_init(lv_point_t * c, int32_t * tmp, int32_t radius);
static bool circ_cont(lv_point_t * c);
@@ -63,7 +63,7 @@ static void circ_next(lv_point_t * c, int32_t * tmp);
static void circ_calc_aa4(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t radius);
static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_t y, int32_t * len,
int32_t * x_start);
-LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new);
+static inline lv_opa_t /* LV_ATTRIBUTE_FAST_MEM */ mask_mix(lv_opa_t mask_act, lv_opa_t mask_new);
/**********************
* STATIC VARIABLES
@@ -87,7 +87,7 @@ void lv_draw_sw_mask_deinit(void)
lv_mutex_delete(&circle_cache_mutex);
}
-LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_res_t lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x,
+lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y,
int32_t len)
{
@@ -378,7 +378,7 @@ void lv_draw_sw_mask_map_init(lv_draw_sw_mask_map_param_t * param, const lv_area
* STATIC FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_line(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y, int32_t len,
lv_draw_sw_mask_line_param_t * p)
{
@@ -438,7 +438,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_line(lv_opa_t *
return res;
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_flat(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y,
int32_t len,
lv_draw_sw_mask_line_param_t * p)
@@ -555,7 +555,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_flat(lv_opa_t * mas
return LV_DRAW_SW_MASK_RES_CHANGED;
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM line_mask_steep(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y,
int32_t len,
lv_draw_sw_mask_line_param_t * p)
@@ -698,7 +698,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t line_mask_steep(lv_opa_t * ma
return LV_DRAW_SW_MASK_RES_CHANGED;
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_angle(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y, int32_t len,
lv_draw_sw_mask_angle_param_t * p)
{
@@ -836,7 +836,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_angle(lv_opa_t *
}
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_radius(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y, int32_t len,
lv_draw_sw_mask_radius_param_t * p)
{
@@ -946,7 +946,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_radius(lv_opa_t
return LV_DRAW_SW_MASK_RES_CHANGED;
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_fade(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y, int32_t len,
lv_draw_sw_mask_fade_param_t * p)
{
@@ -992,7 +992,7 @@ LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_fade(lv_opa_t *
}
}
-LV_ATTRIBUTE_FAST_MEM static lv_draw_sw_mask_res_t lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x,
+static lv_draw_sw_mask_res_t LV_ATTRIBUTE_FAST_MEM lv_draw_mask_map(lv_opa_t * mask_buf, int32_t abs_x,
int32_t abs_y, int32_t len,
lv_draw_sw_mask_map_param_t * p)
{
@@ -1224,7 +1224,7 @@ static lv_opa_t * get_next_line(_lv_draw_sw_mask_radius_circle_dsc_t * c, int32_
return &c->cir_opa[c->opa_start_on_y[y]];
}
-LV_ATTRIBUTE_FAST_MEM static inline lv_opa_t mask_mix(lv_opa_t mask_act, lv_opa_t mask_new)
+static inline lv_opa_t LV_ATTRIBUTE_FAST_MEM mask_mix(lv_opa_t mask_act, lv_opa_t mask_new)
{
if(mask_new >= LV_OPA_MAX) return mask_act;
if(mask_new <= LV_OPA_MIN) return 0;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.h b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.h
index 9cde01683..65290375f 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask.h
@@ -200,9 +200,10 @@ void lv_draw_sw_mask_deinit(void);
* - `LV_DRAW_MASK_RES_FULL_COVER`: the whole line is fully visible. `mask_buf` is unchanged
* - `LV_DRAW_MASK_RES_CHANGED`: `mask_buf` has changed, it shows the desired opacity of each pixel in the given line
*/
-LV_ATTRIBUTE_FAST_MEM lv_draw_sw_mask_res_t lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf, int32_t abs_x,
- int32_t abs_y,
- int32_t len);
+lv_draw_sw_mask_res_t /* LV_ATTRIBUTE_FAST_MEM */ lv_draw_sw_mask_apply(void * masks[], lv_opa_t * mask_buf,
+ int32_t abs_x,
+ int32_t abs_y,
+ int32_t len);
//! @endcond
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c
index 1f800a6d5..919758cbf 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_mask_rect.c
@@ -117,5 +117,16 @@ void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_ds
* STATIC FUNCTIONS
**********************/
+#else /*LV_DRAW_SW_COMPLEX*/
+
+void lv_draw_sw_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_rect_dsc_t * dsc, const lv_area_t * coords)
+{
+ LV_UNUSED(draw_unit);
+ LV_UNUSED(dsc);
+ LV_UNUSED(coords);
+
+ LV_LOG_WARN("LV_DRAW_SW_COMPLEX needs to be enabled");
+}
+
#endif /*LV_DRAW_SW_COMPLEX*/
#endif /*LV_USE_DRAW_SW*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_transform.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_transform.c
index d835f58e1..71fadd7de 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_transform.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_transform.c
@@ -88,8 +88,8 @@ void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_are
point_transform_dsc_t tr_dsc;
tr_dsc.angle = -draw_dsc->rotation;
- tr_dsc.scale_x = (256 * 256) / draw_dsc->scale_x;
- tr_dsc.scale_y = (256 * 256) / draw_dsc->scale_y;
+ tr_dsc.scale_x = draw_dsc->scale_x;
+ tr_dsc.scale_y = draw_dsc->scale_y;
tr_dsc.pivot = draw_dsc->pivot;
int32_t angle_low = tr_dsc.angle / 10;
@@ -133,7 +133,7 @@ void lv_draw_sw_transform(lv_draw_unit_t * draw_unit, const lv_area_t * dest_are
alpha_buf = NULL;
}
- bool aa = draw_dsc->antialias;
+ bool aa = (bool) draw_dsc->antialias;
bool is_rotated = draw_dsc->rotation;
int32_t xs_ups = 0, ys_ups = 0, ys_ups_start = 0, ys_step_256_original = 0;
@@ -341,7 +341,6 @@ static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h
int32_t xs_ups, int32_t ys_ups, int32_t xs_step, int32_t ys_step,
int32_t x_end, uint8_t * dest_buf, bool aa)
{
- // lv_memzero(dest_buf, x_end * 4);
int32_t xs_ups_start = xs_ups;
int32_t ys_ups_start = ys_ups;
lv_color32_t * dest_c32 = (lv_color32_t *) dest_buf;
@@ -384,10 +383,7 @@ static void transform_argb8888(const uint8_t * src, int32_t src_w, int32_t src_h
ys_fract = ys_fract - 0x80;
}
- const lv_color32_t * src_c32 = (const lv_color32_t *)src;
- src_c32 += (ys_int * src_stride) + xs_int;
-
- src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4);
+ const lv_color32_t * src_c32 = (const lv_color32_t *)(src + ys_int * src_stride + xs_int * 4);
dest_c32[x] = src_c32[0];
@@ -534,6 +530,9 @@ static void transform_rgb565a8(const uint8_t * src, int32_t src_w, int32_t src_h
else if((ys_int == 0 && y_next < 0) || (ys_int == src_h - 1 && y_next > 0)) {
abuf[x] = (a * (0xFF - ys_fract)) >> 8;
}
+ else {
+ abuf[x] = a;
+ }
}
}
}
@@ -625,16 +624,16 @@ static void transform_point_upscaled(point_transform_dsc_t * t, int32_t xin, int
yin -= t->pivot.y;
if(t->angle == 0) {
- *xout = ((int32_t)(xin * t->scale_x)) + (t->pivot_x_256);
- *yout = ((int32_t)(yin * t->scale_y)) + (t->pivot_y_256);
+ *xout = ((int32_t)(xin * 256 * 256 / t->scale_x)) + (t->pivot_x_256);
+ *yout = ((int32_t)(yin * 256 * 256 / t->scale_y)) + (t->pivot_y_256);
}
else if(t->scale_x == LV_SCALE_NONE && t->scale_y == LV_SCALE_NONE) {
*xout = ((t->cosma * xin - t->sinma * yin) >> 2) + (t->pivot_x_256);
*yout = ((t->sinma * xin + t->cosma * yin) >> 2) + (t->pivot_y_256);
}
else {
- *xout = (((t->cosma * xin - t->sinma * yin) * t->scale_x) >> 10) + (t->pivot_x_256);
- *yout = (((t->sinma * xin + t->cosma * yin) * t->scale_y) >> 10) + (t->pivot_y_256);
+ *xout = (((t->cosma * xin - t->sinma * yin) * 256 / t->scale_x) >> 2) + (t->pivot_x_256);
+ *yout = (((t->sinma * xin + t->cosma * yin) * 256 / t->scale_y) >> 2) + (t->pivot_y_256);
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_vector.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_vector.c
index bd20df39c..8a4bca92a 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_vector.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_vector.c
@@ -8,7 +8,7 @@
*********************/
#include "lv_draw_sw.h"
-#if LV_USE_VECTOR_GRAPHIC && (LV_USE_THORVG_EXTERNAL || LV_USE_THORVG_INTERNAL)
+#if LV_USE_VECTOR_GRAPHIC && LV_USE_THORVG
#if LV_USE_THORVG_EXTERNAL
#include
#else
@@ -86,9 +86,10 @@ static void _set_paint_matrix(Tvg_Paint * obj, const Tvg_Matrix * m)
static void _set_paint_shape(Tvg_Paint * obj, const lv_vector_path_t * p)
{
uint32_t pidx = 0;
- for(uint32_t i = 0; i < p->ops.size; i++) {
- lv_vector_path_op_t * op = lv_array_at(&p->ops, i);
- switch(*op) {
+ lv_vector_path_op_t * op = lv_array_front(&p->ops);
+ uint32_t size = lv_array_size(&p->ops);
+ for(uint32_t i = 0; i < size; i++) {
+ switch(op[i]) {
case LV_VECTOR_PATH_OP_MOVE_TO: {
lv_fpoint_t * pt = lv_array_at(&p->points, pidx);
tvg_shape_move_to(obj, pt->x, pt->y);
@@ -243,7 +244,7 @@ static void _set_paint_stroke(Tvg_Paint * obj, const lv_vector_stroke_dsc_t * ds
tvg_shape_set_stroke_join(obj, _lv_stroke_join_to_tvg(dsc->join));
if(!lv_array_is_empty(&dsc->dash_pattern)) {
- float * dash_array = lv_array_at(&dsc->dash_pattern, 0);
+ float * dash_array = lv_array_front(&dsc->dash_pattern);
tvg_shape_set_stroke_dash(obj, dash_array, dsc->dash_pattern.size);
}
}
@@ -391,7 +392,7 @@ static void _task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_ve
_lv_area_to_tvg(&rc, &dsc->scissor_area);
_tvg_color c;
- _lv_color_to_tvg(&c, &dsc->fill_dsc.color, LV_OPA_COVER);
+ _lv_color_to_tvg(&c, &dsc->fill_dsc.color, dsc->fill_dsc.opa);
Tvg_Matrix mtx = {
1.0f, 0.0f, 0.0f,
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c
index ad49c4a52..e461550ff 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite.c
@@ -16,6 +16,8 @@
#include "lv_vg_lite_path.h"
#include "lv_vg_lite_utils.h"
#include "lv_vg_lite_decoder.h"
+#include "lv_vg_lite_grad.h"
+#include "lv_vg_lite_pending.h"
/*********************
* DEFINES
@@ -69,8 +71,9 @@ void lv_draw_vg_lite_init(void)
unit->base_unit.evaluate_cb = draw_evaluate;
unit->base_unit.delete_cb = draw_delete;
+ lv_vg_lite_image_dsc_init(unit);
+ lv_vg_lite_grad_init(unit);
lv_vg_lite_path_init(unit);
-
lv_vg_lite_decoder_init();
}
@@ -82,6 +85,18 @@ void lv_draw_vg_lite_deinit(void)
* STATIC FUNCTIONS
**********************/
+static bool check_image_is_supported(const lv_draw_image_dsc_t * dsc)
+{
+ lv_image_header_t header;
+ lv_result_t res = lv_image_decoder_get_info(dsc->src, &header);
+ if(res != LV_RESULT_OK) {
+ LV_LOG_TRACE("get image info failed");
+ return false;
+ }
+
+ return lv_vg_lite_is_src_cf_supported(header.cf);
+}
+
static void draw_execute(lv_draw_vg_lite_unit_t * u)
{
lv_draw_task_t * t = u->task_act;
@@ -91,6 +106,9 @@ static void draw_execute(lv_draw_vg_lite_unit_t * u)
lv_vg_lite_buffer_from_draw_buf(&u->target_buffer, layer->draw_buf);
+ /* VG-Lite will output premultiplied image, set the flag correspondingly. */
+ lv_draw_buf_set_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED);
+
vg_lite_identity(&u->global_matrix);
vg_lite_translate(-layer->buf_area.x1, -layer->buf_area.y1, &u->global_matrix);
@@ -134,21 +152,15 @@ static void draw_execute(lv_draw_vg_lite_unit_t * u)
break;
}
-#if LV_USE_PARALLEL_DRAW_DEBUG
- /* Layers manage it for themselves. */
- if(t->type != LV_DRAW_TASK_TYPE_LAYER) {
- }
-#endif
-
- LV_VG_LITE_CHECK_ERROR(vg_lite_finish());
+ lv_vg_lite_flush(u);
}
static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer)
{
- lv_draw_vg_lite_unit_t * draw_vg_lite_unit = (lv_draw_vg_lite_unit_t *)draw_unit;
+ lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;
/* Return immediately if it's busy with draw task. */
- if(draw_vg_lite_unit->task_act) {
+ if(u->task_act) {
return 0;
}
@@ -157,6 +169,7 @@ static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer)
/* Return 0 is no selection, some tasks can be supported by other units. */
if(!t || t->preferred_draw_unit_id != VG_LITE_DRAW_UNIT_ID) {
+ lv_vg_lite_finish(u);
return -1;
}
@@ -171,16 +184,16 @@ static int32_t draw_dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer)
}
t->state = LV_DRAW_TASK_STATE_IN_PROGRESS;
- draw_vg_lite_unit->base_unit.target_layer = layer;
- draw_vg_lite_unit->base_unit.clip_area = &t->clip_area;
- draw_vg_lite_unit->task_act = t;
+ u->base_unit.target_layer = layer;
+ u->base_unit.clip_area = &t->clip_area;
+ u->task_act = t;
- draw_execute(draw_vg_lite_unit);
+ draw_execute(u);
- draw_vg_lite_unit->task_act->state = LV_DRAW_TASK_STATE_READY;
- draw_vg_lite_unit->task_act = NULL;
+ u->task_act->state = LV_DRAW_TASK_STATE_READY;
+ u->task_act = NULL;
- /* The draw unit is free now. Request a new dispatching as it can get a new task. */
+ /*The draw unit is free now. Request a new dispatching as it can get a new task*/
lv_draw_dispatch_request();
return 1;
@@ -194,29 +207,44 @@ static int32_t draw_evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task)
case LV_DRAW_TASK_TYPE_LABEL:
case LV_DRAW_TASK_TYPE_FILL:
case LV_DRAW_TASK_TYPE_BORDER:
+#if LV_VG_LITE_USE_BOX_SHADOW
case LV_DRAW_TASK_TYPE_BOX_SHADOW:
- case LV_DRAW_TASK_TYPE_IMAGE:
+#endif
case LV_DRAW_TASK_TYPE_LAYER:
case LV_DRAW_TASK_TYPE_LINE:
case LV_DRAW_TASK_TYPE_ARC:
case LV_DRAW_TASK_TYPE_TRIANGLE:
case LV_DRAW_TASK_TYPE_MASK_RECTANGLE:
- // case LV_DRAW_TASK_TYPE_MASK_BITMAP:
+
#if LV_USE_VECTOR_GRAPHIC
case LV_DRAW_TASK_TYPE_VECTOR:
#endif
- task->preference_score = 80;
- task->preferred_draw_unit_id = VG_LITE_DRAW_UNIT_ID;
- return 1;
- default:
break;
+
+ case LV_DRAW_TASK_TYPE_IMAGE: {
+ if(!check_image_is_supported(task->draw_dsc)) {
+ return 0;
+ }
+ }
+ break;
+
+ default:
+ /*The draw unit is not able to draw this task. */
+ return 0;
}
- return 0;
+
+ /* The draw unit is able to draw this task. */
+ task->preference_score = 80;
+ task->preferred_draw_unit_id = VG_LITE_DRAW_UNIT_ID;
+ return 1;
}
static int32_t draw_delete(lv_draw_unit_t * draw_unit)
{
lv_draw_vg_lite_unit_t * unit = (lv_draw_vg_lite_unit_t *)draw_unit;
+
+ lv_vg_lite_image_dsc_deinit(unit);
+ lv_vg_lite_grad_deinit(unit);
lv_vg_lite_path_deinit(unit);
lv_vg_lite_decoder_deinit();
return 1;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c
index a253b6148..74e63bbaf 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_arc.c
@@ -14,6 +14,7 @@
#include "lv_draw_vg_lite_type.h"
#include "lv_vg_lite_math.h"
#include "lv_vg_lite_path.h"
+#include "lv_vg_lite_pending.h"
#include "lv_vg_lite_utils.h"
#include
@@ -83,6 +84,8 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
return;
}
+ LV_PROFILER_BEGIN;
+
lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
lv_vg_lite_path_set_quality(path, VG_LITE_HIGH);
lv_vg_lite_path_set_bonding_box_area(path, &clip_area);
@@ -112,6 +115,8 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
float end_x = radius_in * MATH_COSF(end_angle_rad) + cx;
float end_y = radius_in * MATH_SINF(end_angle_rad) + cy;
+ lv_vg_lite_path_move_to(path, start_x, start_y);
+
/* radius_out arc */
lv_vg_lite_path_append_arc(path,
cx, cy,
@@ -132,7 +137,6 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
false);
/* close arc */
- lv_vg_lite_path_line_to(path, start_x, start_y);
lv_vg_lite_path_close(path);
/* draw round */
@@ -159,7 +163,9 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_lite_path,
@@ -167,6 +173,7 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
&matrix,
VG_LITE_BLEND_SRC_OVER,
color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
if(dsc->img_src) {
vg_lite_buffer_t src_buf;
@@ -174,6 +181,14 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
if(lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->img_src, false)) {
vg_lite_matrix_t path_matrix;
vg_lite_identity(&path_matrix);
+ lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix);
+
+ /* move image to center */
+ vg_lite_translate(cx - radius_out, cy - radius_out, &matrix);
+
+ LV_VG_LITE_ASSERT_MATRIX(&path_matrix);
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern(
&u->target_buffer,
vg_lite_path,
@@ -186,11 +201,13 @@ void lv_draw_vg_lite_arc(lv_draw_unit_t * draw_unit, const lv_draw_arc_dsc_t * d
0,
color,
VG_LITE_FILTER_BI_LINEAR));
- lv_image_decoder_close(&decoder_dsc);
+ LV_PROFILER_END_TAG("vg_lite_draw_pattern");
+ lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc);
}
}
lv_vg_lite_path_drop(u, path);
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c
index 757e2ea22..f60b72f33 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_border.c
@@ -57,18 +57,20 @@ void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc
return;
}
+ LV_PROFILER_BEGIN;
+
int32_t w = lv_area_get_width(coords);
int32_t h = lv_area_get_height(coords);
- int32_t r_out = dsc->radius;
- if(r_out) {
- int32_t r_short = LV_MIN(w, h) / 2;
+ float r_out = dsc->radius;
+ if(dsc->radius) {
+ float r_short = LV_MIN(w, h) / 2.0f;
r_out = LV_MIN(r_out, r_short);
}
int32_t border_w = dsc->width;
- int32_t r_in = LV_MAX(0, r_out - border_w);
+ float r_in = LV_MAX(0, r_out - border_w);
- lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16);
+ lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH);
lv_vg_lite_path_set_bonding_box_area(path, &clip_area);
@@ -96,7 +98,9 @@ void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_lite_path,
@@ -104,8 +108,10 @@ void lv_draw_vg_lite_border(lv_draw_unit_t * draw_unit, const lv_draw_border_dsc
&matrix,
VG_LITE_BLEND_SRC_OVER,
color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
lv_vg_lite_path_drop(u, path);
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c
index c9e00c4d3..e5cc00897 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_box_shadow.c
@@ -62,6 +62,8 @@ void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_sh
lv_area_t draw_area;
if(!_lv_area_intersect(&draw_area, &shadow_area, draw_unit->clip_area)) return;
+ LV_PROFILER_BEGIN;
+
lv_draw_border_dsc_t border_dsc;
lv_draw_border_dsc_init(&border_dsc);
border_dsc.width = 3;
@@ -88,6 +90,7 @@ void lv_draw_vg_lite_box_shadow(lv_draw_unit_t * draw_unit, const lv_draw_box_sh
lv_draw_vg_lite_fill(draw_unit, &fill_dsc, &core_area);
}
}
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c
index 459fd47fb..ea52815eb 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_fill.c
@@ -14,6 +14,7 @@
#include "lv_draw_vg_lite_type.h"
#include "lv_vg_lite_path.h"
#include "lv_vg_lite_utils.h"
+#include "lv_vg_lite_grad.h"
/*********************
* DEFINES
@@ -57,19 +58,21 @@ void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t *
return;
}
+ LV_PROFILER_BEGIN;
+
vg_lite_matrix_t matrix;
vg_lite_identity(&matrix);
lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix);
int32_t w = lv_area_get_width(coords);
int32_t h = lv_area_get_height(coords);
- int32_t r = dsc->radius;
- if(r) {
- int32_t r_short = LV_MIN(w, h) / 2;
+ float r = dsc->radius;
+ if(dsc->radius) {
+ float r_short = LV_MIN(w, h) / 2.0f;
r = LV_MIN(r, r_short);
}
- lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16);
+ lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
lv_vg_lite_path_set_quality(path, dsc->radius == 0 ? VG_LITE_LOW : VG_LITE_HIGH);
lv_vg_lite_path_set_bonding_box_area(path, &clip_area);
lv_vg_lite_path_append_rect(path, coords->x1, coords->y1, w, h, r, r);
@@ -79,19 +82,24 @@ void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t *
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
if(dsc->grad.dir != LV_GRAD_DIR_NONE) {
+ vg_lite_matrix_t grad_matrix;
+ lv_vg_lite_grad_area_to_matrix(&grad_matrix, coords, dsc->grad.dir);
lv_vg_lite_draw_linear_grad(
+ u,
&u->target_buffer,
vg_lite_path,
- coords,
&dsc->grad,
+ &grad_matrix,
&matrix,
VG_LITE_FILL_EVEN_ODD,
VG_LITE_BLEND_SRC_OVER);
}
else { /* normal fill */
vg_lite_color_t color = lv_vg_lite_color(dsc->color, dsc->opa, true);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_lite_path,
@@ -99,9 +107,12 @@ void lv_draw_vg_lite_fill(lv_draw_unit_t * draw_unit, const lv_draw_fill_dsc_t *
&matrix,
VG_LITE_BLEND_SRC_OVER,
color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
}
lv_vg_lite_path_drop(u, path);
+
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c
index 05c8debd0..10b217bcf 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_img.c
@@ -14,6 +14,7 @@
#include "lv_draw_vg_lite_type.h"
#include "lv_vg_lite_decoder.h"
#include "lv_vg_lite_path.h"
+#include "lv_vg_lite_pending.h"
#include "lv_vg_lite_utils.h"
/*********************
@@ -69,9 +70,12 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
return;
}
+ LV_PROFILER_BEGIN;
+
vg_lite_buffer_t src_buf;
lv_image_decoder_dsc_t decoder_dsc;
if(!lv_vg_lite_buffer_open_image(&src_buf, &decoder_dsc, dsc->src, no_cache)) {
+ LV_PROFILER_END;
return;
}
@@ -107,6 +111,8 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
/* rect is used to crop the pixel-aligned padding area */
vg_lite_rectangle_t rect;
lv_vg_lite_rect(&rect, &src_area);
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect");
LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect(
&u->target_buffer,
&src_buf,
@@ -115,9 +121,10 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
lv_vg_lite_blend_mode(dsc->blend_mode),
color,
filter));
+ LV_PROFILER_END_TAG("vg_lite_blit_rect");
}
else {
- lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16);
+ lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
lv_vg_lite_path_append_rect(
path,
clip_area.x1, clip_area.y1,
@@ -131,7 +138,9 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
vg_lite_matrix_t path_matrix;
vg_lite_identity(&path_matrix);
+ lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern(
&u->target_buffer,
vg_lite_path,
@@ -144,11 +153,13 @@ void lv_draw_vg_lite_img(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t *
0,
color,
filter));
+ LV_PROFILER_END_TAG("vg_lite_draw_pattern");
lv_vg_lite_path_drop(u, path);
}
- lv_image_decoder_close(&decoder_dsc);
+ lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc);
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c
index 91bcf2e2d..6c422aecb 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_label.c
@@ -9,7 +9,7 @@
#include "lv_draw_vg_lite.h"
-#include "../../libs/freetype/lv_freetype.h"
+#include "../../lvgl.h"
#if LV_USE_DRAW_VG_LITE
@@ -21,7 +21,7 @@
* DEFINES
*********************/
-#define PATH_QUALITY VG_LITE_MEDIUM
+#define PATH_QUALITY VG_LITE_HIGH
#define PATH_DATA_COORD_FORMAT VG_LITE_S16
#define FT_F26DOT6_SHIFT 6
@@ -65,6 +65,8 @@ void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t
{
if(dsc->opa <= LV_OPA_MIN) return;
+ LV_PROFILER_BEGIN;
+
#if LV_USE_FREETYPE
static bool is_init = false;
if(!is_init) {
@@ -74,6 +76,7 @@ void lv_draw_vg_lite_label(lv_draw_unit_t * draw_unit, const lv_draw_label_dsc_t
#endif /* LV_USE_FREETYPE */
lv_draw_label_iterate_characters(draw_unit, dsc, coords, draw_letter_cb);
+ LV_PROFILER_END;
}
/**********************
@@ -85,15 +88,17 @@ static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * gly
{
lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;
if(glyph_draw_dsc) {
-
switch(glyph_draw_dsc->format) {
- case LV_DRAW_LETTER_BITMAP_FORMAT_A8: {
+ case LV_FONT_GLYPH_FORMAT_A1:
+ case LV_FONT_GLYPH_FORMAT_A2:
+ case LV_FONT_GLYPH_FORMAT_A4:
+ case LV_FONT_GLYPH_FORMAT_A8: {
draw_letter_bitmap(u, glyph_draw_dsc);
}
break;
#if LV_USE_FREETYPE
- case LV_DRAW_LETTER_VECTOR_FORMAT: {
+ case LV_FONT_GLYPH_FORMAT_VECTOR: {
if(lv_freetype_is_outline_font(glyph_draw_dsc->g->resolved_font)) {
draw_letter_outline(u, glyph_draw_dsc);
}
@@ -101,17 +106,17 @@ static void draw_letter_cb(lv_draw_unit_t * draw_unit, lv_draw_glyph_dsc_t * gly
break;
#endif /* LV_USE_FREETYPE */
- case LV_DRAW_LETTER_BITMAP_FORMAT_IMAGE: {
- lv_draw_image_dsc_t img_dsc;
- lv_draw_image_dsc_init(&img_dsc);
- img_dsc.opa = glyph_draw_dsc->opa;
- img_dsc.src = glyph_draw_dsc->glyph_data;
- lv_draw_vg_lite_img(draw_unit, &img_dsc, glyph_draw_dsc->letter_coords, false);
+ case LV_FONT_GLYPH_FORMAT_IMAGE: {
+ lv_draw_image_dsc_t image_dsc;
+ lv_draw_image_dsc_init(&image_dsc);
+ image_dsc.opa = glyph_draw_dsc->opa;
+ image_dsc.src = glyph_draw_dsc->glyph_data;
+ lv_draw_vg_lite_img(draw_unit, &image_dsc, glyph_draw_dsc->letter_coords, false);
}
break;
#if LV_USE_FONT_PLACEHOLDER
- case LV_DRAW_LETTER_BITMAP_FORMAT_INVALID: {
+ case LV_FONT_GLYPH_FORMAT_NONE: {
/* Draw a placeholder rectangle*/
lv_draw_border_dsc_t border_draw_dsc;
lv_draw_border_dsc_init(&border_draw_dsc);
@@ -140,6 +145,8 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
return;
}
+ LV_PROFILER_BEGIN;
+
lv_area_t image_area = *dsc->letter_coords;
vg_lite_matrix_t matrix;
@@ -166,6 +173,7 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
/* rect is used to crop the pixel-aligned padding area */
vg_lite_rectangle_t rect;
lv_vg_lite_rect(&rect, &src_area);
+ LV_PROFILER_BEGIN_TAG("vg_lite_blit_rect");
LV_VG_LITE_CHECK_ERROR(vg_lite_blit_rect(
&u->target_buffer,
&src_buf,
@@ -174,6 +182,7 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
VG_LITE_BLEND_SRC_OVER,
color,
VG_LITE_FILTER_LINEAR));
+ LV_PROFILER_END_TAG("vg_lite_blit_rect");
}
else {
lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_S16);
@@ -190,7 +199,9 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
vg_lite_matrix_t path_matrix;
vg_lite_identity(&path_matrix);
+ lv_vg_lite_matrix_multiply(&path_matrix, &u->global_matrix);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern(
&u->target_buffer,
vg_lite_path,
@@ -203,6 +214,7 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
color,
color,
VG_LITE_FILTER_LINEAR));
+ LV_PROFILER_END_TAG("vg_lite_draw_pattern");
lv_vg_lite_path_drop(u, path);
}
@@ -211,7 +223,8 @@ static void draw_letter_bitmap(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_d
* You need to wait for the GPU to finish using the buffer before releasing it.
* Later, use the font cache for management to improve efficiency.
*/
- LV_VG_LITE_CHECK_ERROR(vg_lite_finish());
+ lv_vg_lite_finish(u);
+ LV_PROFILER_END;
}
#if LV_USE_FREETYPE
@@ -224,6 +237,8 @@ static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_
return;
}
+ LV_PROFILER_BEGIN;
+
/* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */
path_clip_area.x2++;
path_clip_area.y2++;
@@ -249,6 +264,7 @@ static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_
vg_lite_matrix_t result;
if(!lv_vg_lite_matrix_inverse(&result, &matrix)) {
LV_LOG_ERROR("no inverse matrix");
+ LV_PROFILER_END;
return;
}
@@ -269,13 +285,23 @@ static void draw_letter_outline(lv_draw_vg_lite_unit_t * u, const lv_draw_glyph_
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer, vg_lite_path, VG_LITE_FILL_NON_ZERO,
&matrix, VG_LITE_BLEND_SRC_OVER, lv_vg_lite_color(dsc->color, dsc->opa, true)));
+ LV_PROFILER_END_TAG("vg_lite_draw");
+
+ /* Flush in time to avoid accumulation of drawing commands */
+ lv_vg_lite_flush(u);
+
+ LV_PROFILER_END;
}
static void vg_lite_outline_push(const lv_freetype_outline_event_param_t * param)
{
+ LV_PROFILER_BEGIN;
lv_vg_lite_path_t * outline = param->outline;
LV_ASSERT_NULL(outline);
@@ -304,15 +330,18 @@ static void vg_lite_outline_push(const lv_freetype_outline_event_param_t * param
LV_ASSERT(false);
break;
}
+ LV_PROFILER_END;
}
static void freetype_outline_event_cb(lv_event_t * e)
{
+ LV_PROFILER_BEGIN;
lv_event_code_t code = lv_event_get_code(e);
lv_freetype_outline_event_param_t * param = lv_event_get_param(e);
switch(code) {
case LV_EVENT_CREATE:
param->outline = lv_vg_lite_path_create(PATH_DATA_COORD_FORMAT);
+ lv_vg_lite_path_set_quality(param->outline, PATH_QUALITY);
break;
case LV_EVENT_DELETE:
lv_vg_lite_path_destroy(param->outline);
@@ -324,6 +353,7 @@ static void freetype_outline_event_cb(lv_event_t * e)
LV_LOG_WARN("unknown event code: %d", code);
break;
}
+ LV_PROFILER_END;
}
#endif /* LV_USE_FREETYPE */
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c
index 9476c6c02..f79f4188f 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_layer.c
@@ -42,18 +42,29 @@ void lv_draw_vg_lite_layer(lv_draw_unit_t * draw_unit, const lv_draw_image_dsc_t
const lv_area_t * coords)
{
lv_layer_t * layer = (lv_layer_t *)draw_dsc->src;
+ struct _lv_draw_vg_lite_unit_t * u = (struct _lv_draw_vg_lite_unit_t *)draw_unit;
/*It can happen that nothing was draw on a layer and therefore its buffer is not allocated.
*In this case just return. */
if(layer->draw_buf == NULL)
return;
+ LV_PROFILER_BEGIN;
+
/* The GPU output should already be premultiplied RGB */
- layer->draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED;
+ if(!lv_draw_buf_has_flag(layer->draw_buf, LV_IMAGE_FLAGS_PREMULTIPLIED)) {
+ LV_LOG_WARN("Non-premultiplied layer buffer for GPU to draw.");
+ }
lv_draw_image_dsc_t new_draw_dsc = *draw_dsc;
new_draw_dsc.src = layer->draw_buf;
lv_draw_vg_lite_img(draw_unit, &new_draw_dsc, coords, true);
+
+ /* Wait for the GPU drawing to complete here,
+ * otherwise it may cause the drawing to fail. */
+ lv_vg_lite_finish(u);
+
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c
index 26d9d9f4a..f986950cc 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_line.c
@@ -69,6 +69,8 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
return; /*Fully clipped, nothing to do*/
}
+ LV_PROFILER_BEGIN;
+
lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;
int32_t dash_width = dsc->dash_width;
@@ -98,14 +100,14 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
float head_end_x = p1_x - w2_dx;
float head_end_y = p1_y + w2_dy;
- /* tali point */
- float tali_start_x = p2_x - w2_dx;
- float tali_start_y = p2_y + w2_dy;
- float tali_end_x = p2_x + w2_dx;
- float tali_end_y = p2_y - w2_dy;
+ /* tail point */
+ float tail_start_x = p2_x - w2_dx;
+ float tail_start_y = p2_y + w2_dy;
+ float tail_end_x = p2_x + w2_dx;
+ float tail_end_y = p2_y - w2_dy;
/*
- head_start tali_end
+ head_start tail_end
*-----------------*
/| |\
/ | | \
@@ -113,7 +115,7 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
\ | | /
\| |/
*-----------------*
- head_end tali_start
+ head_end tail_start
*/
/* move to start point */
@@ -141,23 +143,23 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
}
/* draw line body */
- lv_vg_lite_path_line_to(path, tali_start_x, tali_start_y);
+ lv_vg_lite_path_line_to(path, tail_start_x, tail_start_y);
/* draw line tail */
if(dsc->round_end) {
float arc_cx = p2_x + w2_dy;
float arc_cy = p2_y + w2_dx;
lv_vg_lite_path_append_arc_right_angle(path,
- tali_start_x, tali_start_y,
+ tail_start_x, tail_start_y,
p2_x, p2_y,
arc_cx, arc_cy);
lv_vg_lite_path_append_arc_right_angle(path,
arc_cx, arc_cy,
p2_x, p2_y,
- tali_end_x, tali_end_y);
+ tail_end_x, tail_end_y);
}
else {
- lv_vg_lite_path_line_to(path, tali_end_x, tali_end_y);
+ lv_vg_lite_path_line_to(path, tail_end_x, tail_end_y);
}
/* close draw line body */
@@ -192,7 +194,9 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
LV_VG_LITE_ASSERT_PATH(vg_lite_path);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_lite_path,
@@ -200,8 +204,11 @@ void lv_draw_vg_lite_line(lv_draw_unit_t * draw_unit, const lv_draw_line_dsc_t *
&matrix,
VG_LITE_BLEND_SRC_OVER,
color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
lv_vg_lite_path_drop(u, path);
+
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c
index ef9b7658a..a7cbda0cb 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_mask_rect.c
@@ -48,6 +48,8 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re
return;
}
+ LV_PROFILER_BEGIN;
+
lv_draw_sw_mask_radius_param_t param;
lv_draw_sw_mask_radius_init(¶m, &dsc->area, dsc->radius, false);
@@ -85,6 +87,8 @@ void lv_draw_vg_lite_mask_rect(lv_draw_unit_t * draw_unit, const lv_draw_mask_re
lv_free(mask_buf);
lv_draw_sw_mask_free_param(¶m);
+
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c
index 6dd90d7c4..868f23a54 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_triangle.c
@@ -14,6 +14,7 @@
#include "lv_vg_lite_utils.h"
#include "lv_vg_lite_path.h"
#include "lv_draw_vg_lite_type.h"
+#include "lv_vg_lite_grad.h"
/*********************
* DEFINES
@@ -54,6 +55,8 @@ void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle
is_common = _lv_area_intersect(&clip_area, &tri_area, draw_unit->clip_area);
if(!is_common) return;
+ LV_PROFILER_BEGIN;
+
lv_draw_vg_lite_unit_t * u = (lv_draw_vg_lite_unit_t *)draw_unit;
lv_vg_lite_path_t * path = lv_vg_lite_path_get(u, VG_LITE_FP32);
@@ -72,19 +75,24 @@ void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle
vg_lite_matrix_t matrix;
vg_lite_identity(&matrix);
lv_vg_lite_matrix_multiply(&matrix, &u->global_matrix);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
if(dsc->bg_grad.dir != LV_GRAD_DIR_NONE) {
+ vg_lite_matrix_t grad_matrix;
+ lv_vg_lite_grad_area_to_matrix(&grad_matrix, &tri_area, dsc->bg_grad.dir);
lv_vg_lite_draw_linear_grad(
+ u,
&u->target_buffer,
vg_lite_path,
- &tri_area,
&dsc->bg_grad,
+ &grad_matrix,
&matrix,
VG_LITE_FILL_EVEN_ODD,
VG_LITE_BLEND_SRC_OVER);
}
else { /* normal fill */
vg_lite_color_t color = lv_vg_lite_color(dsc->bg_color, dsc->bg_opa, true);
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_lite_path,
@@ -92,9 +100,12 @@ void lv_draw_vg_lite_triangle(lv_draw_unit_t * draw_unit, const lv_draw_triangle
&matrix,
VG_LITE_BLEND_SRC_OVER,
color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
}
lv_vg_lite_path_drop(u, path);
+
+ LV_PROFILER_END;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h
index 59da4122b..3609f9280 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_type.h
@@ -19,6 +19,7 @@ extern "C" {
#if LV_USE_DRAW_VG_LITE
#include "../lv_draw.h"
+#include "../../misc/lv_array.h"
#if LV_USE_VG_LITE_THORVG
#include "../../others/vg_lite_tvg/vg_lite.h"
@@ -34,9 +35,15 @@ extern "C" {
* TYPEDEFS
**********************/
+struct _lv_vg_lite_pending_t;
+
struct _lv_draw_vg_lite_unit_t {
lv_draw_unit_t base_unit;
lv_draw_task_t * task_act;
+ struct _lv_vg_lite_pending_t * image_dsc_pending;
+ lv_cache_t * grad_cache;
+ struct _lv_vg_lite_pending_t * grad_pending;
+ uint16_t flush_count;
vg_lite_buffer_t target_buffer;
vg_lite_matrix_t global_matrix;
struct _lv_vg_lite_path_t * global_path;
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c
index 1326588c6..0485c0b6e 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_draw_vg_lite_vector.c
@@ -13,7 +13,9 @@
#include "lv_draw_vg_lite_type.h"
#include "lv_vg_lite_path.h"
+#include "lv_vg_lite_pending.h"
#include "lv_vg_lite_utils.h"
+#include "lv_vg_lite_grad.h"
/*********************
* DEFINES
@@ -30,9 +32,13 @@
static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc);
static void lv_matrix_to_vg(vg_lite_matrix_t * desy, const lv_matrix_t * src);
static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src);
+static void lv_path_opa_to_vg(lv_vg_lite_path_t * dest, const lv_vector_draw_dsc_t * dsc);
+static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc);
static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend);
static vg_lite_fill_t lv_fill_to_vg(lv_vector_fill_t fill_rule);
static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t spread);
+static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap);
+static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join);
/**********************
* STATIC VARIABLES
@@ -55,7 +61,9 @@ void lv_draw_vg_lite_vector(lv_draw_unit_t * draw_unit, const lv_draw_vector_tas
if(layer->draw_buf == NULL)
return;
+ LV_PROFILER_BEGIN;
_lv_vector_for_each_destroy_tasks(dsc->task_list, task_draw_cb, draw_unit);
+ LV_PROFILER_END;
}
/**********************
@@ -75,6 +83,7 @@ static vg_lite_color_t lv_color32_to_vg(lv_color32_t color, lv_opa_t opa)
static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vector_draw_dsc_t * dsc)
{
+ LV_PROFILER_BEGIN;
lv_draw_vg_lite_unit_t * u = ctx;
LV_VG_LITE_ASSERT_DEST_BUFFER(&u->target_buffer);
@@ -84,19 +93,20 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
vg_lite_color_t c = lv_color32_to_vg(dsc->fill_dsc.color, LV_OPA_COVER);
vg_lite_rectangle_t rect;
lv_vg_lite_rect(&rect, &dsc->scissor_area);
+ LV_PROFILER_BEGIN_TAG("vg_lite_clear");
LV_VG_LITE_CHECK_ERROR(vg_lite_clear(&u->target_buffer, &rect, c));
+ LV_PROFILER_END_TAG("vg_lite_clear");
+ LV_PROFILER_END;
return;
}
- /* set scissor area */
- lv_vg_lite_set_scissor_area(&dsc->scissor_area);
-
/* convert color */
vg_lite_color_t vg_color = lv_color32_to_vg(dsc->fill_dsc.color, dsc->fill_dsc.opa);
/* transform matrix */
vg_lite_matrix_t matrix;
lv_matrix_to_vg(&matrix, &dsc->matrix);
+ LV_VG_LITE_ASSERT_MATRIX(&matrix);
/* convert path */
lv_vg_lite_path_t * lv_vg_path = lv_vg_lite_path_get(u, VG_LITE_FP32);
@@ -104,17 +114,48 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
vg_lite_path_t * vg_path = lv_vg_lite_path_get_path(lv_vg_path);
LV_VG_LITE_ASSERT_PATH(vg_path);
+ /* convert path type */
+ lv_path_opa_to_vg(lv_vg_path, dsc);
+
/* convert blend mode and fill rule */
vg_lite_blend_t blend = lv_blend_to_vg(dsc->blend_mode);
vg_lite_fill_t fill = lv_fill_to_vg(dsc->fill_dsc.fill_rule);
+ /* convert stroke style */
+ lv_stroke_to_vg(lv_vg_path, &dsc->stroke_dsc);
+
/* get path bounds */
float min_x, min_y, max_x, max_y;
lv_vg_lite_path_get_bonding_box(lv_vg_path, &min_x, &min_y, &max_x, &max_y);
+ if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) {
+ /* set scissor area */
+ lv_vg_lite_set_scissor_area(&dsc->scissor_area);
+ }
+ else {
+ /* calc inverse matrix */
+ vg_lite_matrix_t result;
+ if(!lv_vg_lite_matrix_inverse(&result, &matrix)) {
+ LV_LOG_ERROR("no inverse matrix");
+ LV_PROFILER_END;
+ return;
+ }
+
+ /* Reverse the clip area on the source */
+ lv_point_precise_t p1 = { dsc->scissor_area.x1, dsc->scissor_area.y1 };
+ lv_point_precise_t p1_res = lv_vg_lite_matrix_transform_point(&result, &p1);
+
+ /* vg-lite bounding_box will crop the pixels on the edge, so +1px is needed here */
+ lv_point_precise_t p2 = { dsc->scissor_area.x2 + 1, dsc->scissor_area.y2 + 1 };
+ lv_point_precise_t p2_res = lv_vg_lite_matrix_transform_point(&result, &p2);
+
+ lv_vg_lite_path_set_bonding_box(lv_vg_path, p1_res.x, p1_res.y, p2_res.x, p2_res.y);
+ }
+
switch(dsc->fill_dsc.style) {
case LV_VECTOR_DRAW_STYLE_SOLID: {
/* normal draw shape */
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw(
&u->target_buffer,
vg_path,
@@ -122,6 +163,7 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
&matrix,
blend,
vg_color));
+ LV_PROFILER_END_TAG("vg_lite_draw");
}
break;
case LV_VECTOR_DRAW_STYLE_PATTERN: {
@@ -129,48 +171,59 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
vg_lite_buffer_t image_buffer;
lv_image_decoder_dsc_t decoder_dsc;
if(lv_vg_lite_buffer_open_image(&image_buffer, &decoder_dsc, dsc->fill_dsc.img_dsc.src, false)) {
+ /* Calculate pattern matrix. Should start from path bond box, and also apply fill matrix. */
lv_matrix_t m = dsc->matrix;
lv_matrix_translate(&m, min_x, min_y);
lv_matrix_multiply(&m, &dsc->fill_dsc.matrix);
- vg_lite_matrix_t src_matrix;
- lv_matrix_to_vg(&src_matrix, &m);
-
- vg_lite_matrix_t path_matrix;
- vg_lite_identity(&path_matrix);
+ vg_lite_matrix_t pattern_matrix;
+ lv_matrix_to_vg(&pattern_matrix, &m);
vg_lite_color_t recolor = lv_vg_lite_color(dsc->fill_dsc.img_dsc.recolor, dsc->fill_dsc.img_dsc.recolor_opa, true);
+ LV_VG_LITE_ASSERT_MATRIX(&pattern_matrix);
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw_pattern");
LV_VG_LITE_CHECK_ERROR(vg_lite_draw_pattern(
&u->target_buffer,
vg_path,
fill,
- &path_matrix,
+ &matrix,
&image_buffer,
- &src_matrix,
+ &pattern_matrix,
blend,
VG_LITE_PATTERN_COLOR,
recolor,
vg_color,
VG_LITE_FILTER_BI_LINEAR));
- lv_image_decoder_close(&decoder_dsc);
+ LV_PROFILER_END_TAG("vg_lite_draw_pattern");
+
+ lv_vg_lite_pending_add(u->image_dsc_pending, &decoder_dsc);
}
}
break;
case LV_VECTOR_DRAW_STYLE_GRADIENT: {
/* draw gradient */
- lv_area_t grad_area;
- lv_area_set(&grad_area, (int32_t)min_x, (int32_t)min_y, (int32_t)max_x, (int32_t)max_y);
lv_vector_gradient_style_t style = dsc->fill_dsc.gradient.style;
vg_lite_gradient_spreadmode_t spreadmode = lv_spread_to_vg(dsc->fill_dsc.gradient.spread);
LV_UNUSED(spreadmode);
if(style == LV_VECTOR_GRADIENT_STYLE_LINEAR) {
+ vg_lite_matrix_t grad_matrix, fill_matrix;
+ lv_area_t grad_area;
+ lv_area_set(&grad_area, (int32_t)min_x, (int32_t)min_y, (int32_t)max_x, (int32_t)max_y);
+ lv_vg_lite_grad_area_to_matrix(&grad_matrix, &grad_area, LV_GRAD_DIR_HOR);
+
+ lv_matrix_to_vg(&fill_matrix, &dsc->fill_dsc.matrix);
+ lv_vg_lite_matrix_multiply(&grad_matrix, &matrix);
+ lv_vg_lite_matrix_multiply(&grad_matrix, &fill_matrix);
+
lv_vg_lite_draw_linear_grad(
+ u,
&u->target_buffer,
vg_path,
- &grad_area,
&dsc->fill_dsc.gradient.grad,
+ &grad_matrix,
&matrix,
fill,
blend);
@@ -190,11 +243,18 @@ static void task_draw_cb(void * ctx, const lv_vector_path_t * path, const lv_vec
break;
}
+ /* Flush in time to avoid accumulation of drawing commands */
+ lv_vg_lite_flush(u);
+
/* drop path */
lv_vg_lite_path_drop(u, lv_vg_path);
- /* disable scissor */
- lv_vg_lite_disable_scissor();
+ if(vg_lite_query_feature(gcFEATURE_BIT_VG_SCISSOR)) {
+ /* disable scissor */
+ lv_vg_lite_disable_scissor();
+ }
+
+ LV_PROFILER_END;
}
static void lv_matrix_to_vg(vg_lite_matrix_t * dest, const lv_matrix_t * src)
@@ -218,6 +278,7 @@ static vg_lite_quality_t lv_quality_to_vg(lv_vector_path_quality_t quality)
static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src)
{
+ LV_PROFILER_BEGIN;
lv_vg_lite_path_set_quality(dest, lv_quality_to_vg(src->quality));
/* init bounds */
@@ -235,9 +296,10 @@ static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src
} while(0)
uint32_t pidx = 0;
- for(uint32_t i = 0; i < src->ops.size; i++) {
- lv_vector_path_op_t * op = lv_array_at(&src->ops, i);
- switch(*op) {
+ lv_vector_path_op_t * op = lv_array_front(&src->ops);
+ uint32_t size = lv_array_size(&src->ops);
+ for(uint32_t i = 0; i < size; i++) {
+ switch(op[i]) {
case LV_VECTOR_PATH_OP_MOVE_TO: {
const lv_fpoint_t * pt = lv_array_at(&src->points, pidx);
CMP_BOUNDS(pt);
@@ -281,6 +343,54 @@ static void lv_path_to_vg(lv_vg_lite_path_t * dest, const lv_vector_path_t * src
lv_vg_lite_path_end(dest);
lv_vg_lite_path_set_bonding_box(dest, min_x, min_y, max_x, max_y);
+ LV_PROFILER_END;
+}
+
+static void lv_path_opa_to_vg(lv_vg_lite_path_t * dest, const lv_vector_draw_dsc_t * dsc)
+{
+ vg_lite_path_type_t path_type = VG_LITE_DRAW_ZERO;
+ lv_opa_t fill_opa = dsc->fill_dsc.opa;
+ lv_opa_t stroke_opa = dsc->stroke_dsc.opa;
+
+ if(fill_opa > LV_OPA_0 && stroke_opa > LV_OPA_0) {
+ path_type = VG_LITE_DRAW_FILL_STROKE_PATH;
+ }
+ else if(fill_opa == LV_OPA_0 && stroke_opa > LV_OPA_0) {
+ path_type = VG_LITE_DRAW_STROKE_PATH;
+ }
+ else if(fill_opa > LV_OPA_0) {
+ path_type = VG_LITE_DRAW_FILL_PATH;
+ }
+
+ LV_VG_LITE_CHECK_ERROR(vg_lite_set_path_type(lv_vg_lite_path_get_path(dest), path_type));
+}
+
+static void lv_stroke_to_vg(lv_vg_lite_path_t * dest, const lv_vector_stroke_dsc_t * dsc)
+{
+ LV_ASSERT_NULL(dest);
+ LV_ASSERT_NULL(dsc);
+
+ /* if stroke opa is 0, no need to set stroke */
+ if(dsc->opa == LV_OPA_0) {
+ return;
+ }
+
+ vg_lite_path_t * path = lv_vg_lite_path_get_path(dest);
+
+ LV_VG_LITE_CHECK_ERROR(
+ vg_lite_set_stroke(
+ path,
+ lv_stroke_cap_to_vg(dsc->cap),
+ lv_stroke_join_to_vg(dsc->join),
+ dsc->width,
+ dsc->miter_limit,
+ lv_array_front(&dsc->dash_pattern),
+ dsc->dash_pattern.size,
+ dsc->width / 2,
+ lv_color32_to_vg(dsc->color, dsc->opa))
+ );
+
+ LV_VG_LITE_CHECK_ERROR(vg_lite_update_stroke(path));
}
static vg_lite_blend_t lv_blend_to_vg(lv_vector_blend_t blend)
@@ -335,4 +445,32 @@ static vg_lite_gradient_spreadmode_t lv_spread_to_vg(lv_vector_gradient_spread_t
}
}
+static vg_lite_cap_style_t lv_stroke_cap_to_vg(lv_vector_stroke_cap_t cap)
+{
+ switch(cap) {
+ case LV_VECTOR_STROKE_CAP_SQUARE:
+ return VG_LITE_CAP_SQUARE;
+ case LV_VECTOR_STROKE_CAP_ROUND:
+ return VG_LITE_CAP_ROUND;
+ case LV_VECTOR_STROKE_CAP_BUTT:
+ return VG_LITE_CAP_BUTT;
+ default:
+ return VG_LITE_CAP_SQUARE;
+ }
+}
+
+static vg_lite_join_style_t lv_stroke_join_to_vg(lv_vector_stroke_join_t join)
+{
+ switch(join) {
+ case LV_VECTOR_STROKE_JOIN_BEVEL:
+ return VG_LITE_JOIN_BEVEL;
+ case LV_VECTOR_STROKE_JOIN_ROUND:
+ return VG_LITE_JOIN_ROUND;
+ case LV_VECTOR_STROKE_JOIN_MITER:
+ return VG_LITE_JOIN_MITER;
+ default:
+ return VG_LITE_JOIN_BEVEL;
+ }
+}
+
#endif /*LV_USE_DRAW_VG_LITE && LV_USE_VECTOR_GRAPHIC*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c
index 59dc6f754..a0f052356 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_decoder.c
@@ -17,20 +17,24 @@
* DEFINES
*********************/
-#define LV_VG_LITE_IMAGE_NO_CACHE LV_IMAGE_FLAGS_USER1
+/* VG_LITE_INDEX1, 2, and 4 require endian flipping + bit flipping,
+ * so for simplicity, they are uniformly converted to I8 for display.
+ */
+#define DEST_IMG_FORMAT LV_COLOR_FORMAT_I8
+
+/* Since the palette and index image are next to each other,
+ * the palette size needs to be aligned to ensure that the image is aligned.
+ */
+#define DEST_IMG_OFFSET \
+ LV_VG_LITE_ALIGN(LV_COLOR_INDEXED_PALETTE_SIZE(DEST_IMG_FORMAT) * sizeof(lv_color32_t), LV_DRAW_BUF_ALIGN)
/**********************
* TYPEDEFS
**********************/
-#pragma pack(1)
-
typedef struct {
- lv_color16_t c;
- uint8_t alpha;
-} lv_color16_alpha_t;
-
-#pragma pack()
+ lv_draw_buf_t yuv; /*A draw buffer struct for yuv variable image*/
+} decoder_data_t;
/**********************
* STATIC PROTOTYPES
@@ -39,16 +43,7 @@ typedef struct {
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header);
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
-static void decoder_cache_free(lv_image_cache_data_t * cached_data, void * user_data);
-static void image_try_self_pre_mul(lv_image_decoder_dsc_t * dsc);
static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size);
-static void image_color16_pre_mul(lv_color16_alpha_t * img_data, uint32_t px_size);
-static void image_copy(uint8_t * dest, const uint8_t * src,
- size_t dest_stride, size_t src_stride,
- uint32_t height);
-static void image_invalidate_cache(void * buf, uint32_t stride,
- uint32_t width, uint32_t height,
- lv_color_format_t cf);
/**********************
* STATIC VARIABLES
@@ -68,7 +63,7 @@ void lv_vg_lite_decoder_init(void)
lv_image_decoder_set_info_cb(decoder, decoder_info);
lv_image_decoder_set_open_cb(decoder, decoder_open);
lv_image_decoder_set_close_cb(decoder, decoder_close);
- lv_image_decoder_set_cache_free_cb(decoder, (lv_cache_free_cb_t)decoder_cache_free);
+ lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/
}
void lv_vg_lite_decoder_deinit(void)
@@ -89,179 +84,170 @@ void lv_vg_lite_decoder_deinit(void)
static void image_color32_pre_mul(lv_color32_t * img_data, uint32_t px_size)
{
while(px_size--) {
- img_data->red = LV_UDIV255(img_data->red * img_data->alpha);
- img_data->green = LV_UDIV255(img_data->green * img_data->alpha);
- img_data->blue = LV_UDIV255(img_data->blue * img_data->alpha);
+ lv_color_premultiply(img_data);
img_data++;
}
}
-static void image_color16_pre_mul(lv_color16_alpha_t * img_data, uint32_t px_size)
+static uint32_t image_stride(const lv_image_header_t * header)
{
- while(px_size--) {
- img_data->c.red = LV_UDIV255(img_data->c.red * img_data->alpha);
- img_data->c.green = LV_UDIV255(img_data->c.green * img_data->alpha);
- img_data->c.blue = LV_UDIV255(img_data->c.blue * img_data->alpha);
- img_data++;
+ /* use stride in header */
+ if(header->stride) {
+ return header->stride;
}
+
+ /* guess stride */
+ uint32_t ori_stride = header->w * lv_color_format_get_bpp(header->cf);
+ ori_stride = (ori_stride + 7) >> 3; /*Round up*/
+ return ori_stride;
}
-static void image_try_self_pre_mul(lv_image_decoder_dsc_t * dsc)
+static void image_decode_to_index8_line(uint8_t * dest, const uint8_t * src, int32_t w_px,
+ lv_color_format_t color_format)
{
- /* !!! WARNING !!!
- * self-premultiplied images
- * should be width-aligned and in modifiable RAM
- */
- if(lv_vg_lite_support_blend_normal()) {
- return;
+ uint8_t px_size;
+ uint16_t mask;
+
+ int8_t shift = 0;
+ switch(color_format) {
+ case LV_COLOR_FORMAT_I1:
+ px_size = 1;
+ shift = 7;
+ break;
+ case LV_COLOR_FORMAT_I2:
+ px_size = 2;
+ shift = 6;
+ break;
+ case LV_COLOR_FORMAT_I4:
+ px_size = 4;
+ shift = 4;
+ break;
+ case LV_COLOR_FORMAT_I8:
+ lv_memcpy(dest, src, w_px);
+ return;
+ default:
+ LV_ASSERT_FORMAT_MSG(false, "Unsupported color format: %d", color_format);
+ return;
}
- if(dsc->header.flags & LV_IMAGE_FLAGS_PREMULTIPLIED) {
- return;
- }
+ mask = (1 << px_size) - 1; /*E.g. px_size = 2; mask = 0x03*/
- lv_color_format_t cf = dsc->header.cf;
- if(!lv_color_format_has_alpha(cf)) {
- return;
- }
+ for(int32_t i = 0; i < w_px; i++) {
+ uint8_t val_act = (*src >> shift) & mask;
+ dest[i] = val_act;
- int32_t image_w = dsc->header.w;
- int32_t image_h = dsc->header.h;
- uint32_t stride = lv_draw_buf_width_to_stride(image_w, cf);
- uint32_t aligned_w = lv_vg_lite_width_align(image_w);
- size_t px_size = aligned_w * image_h;
- void * image_data = dsc->decoded->data;
-
- if(cf == LV_COLOR_FORMAT_ARGB8888) {
- image_color32_pre_mul(image_data, px_size);
+ shift -= px_size;
+ if(shift < 0) {
+ shift = 8 - px_size;
+ src++;
+ }
}
- else if(cf == LV_COLOR_FORMAT_RGB565A8) {
- image_color16_pre_mul(image_data, px_size);
- }
- else if(LV_COLOR_FORMAT_IS_INDEXED(cf)) {
- lv_color32_t * palette = (lv_color32_t *)image_data;
- uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf);
- image_color32_pre_mul(palette, palette_size);
- }
- else if(LV_COLOR_FORMAT_IS_ALPHA_ONLY(cf)) {
- /* do nothing */
- }
- else {
- LV_LOG_WARN("unsupported cf: %d", cf);
- }
-
- image_invalidate_cache(image_data, stride, image_w, image_h, cf);
-
- dsc->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED;
-}
-
-static void image_copy(uint8_t * dest, const uint8_t * src,
- size_t dest_stride, size_t src_stride,
- uint32_t height)
-{
- for(uint32_t y = 0; y < height; y++) {
- lv_memcpy(dest, src, src_stride);
- src += src_stride;
- dest += dest_stride;
- }
-}
-
-static void image_invalidate_cache(void * buf, uint32_t stride,
- uint32_t width, uint32_t height,
- lv_color_format_t cf)
-{
- width = lv_vg_lite_width_align(width);
- lv_area_t image_area;
- lv_area_set(&image_area, 0, 0, width - 1, height - 1);
- lv_draw_buf_invalidate_cache(buf, stride, cf, &image_area);
}
static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header)
{
- return lv_bin_decoder_info(decoder, src, header);
+ lv_result_t res = lv_bin_decoder_info(decoder, src, header);
+ if(res != LV_RESULT_OK) {
+ return res;
+ }
+
+ if(LV_COLOR_FORMAT_IS_YUV(header->cf)) {
+ return LV_RESULT_OK;
+ }
+
+ if(LV_COLOR_FORMAT_IS_INDEXED(header->cf)) {
+ header->cf = DEST_IMG_FORMAT;
+ return LV_RESULT_OK;
+ }
+
+ return LV_RESULT_INVALID;
}
static lv_result_t decoder_open_variable(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
{
LV_UNUSED(decoder); /*Unused*/
- lv_color_format_t cf = dsc->header.cf;
+ lv_draw_buf_t src_img_buf;
+ lv_draw_buf_from_image(&src_img_buf, dsc->src);
+
+ /* Since dsc->header.cf is uniformly set to I8,
+ * the original format is obtained from src for conversion.
+ */
+ lv_color_format_t src_cf = src_img_buf.header.cf;
+
int32_t width = dsc->header.w;
int32_t height = dsc->header.h;
- /* native stride */
- uint32_t width_byte;
- width_byte = width * lv_color_format_get_bpp(cf);
- width_byte = (width_byte + 7) >> 3; /*Round up*/
-
- bool support_blend_normal = lv_vg_lite_support_blend_normal();
-
/*In case of uncompressed formats the image stored in the ROM/RAM.
*So simply give its pointer*/
const uint8_t * image_data = ((lv_image_dsc_t *)dsc->src)->data;
uint32_t image_data_size = ((lv_image_dsc_t *)dsc->src)->data_size;
- bool has_alpha = lv_color_format_has_alpha(cf);
- bool is_indexed = LV_COLOR_FORMAT_IS_INDEXED(cf);
- bool is_yuv = LV_COLOR_FORMAT_IS_YUV(cf);
- bool is_addr_aligned = (image_data == lv_draw_buf_align((void *)image_data, cf)) ? true : false;
+ /* if is YUV format, no need to copy */
+ if(LV_COLOR_FORMAT_IS_YUV(src_cf)) {
+ decoder_data_t * decoder_data = dsc->user_data;
+ if(decoder_data == NULL) {
+ decoder_data = lv_malloc_zeroed(sizeof(decoder_data_t));
+ LV_ASSERT_MALLOC(decoder_data);
+ }
+ lv_draw_buf_t * draw_buf = &decoder_data->yuv;
+ uint32_t stride = lv_draw_buf_width_to_stride(width, src_cf);
+ lv_draw_buf_init(draw_buf, width, height, src_cf, stride, (void *)image_data, image_data_size);
- uint32_t stride = lv_draw_buf_width_to_stride(width, cf);
- bool is_stride_aligned = (stride == width_byte) ? true : false;
+ /* Use alloced bit to indicate we should not free the memory */
+ draw_buf->header.flags &= ~LV_IMAGE_FLAGS_ALLOCATED;
- /* When the following conditions are met,
- * there is no need to copy image resource preprocessing.
- */
- if((is_addr_aligned
- && is_stride_aligned
- && !is_indexed
- && (!has_alpha || (has_alpha && support_blend_normal))) || is_yuv) {
+ /* Do not add this kind of image to cache, since its life is managed by user. */
+ dsc->args.no_cache = true;
- lv_draw_buf_t * draw_buf = lv_malloc_zeroed(sizeof(lv_draw_buf_t));
- LV_ASSERT_MALLOC(draw_buf);
- lv_draw_buf_init(draw_buf, width, height, cf, stride, (void *)image_data, image_data_size);
dsc->decoded = draw_buf;
return LV_RESULT_OK;
}
- uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf);
- uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t);
-
- /* Since the palette and index image are next to each other,
- * the palette size needs to be aligned to ensure that the image is aligned.
- */
- uint32_t palette_size_bytes_aligned = LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN);
-
- lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, cf, stride);
+ /* create draw buf */
+ lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO);
if(draw_buf == NULL) {
- LV_LOG_ERROR("create draw buf failed, cf = %d", cf);
return LV_RESULT_INVALID;
}
-
dsc->decoded = draw_buf;
+ uint32_t src_stride = image_stride(&src_img_buf.header);
+ uint32_t dest_stride = draw_buf->header.stride;
+
const uint8_t * src = image_data;
uint8_t * dest = draw_buf->data;
- /* copy palette */
- if(palette_size_bytes) {
- lv_memcpy(dest, src, palette_size_bytes);
- src += palette_size_bytes;
+ /* index format only */
+ uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_cf);
+ LV_ASSERT(palette_size > 0);
- /* move to align size */
- dest += palette_size_bytes_aligned;
+ uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t);
+
+ /* copy palette */
+ lv_memcpy(dest, src, palette_size_bytes);
+
+ if(!dsc->args.premultiply) {
+ /* pre-multiply palette */
+ image_color32_pre_mul((lv_color32_t *)dest, palette_size);
+ draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED;
}
- image_copy(dest, src, stride, width_byte, height);
+ /* move to index image map */
+ src += palette_size_bytes;
+ dest += DEST_IMG_OFFSET;
- /* premul alpha */
- image_try_self_pre_mul(dsc);
+ /* copy index image */
+ for(int32_t y = 0; y < height; y++) {
+ image_decode_to_index8_line(dest, src, width, src_cf);
+ src += src_stride;
+ dest += dest_stride;
+ }
/* invalidate D-Cache */
- image_invalidate_cache(draw_buf->data, stride, width, height, cf);
-
+ lv_draw_buf_invalidate_cache(draw_buf, NULL);
LV_LOG_INFO("image %p (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p, cf: %d) decode finish",
- image_data, width, height, draw_buf->data, cf);
+ image_data, width, height, draw_buf->data, src_cf);
+
return LV_RESULT_OK;
}
@@ -269,10 +255,10 @@ static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_deco
{
LV_UNUSED(decoder); /*Unused*/
- lv_color_format_t cf = dsc->header.cf;
uint32_t width = dsc->header.w;
uint32_t height = dsc->header.h;
const char * path = dsc->src;
+ uint8_t * src_temp = NULL;
lv_fs_file_t file;
lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_RD);
@@ -281,84 +267,91 @@ static lv_result_t decoder_open_file(lv_image_decoder_t * decoder, lv_image_deco
return LV_RESULT_INVALID;
}
- /* skip image header bytes */
- res = lv_fs_seek(&file, sizeof(lv_image_header_t), LV_FS_SEEK_SET);
- if(res != LV_FS_RES_OK) {
- LV_LOG_ERROR("seek %s lv_image_header_t failed", path);
+ /* get real src header */
+ lv_image_header_t src_header;
+ uint32_t header_br = 0;
+ res = lv_fs_read(&file, &src_header, sizeof(src_header), &header_br);
+ if(res != LV_FS_RES_OK || header_br != sizeof(src_header)) {
+ LV_LOG_ERROR("read %s lv_image_header_t failed", path);
lv_fs_close(&file);
return LV_RESULT_INVALID;
}
- /* native stride */
- uint32_t width_byte;
- width_byte = width * lv_color_format_get_bpp(cf);
- width_byte = (width_byte + 7) >> 3; /*Round up*/
-
- bool support_blend_normal = lv_vg_lite_support_blend_normal();
-
- uint32_t stride = lv_draw_buf_width_to_stride(width, cf);
-
- uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(cf);
- uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t);
-
- /* Since the palette and index image are next to each other,
- * the palette size needs to be aligned to ensure that the image is aligned.
- */
- uint32_t palette_size_bytes_aligned = LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN);
-
- lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, cf, stride);
+ lv_draw_buf_t * draw_buf = lv_draw_buf_create(width, height, DEST_IMG_FORMAT, LV_STRIDE_AUTO);
if(draw_buf == NULL) {
- LV_LOG_ERROR("create draw buf failed, cf = %d", cf);
+ lv_fs_close(&file);
return LV_RESULT_INVALID;
}
+ /* get stride */
+ uint32_t src_stride = image_stride(&src_header);
+ uint32_t dest_stride = draw_buf->header.stride;
+
dsc->decoded = draw_buf;
uint8_t * dest = draw_buf->data;
- /* copy palette */
- if(palette_size_bytes) {
- uint32_t br;
- /* read palette */
- res = lv_fs_read(&file, dest, palette_size_bytes, &br);
- if(res != LV_FS_RES_OK || br != palette_size_bytes) {
- LV_LOG_ERROR("read %s (palette: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed",
- path, palette_size_bytes, br);
- goto failed;
- }
-
- if(!support_blend_normal) {
- image_color32_pre_mul((lv_color32_t *)dest, palette_size);
- }
-
- /* move to index image map */
- dest += palette_size_bytes_aligned;
+ /* index format only */
+ uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(src_header.cf);
+ if(palette_size == 0) {
+ LV_LOG_ERROR("file %s invalid palette size: %" LV_PRIu32, path, palette_size);
+ goto failed;
}
+ uint32_t palette_size_bytes = palette_size * sizeof(lv_color32_t);
+
+ /* read palette */
+ uint32_t palette_br = 0;
+ res = lv_fs_read(&file, dest, palette_size_bytes, &palette_br);
+ if(res != LV_FS_RES_OK || palette_br != palette_size_bytes) {
+ LV_LOG_ERROR("read %s (palette: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed",
+ path, palette_size_bytes, palette_br);
+ goto failed;
+ }
+
+ if(dsc->args.premultiply) {
+ /* pre-multiply palette */
+ image_color32_pre_mul((lv_color32_t *)dest, palette_size);
+ draw_buf->header.flags |= LV_IMAGE_FLAGS_PREMULTIPLIED;
+ }
+
+ src_temp = lv_malloc(src_stride);
+ if(src_temp == NULL) {
+ LV_LOG_ERROR("malloc src_temp failed");
+ goto failed;
+ }
+
+ /* move to index image map */
+ dest += DEST_IMG_OFFSET;
+
for(uint32_t y = 0; y < height; y++) {
- uint32_t br;
- res = lv_fs_read(&file, dest, width_byte, &br);
- if(res != LV_FS_RES_OK || br != width_byte) {
- LV_LOG_ERROR("read %s (y: %" LV_PRIu32 ", width_byte: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed",
- path, y, width_byte, br);
+ uint32_t br = 0;
+ res = lv_fs_read(&file, src_temp, src_stride, &br);
+ if(res != LV_FS_RES_OK || br != src_stride) {
+ LV_LOG_ERROR("read %s (y: %" LV_PRIu32 ", src_stride: %" LV_PRIu32 ", br: %" LV_PRIu32 ") failed",
+ path, y, src_stride, br);
goto failed;
}
- dest += stride;
+ /* convert to index8 */
+ image_decode_to_index8_line(dest, src_temp, width, src_header.cf);
+ dest += dest_stride;
}
+ lv_free(src_temp);
+
lv_fs_close(&file);
- /* premul alpha */
- image_try_self_pre_mul(dsc);
-
/* invalidate D-Cache */
- image_invalidate_cache(draw_buf->data, stride, width, height, cf);
+ lv_draw_buf_invalidate_cache(draw_buf, NULL);
LV_LOG_INFO("image %s (W%" LV_PRId32 " x H%" LV_PRId32 ", buffer: %p cf: %d) decode finish",
- path, width, height, draw_buf->data, cf);
+ path, width, height, draw_buf->data, src_header.cf);
return LV_RESULT_OK;
failed:
+ if(src_temp) {
+ lv_free(src_temp);
+ }
lv_fs_close(&file);
lv_draw_buf_destroy(draw_buf);
dsc->decoded = NULL;
@@ -366,6 +359,16 @@ failed:
return LV_RESULT_INVALID;
}
+static void decoder_draw_buf_free(lv_draw_buf_t * draw_buf)
+{
+ if((draw_buf->header.flags & LV_IMAGE_FLAGS_ALLOCATED) == 0) {
+ /* This must be the yuv variable image. */
+ return;
+ }
+
+ lv_draw_buf_destroy(draw_buf);
+}
+
/**
* Decode an image using the vg_lite gpu.
* @param decoder pointer to the decoder
@@ -374,7 +377,6 @@ failed:
*/
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
{
-
lv_result_t res = LV_RESULT_INVALID;
switch(dsc->src_type) {
@@ -388,7 +390,7 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
break;
}
- if(dsc->args.no_cache) return LV_RES_OK;
+ if(dsc->args.no_cache) return res;
#if LV_CACHE_DEF_SIZE > 0
if(res == LV_RESULT_OK) {
@@ -400,7 +402,7 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
lv_cache_entry_t * entry = lv_image_decoder_add_to_cache(decoder, &search_key, dsc->decoded, NULL);
if(entry == NULL) {
- lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded);
+ decoder_draw_buf_free((lv_draw_buf_t *)dsc->decoded);
dsc->decoded = NULL;
return LV_RESULT_INVALID;
}
@@ -411,33 +413,16 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
return res;
}
-static void decoder_draw_buf_free(lv_draw_buf_t * draw_buf)
-{
- if(draw_buf->header.flags & LV_VG_LITE_IMAGE_NO_CACHE) {
- lv_free(draw_buf);
- }
- else {
- lv_draw_buf_destroy(draw_buf);
- }
-}
-
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
{
LV_UNUSED(decoder); /*Unused*/
if(dsc->args.no_cache || LV_CACHE_DEF_SIZE == 0)
- lv_draw_buf_destroy((lv_draw_buf_t *)dsc->decoded);
+ decoder_draw_buf_free((lv_draw_buf_t *)dsc->decoded);
else
lv_cache_release(dsc->cache, dsc->cache_entry, NULL);
-}
-static void decoder_cache_free(lv_image_cache_data_t * cached_data, void * user_data)
-{
- LV_UNUSED(user_data);
-
- if(cached_data->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)cached_data->src);
-
- decoder_draw_buf_free((lv_draw_buf_t *)cached_data->decoded);
+ if(decoder->user_data) free(decoder->user_data);
}
#endif /*LV_USE_DRAW_VG_LITE*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c
new file mode 100644
index 000000000..526867190
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.c
@@ -0,0 +1,255 @@
+/**
+ * @file lv_vg_lite_grad.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_vg_lite_grad.h"
+
+#if LV_USE_DRAW_VG_LITE
+
+#include "lv_draw_vg_lite_type.h"
+#include "lv_vg_lite_pending.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ vg_lite_linear_gradient_t vg_grad;
+ lv_grad_dsc_t lv_grad;
+} grad_item_t;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
+ const lv_grad_dsc_t * grad);
+
+static bool grad_create_cb(grad_item_t * item, void * user_data);
+static void grad_free_cb(grad_item_t * item, void * user_data);
+static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs);
+static void grad_cache_release_cb(void * entry, void * user_data);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u)
+{
+ LV_ASSERT_NULL(u);
+
+ lv_cache_ops_t ops = {
+ .compare_cb = (lv_cache_compare_cb_t)grad_compare_cb,
+ .create_cb = (lv_cache_create_cb_t)grad_create_cb,
+ .free_cb = (lv_cache_free_cb_t)grad_free_cb,
+ };
+
+ u->grad_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(grad_item_t), LV_VG_LITE_GRAD_CACHE_SIZE, ops);
+ LV_ASSERT_NULL(u->grad_cache);
+
+ u->grad_pending = lv_vg_lite_pending_create(sizeof(lv_cache_entry_t *), 4);
+ lv_vg_lite_pending_set_free_cb(u->grad_pending, grad_cache_release_cb, u->grad_cache);
+}
+
+void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u)
+{
+ LV_ASSERT_NULL(u);
+ lv_vg_lite_pending_destroy(u->grad_pending);
+ lv_cache_destroy(u->grad_cache, NULL);
+}
+
+void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir)
+{
+ LV_ASSERT_NULL(grad_matrix);
+ LV_ASSERT_NULL(area);
+
+ vg_lite_identity(grad_matrix);
+ vg_lite_translate(area->x1, area->y1, grad_matrix);
+
+ switch(dir) {
+ case LV_GRAD_DIR_VER:
+ vg_lite_scale(1, lv_area_get_height(area) / 256.0f, grad_matrix);
+ vg_lite_rotate(90, grad_matrix);
+ break;
+
+ case LV_GRAD_DIR_HOR:
+ vg_lite_scale(lv_area_get_width(area) / 256.0f, 1, grad_matrix);
+ break;
+
+ default:
+ break;
+ }
+}
+
+void lv_vg_lite_draw_linear_grad(
+ struct _lv_draw_vg_lite_unit_t * u,
+ vg_lite_buffer_t * buffer,
+ vg_lite_path_t * path,
+ const lv_grad_dsc_t * grad,
+ const vg_lite_matrix_t * grad_matrix,
+ const vg_lite_matrix_t * matrix,
+ vg_lite_fill_t fill,
+ vg_lite_blend_t blend)
+{
+ LV_ASSERT_NULL(u);
+ LV_ASSERT_NULL(buffer);
+ LV_ASSERT_NULL(path);
+ LV_ASSERT_NULL(grad);
+ LV_ASSERT_NULL(grad_matrix);
+ LV_ASSERT_NULL(matrix);
+
+ LV_PROFILER_BEGIN;
+
+ vg_lite_linear_gradient_t * gradient = lv_vg_lite_linear_grad_get(u, grad);
+ LV_ASSERT_NULL(gradient);
+ if(!gradient) {
+ LV_LOG_ERROR("Failed to get linear gradient");
+ LV_PROFILER_END;
+ return;
+ }
+
+ vg_lite_matrix_t * grad_mat_p = vg_lite_get_grad_matrix(gradient);
+ LV_ASSERT_NULL(grad_mat_p);
+ *grad_mat_p = *grad_matrix;
+
+ LV_VG_LITE_ASSERT_DEST_BUFFER(buffer);
+ LV_VG_LITE_ASSERT_SRC_BUFFER(&gradient->image);
+ LV_VG_LITE_ASSERT_PATH(path);
+ LV_VG_LITE_ASSERT_MATRIX(grad_mat_p);
+ LV_VG_LITE_ASSERT_MATRIX(matrix);
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_draw_grad");
+ LV_VG_LITE_CHECK_ERROR(vg_lite_draw_grad(
+ buffer,
+ path,
+ fill,
+ (vg_lite_matrix_t *)matrix,
+ gradient,
+ blend));
+ LV_PROFILER_END_TAG("vg_lite_draw_grad");
+
+ LV_PROFILER_END;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static vg_lite_linear_gradient_t * lv_vg_lite_linear_grad_get(struct _lv_draw_vg_lite_unit_t * u,
+ const lv_grad_dsc_t * grad)
+{
+ LV_ASSERT_NULL(u);
+ LV_ASSERT_NULL(grad);
+
+ grad_item_t search_key;
+ lv_memzero(&search_key, sizeof(grad_item_t));
+ search_key.lv_grad = *grad;
+
+ lv_cache_entry_t * cache_node_entry = lv_cache_acquire(u->grad_cache, &search_key, NULL);
+ if(cache_node_entry == NULL) {
+ /* check if the cache is full */
+ size_t free_size = lv_cache_get_free_size(u->grad_cache, NULL);
+ if(free_size == 0) {
+ LV_LOG_INFO("grad cache is full, release all pending cache entries");
+ lv_vg_lite_finish(u);
+ }
+
+ cache_node_entry = lv_cache_acquire_or_create(u->grad_cache, &search_key, NULL);
+ if(cache_node_entry == NULL) {
+ LV_LOG_ERROR("grad cache creating failed");
+ return NULL;
+ }
+ }
+
+ /* Add the new entry to the pending list */
+ lv_vg_lite_pending_add(u->grad_pending, &cache_node_entry);
+
+ grad_item_t * item = lv_cache_entry_get_data(cache_node_entry);
+ return &item->vg_grad;
+}
+
+static bool grad_create_cb(grad_item_t * item, void * user_data)
+{
+ LV_UNUSED(user_data);
+
+ LV_PROFILER_BEGIN;
+
+ vg_lite_error_t err = vg_lite_init_grad(&item->vg_grad);
+ if(err != VG_LITE_SUCCESS) {
+ LV_PROFILER_END;
+ LV_LOG_ERROR("init grad error(%d): %s", (int)err, lv_vg_lite_error_string(err));
+ return false;
+ }
+
+ vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS];
+ vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS];
+
+ /* Gradient setup */
+ uint8_t cnt = item->lv_grad.stops_count;
+ LV_ASSERT(cnt < VLC_MAX_GRADIENT_STOPS);
+ for(uint8_t i = 0; i < cnt; i++) {
+ stops[i] = item->lv_grad.stops[i].frac;
+ const lv_color_t * c = &item->lv_grad.stops[i].color;
+ lv_opa_t opa = item->lv_grad.stops[i].opa;
+
+ /* lvgl color -> gradient color */
+ lv_color_t grad_color = lv_color_make(c->blue, c->green, c->red);
+ colors[i] = lv_vg_lite_color(grad_color, opa, true);
+ }
+
+ LV_VG_LITE_CHECK_ERROR(vg_lite_set_grad(&item->vg_grad, cnt, colors, stops));
+
+ LV_PROFILER_BEGIN_TAG("vg_lite_update_grad");
+ LV_VG_LITE_CHECK_ERROR(vg_lite_update_grad(&item->vg_grad));
+ LV_PROFILER_END_TAG("vg_lite_update_grad");
+
+ LV_PROFILER_END;
+ return true;
+}
+
+static void grad_free_cb(grad_item_t * item, void * user_data)
+{
+ LV_UNUSED(user_data);
+ LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&item->vg_grad));
+}
+
+static lv_cache_compare_res_t grad_compare_cb(const grad_item_t * lhs, const grad_item_t * rhs)
+{
+ if(lhs->lv_grad.stops_count != rhs->lv_grad.stops_count) {
+ return lhs->lv_grad.stops_count > rhs->lv_grad.stops_count ? 1 : -1;
+ }
+
+ int cmp_res = memcmp(lhs->lv_grad.stops, rhs->lv_grad.stops,
+ sizeof(lv_gradient_stop_t) * lhs->lv_grad.stops_count);
+ if(cmp_res != 0) {
+ return cmp_res > 0 ? 1 : -1;
+ }
+
+ return 0;
+}
+
+static void grad_cache_release_cb(void * entry, void * user_data)
+{
+ lv_cache_entry_t ** entry_p = entry;
+ lv_cache_t * cache = user_data;
+ lv_cache_release(cache, *entry_p, NULL);
+}
+
+#endif /*LV_USE_DRAW_VG_LITE*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h
new file mode 100644
index 000000000..d709ade46
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_grad.h
@@ -0,0 +1,63 @@
+/**
+ * @file lv_vg_lite_grad.h
+ *
+ */
+
+#ifndef LV_VG_LITE_GRAD_H
+#define LV_VG_LITE_GRAD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../lvgl.h"
+
+#if LV_USE_DRAW_VG_LITE
+
+#include "lv_vg_lite_utils.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_vg_lite_grad_init(struct _lv_draw_vg_lite_unit_t * u);
+
+void lv_vg_lite_grad_deinit(struct _lv_draw_vg_lite_unit_t * u);
+
+void lv_vg_lite_grad_area_to_matrix(vg_lite_matrix_t * grad_matrix, const lv_area_t * area, lv_grad_dir_t dir);
+
+void lv_vg_lite_draw_linear_grad(
+ struct _lv_draw_vg_lite_unit_t * u,
+ vg_lite_buffer_t * buffer,
+ vg_lite_path_t * path,
+ const lv_grad_dsc_t * grad,
+ const vg_lite_matrix_t * grad_matrix,
+ const vg_lite_matrix_t * matrix,
+ vg_lite_fill_t fill,
+ vg_lite_blend_t blend);
+
+void lv_vg_lite_linear_grad_release_all(struct _lv_draw_vg_lite_unit_t * u);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_DRAW_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_VG_LITE_GRAD_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_path.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_path.c
index 40be97b4e..3efe5070c 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_path.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_path.c
@@ -80,6 +80,7 @@ void lv_vg_lite_path_deinit(struct _lv_draw_vg_lite_unit_t * unit)
lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format)
{
+ LV_PROFILER_BEGIN;
lv_vg_lite_path_t * path = lv_malloc_zeroed(sizeof(lv_vg_lite_path_t));
LV_ASSERT_MALLOC(path);
path->format_len = lv_vg_lite_path_format_len(data_format);
@@ -91,17 +92,23 @@ lv_vg_lite_path_t * lv_vg_lite_path_create(vg_lite_format_t data_format)
NULL,
0, 0, 0, 0)
== VG_LITE_SUCCESS);
+ LV_PROFILER_END;
return path;
}
void lv_vg_lite_path_destroy(lv_vg_lite_path_t * path)
{
+ LV_PROFILER_BEGIN;
LV_ASSERT_NULL(path);
if(path->base.path != NULL) {
lv_free(path->base.path);
path->base.path = NULL;
+
+ /* clear remaining path data */
+ LV_VG_LITE_CHECK_ERROR(vg_lite_clear_path(&path->base));
}
lv_free(path);
+ LV_PROFILER_END;
}
lv_vg_lite_path_t * lv_vg_lite_path_get(struct _lv_draw_vg_lite_unit_t * unit, vg_lite_format_t data_format)
@@ -129,6 +136,7 @@ void lv_vg_lite_path_reset(lv_vg_lite_path_t * path, vg_lite_format_t data_forma
path->base.path_length = 0;
path->base.format = data_format;
path->base.quality = VG_LITE_MEDIUM;
+ path->base.path_type = VG_LITE_DRAW_ZERO;
path->format_len = lv_vg_lite_path_format_len(data_format);
}
@@ -205,6 +213,8 @@ bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path)
return false;
}
+ LV_PROFILER_BEGIN;
+
lv_vg_lite_path_bounds_t bounds;
/* init bounds */
@@ -219,6 +229,8 @@ bool lv_vg_lite_path_update_bonding_box(lv_vg_lite_path_t * path)
/* set bounds */
lv_vg_lite_path_set_bonding_box(path, bounds.min_x, bounds.min_y, bounds.max_x, bounds.max_y);
+ LV_PROFILER_END;
+
return true;
}
@@ -323,6 +335,7 @@ void lv_vg_lite_path_append_rect(
float w, float h,
float rx, float ry)
{
+ LV_PROFILER_BEGIN;
const float half_w = w * 0.5f;
const float half_h = h * 0.5f;
@@ -339,12 +352,15 @@ void lv_vg_lite_path_append_rect(
lv_vg_lite_path_line_to(path, x + w, y + h);
lv_vg_lite_path_line_to(path, x, y + h);
lv_vg_lite_path_close(path);
+ LV_PROFILER_END;
return;
}
/*circle*/
if(math_equal(rx, half_w) && math_equal(ry, half_h)) {
- return lv_vg_lite_path_append_circle(path, x + (w * 0.5f), y + (h * 0.5f), rx, ry);
+ lv_vg_lite_path_append_circle(path, x + (w * 0.5f), y + (h * 0.5f), rx, ry);
+ LV_PROFILER_END;
+ return;
}
/*rounded rectangle*/
@@ -360,6 +376,7 @@ void lv_vg_lite_path_append_rect(
lv_vg_lite_path_line_to(path, x, y + ry);
lv_vg_lite_path_cubic_to(path, x, y + ry - hry, x + rx - hrx, y, x + rx, y);
lv_vg_lite_path_close(path);
+ LV_PROFILER_END;
}
void lv_vg_lite_path_append_circle(
@@ -367,6 +384,7 @@ void lv_vg_lite_path_append_circle(
float cx, float cy,
float rx, float ry)
{
+ LV_PROFILER_BEGIN;
/* https://learn.microsoft.com/zh-cn/xamarin/xamarin-forms/user-interface/graphics/skiasharp/curves/beziers */
float rx_kappa = rx * PATH_KAPPA;
float ry_kappa = ry * PATH_KAPPA;
@@ -377,6 +395,7 @@ void lv_vg_lite_path_append_circle(
lv_vg_lite_path_cubic_to(path, cx - rx_kappa, cy + ry, cx - rx, cy + ry_kappa, cx - rx, cy);
lv_vg_lite_path_cubic_to(path, cx - rx, cy - ry_kappa, cx - rx_kappa, cy - ry, cx, cy - ry);
lv_vg_lite_path_close(path);
+ LV_PROFILER_END;
}
void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path,
@@ -384,6 +403,7 @@ void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path,
float center_x, float center_y,
float end_x, float end_y)
{
+ LV_PROFILER_BEGIN;
float dx1 = center_x - start_x;
float dy1 = center_y - start_y;
float dx2 = end_x - center_x;
@@ -395,6 +415,7 @@ void lv_vg_lite_path_append_arc_right_angle(lv_vg_lite_path_t * path,
start_x - c * dy1, start_y + c * dx1,
end_x - c * dy2, end_y + c * dx2,
end_x, end_y);
+ LV_PROFILER_END;
}
void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path,
@@ -404,16 +425,19 @@ void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path,
float sweep,
bool pie)
{
+ LV_PROFILER_BEGIN;
/* just circle */
if(sweep >= 360.0f || sweep <= -360.0f) {
- return lv_vg_lite_path_append_circle(path, cx, cy, radius, radius);
+ lv_vg_lite_path_append_circle(path, cx, cy, radius, radius);
+ LV_PROFILER_END;
+ return;
}
start_angle = MATH_RADIANS(start_angle);
sweep = MATH_RADIANS(sweep);
int n_curves = (int)ceil(MATH_FABSF(sweep / MATH_HALF_PI));
- int sweep_sign = (sweep < 0 ? -1 : 1);
+ float sweep_sign = sweep < 0 ? -1.f : 1.f;
float fract = fmodf(sweep, MATH_HALF_PI);
fract = (math_zero(fract)) ? MATH_HALF_PI * sweep_sign : fract;
@@ -425,9 +449,6 @@ void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path,
lv_vg_lite_path_move_to(path, cx, cy);
lv_vg_lite_path_line_to(path, start_x + cx, start_y + cy);
}
- else {
- lv_vg_lite_path_move_to(path, start_x + cx, start_y + cy);
- }
for(int i = 0; i < n_curves; ++i) {
float end_angle = start_angle + ((i != n_curves - 1) ? MATH_HALF_PI * sweep_sign : fract);
@@ -466,6 +487,8 @@ void lv_vg_lite_path_append_arc(lv_vg_lite_path_t * path,
if(pie) {
lv_vg_lite_path_close(path);
}
+
+ LV_PROFILER_END;
}
uint8_t lv_vg_lite_vlc_op_arg_len(uint8_t vlc_op)
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c
new file mode 100644
index 000000000..044417207
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.c
@@ -0,0 +1,99 @@
+/**
+ * @file lv_vg_lite_pending.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_vg_lite_pending.h"
+
+#if LV_USE_DRAW_VG_LITE
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+struct _lv_vg_lite_pending_t {
+ lv_array_t objs;
+ lv_vg_lite_pending_free_cb_t free_cb;
+ void * user_data;
+};
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default)
+{
+ lv_vg_lite_pending_t * pending = lv_malloc_zeroed(sizeof(lv_vg_lite_pending_t));
+ LV_ASSERT_MALLOC(pending);
+ lv_array_init(&pending->objs, capacity_default, obj_size);
+ return pending;
+}
+
+void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending)
+{
+ LV_ASSERT_NULL(pending);
+ lv_vg_lite_pending_remove_all(pending);
+ lv_array_deinit(&pending->objs);
+ lv_memzero(pending, sizeof(lv_vg_lite_pending_t));
+ lv_free(pending);
+}
+
+void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb,
+ void * user_data)
+{
+ LV_ASSERT_NULL(pending);
+ LV_ASSERT_NULL(free_cb);
+ pending->free_cb = free_cb;
+ pending->user_data = user_data;
+}
+
+void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj)
+{
+ LV_ASSERT_NULL(pending);
+ LV_ASSERT_NULL(obj);
+ lv_array_push_back(&pending->objs, obj);
+}
+
+void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending)
+{
+ LV_ASSERT_NULL(pending);
+ LV_ASSERT_NULL(pending->free_cb);
+
+ uint32_t size = lv_array_size(&pending->objs);
+ if(size == 0) {
+ return;
+ }
+
+ /* remove all the pending objects */
+ for(uint32_t i = 0; i < size; i++) {
+ pending->free_cb(lv_array_at(&pending->objs, i), pending->user_data);
+ }
+
+ lv_array_clear(&pending->objs);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+#endif /*LV_USE_DRAW_VG_LITE*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h
new file mode 100644
index 000000000..8def9dcf5
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_pending.h
@@ -0,0 +1,83 @@
+/**
+ * @file lv_vg_lite_pending.h
+ *
+ */
+
+#ifndef LV_VG_LITE_PENDING_H
+#define LV_VG_LITE_PENDING_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../lvgl.h"
+
+#if LV_USE_DRAW_VG_LITE
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct _lv_vg_lite_pending_t lv_vg_lite_pending_t;
+
+typedef void (*lv_vg_lite_pending_free_cb_t)(void * obj, void * user_data);
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Create a pending list
+ * @param obj_size the size of the objects in the list
+ * @param capacity_default the default capacity of the list
+ * @return a pointer to the pending list
+ */
+lv_vg_lite_pending_t * lv_vg_lite_pending_create(size_t obj_size, uint32_t capacity_default);
+
+/**
+ * Destroy a pending list
+ * @param pending pointer to the pending list
+ */
+void lv_vg_lite_pending_destroy(lv_vg_lite_pending_t * pending);
+
+/**
+ * Set a free callback for the pending list
+ * @param pending pointer to the pending list
+ * @param free_cb the free callback
+ * @param user_data user data to pass to the free callback
+ */
+void lv_vg_lite_pending_set_free_cb(lv_vg_lite_pending_t * pending, lv_vg_lite_pending_free_cb_t free_cb,
+ void * user_data);
+
+/**
+ * Add an object to the pending list
+ * @param pending pointer to the pending list
+ * @param obj pointer to the object to add
+ */
+void lv_vg_lite_pending_add(lv_vg_lite_pending_t * pending, void * obj);
+
+/**
+ * Remove all objects from the pending list
+ * @param pending pointer to the pending list
+ */
+void lv_vg_lite_pending_remove_all(lv_vg_lite_pending_t * pending);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_USE_DRAW_VG_LITE*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_VG_LITE_PENDING_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c
index c8bf9f859..cb212fb63 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.c
@@ -13,6 +13,9 @@
#include "lv_vg_lite_decoder.h"
#include "lv_vg_lite_path.h"
+#include "lv_vg_lite_pending.h"
+#include "lv_vg_lite_grad.h"
+#include "lv_draw_vg_lite_type.h"
#include
/*********************
@@ -43,6 +46,8 @@
* STATIC PROTOTYPES
**********************/
+static void image_dsc_free_cb(void * dsc, void * user_data);
+
/**********************
* STATIC VARIABLES
**********************/
@@ -295,7 +300,7 @@ void lv_vg_lite_buffer_dump_info(const vg_lite_buffer_t * buffer)
void lv_vg_lite_matrix_dump_info(const vg_lite_matrix_t * matrix)
{
for(int i = 0; i < 3; i++) {
- LV_LOG_USER("| %0.2f, %0.2f, %0.2f |",
+ LV_LOG_USER("| %f, %f, %f |",
(matrix)->m[i][0], (matrix)->m[i][1], (matrix)->m[i][2]);
}
}
@@ -304,14 +309,18 @@ bool lv_vg_lite_is_dest_cf_supported(lv_color_format_t cf)
{
switch(cf) {
case LV_COLOR_FORMAT_RGB565:
- case LV_COLOR_FORMAT_RGB565A8:
- case LV_COLOR_FORMAT_RGB888:
case LV_COLOR_FORMAT_ARGB8888:
case LV_COLOR_FORMAT_XRGB8888:
return true;
+
+ case LV_COLOR_FORMAT_ARGB8565:
+ case LV_COLOR_FORMAT_RGB888:
+ return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false;
+
default:
break;
}
+
return false;
}
@@ -320,17 +329,28 @@ bool lv_vg_lite_is_src_cf_supported(lv_color_format_t cf)
switch(cf) {
case LV_COLOR_FORMAT_A4:
case LV_COLOR_FORMAT_A8:
- case LV_COLOR_FORMAT_I8:
case LV_COLOR_FORMAT_RGB565:
- case LV_COLOR_FORMAT_RGB565A8:
- case LV_COLOR_FORMAT_RGB888:
case LV_COLOR_FORMAT_ARGB8888:
case LV_COLOR_FORMAT_XRGB8888:
- case LV_COLOR_FORMAT_NV12:
return true;
+
+ case LV_COLOR_FORMAT_I1:
+ case LV_COLOR_FORMAT_I2:
+ case LV_COLOR_FORMAT_I4:
+ case LV_COLOR_FORMAT_I8:
+ return vg_lite_query_feature(gcFEATURE_BIT_VG_IM_INDEX_FORMAT) ? true : false;
+
+ case LV_COLOR_FORMAT_ARGB8565:
+ case LV_COLOR_FORMAT_RGB888:
+ return vg_lite_query_feature(gcFEATURE_BIT_VG_24BIT) ? true : false;
+
+ case LV_COLOR_FORMAT_NV12:
+ return vg_lite_query_feature(gcFEATURE_BIT_VG_YUV_INPUT) ? true : false;
+
default:
break;
}
+
return false;
}
@@ -361,7 +381,7 @@ vg_lite_buffer_format_t lv_vg_lite_vg_fmt(lv_color_format_t cf)
case LV_COLOR_FORMAT_RGB565:
return VG_LITE_BGR565;
- case LV_COLOR_FORMAT_RGB565A8:
+ case LV_COLOR_FORMAT_ARGB8565:
return VG_LITE_BGRA5658;
case LV_COLOR_FORMAT_RGB888:
@@ -549,8 +569,12 @@ void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_bu
int32_t height = draw_buf->header.h;
vg_lite_buffer_format_t format = lv_vg_lite_vg_fmt(draw_buf->header.cf);
- if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf))
- ptr += LV_COLOR_INDEXED_PALETTE_SIZE(draw_buf->header.cf) * 4;
+ if(LV_COLOR_FORMAT_IS_INDEXED(draw_buf->header.cf)) {
+ uint32_t palette_size_bytes = LV_COLOR_INDEXED_PALETTE_SIZE(draw_buf->header.cf) * sizeof(uint32_t);
+
+ /* Skip palette */
+ ptr += LV_VG_LITE_ALIGN(palette_size_bytes, LV_DRAW_BUF_ALIGN);
+ }
width = lv_vg_lite_width_align(width);
@@ -627,13 +651,27 @@ bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_ds
if(LV_COLOR_FORMAT_IS_INDEXED(decoded->header.cf)) {
uint32_t palette_size = LV_COLOR_INDEXED_PALETTE_SIZE(decoded->header.cf);
+ LV_PROFILER_BEGIN_TAG("vg_lite_set_CLUT");
LV_VG_LITE_CHECK_ERROR(vg_lite_set_CLUT(palette_size, (vg_lite_uint32_t *)decoded->data));
+ LV_PROFILER_END_TAG("vg_lite_set_CLUT");
}
lv_vg_lite_buffer_from_draw_buf(buffer, decoded);
return true;
}
+void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit)
+{
+ unit->image_dsc_pending = lv_vg_lite_pending_create(sizeof(lv_image_decoder_dsc_t), 4);
+ lv_vg_lite_pending_set_free_cb(unit->image_dsc_pending, image_dsc_free_cb, NULL);
+}
+
+void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit)
+{
+ lv_vg_lite_pending_destroy(unit->image_dsc_pending);
+ unit->image_dsc_pending = NULL;
+}
+
void lv_vg_lite_rect(vg_lite_rectangle_t * rect, const lv_area_t * area)
{
rect->x = area->x1;
@@ -774,18 +812,27 @@ bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src)
return false;
}
- if(!(buffer->image_mode == VG_LITE_NORMAL_IMAGE_MODE
- || buffer->image_mode == VG_LITE_NONE_IMAGE_MODE
- || buffer->image_mode == VG_LITE_MULTIPLY_IMAGE_MODE)) {
- LV_LOG_ERROR("buffer image_mode(%d) is invalid", (int)buffer->image_mode);
- return false;
+ switch(buffer->image_mode) {
+ case VG_LITE_ZERO:
+ case VG_LITE_NORMAL_IMAGE_MODE:
+ case VG_LITE_MULTIPLY_IMAGE_MODE:
+ case VG_LITE_STENCIL_MODE:
+ case VG_LITE_NONE_IMAGE_MODE:
+ case VG_LITE_RECOLOR_MODE:
+ break;
+ default:
+ LV_LOG_ERROR("buffer image_mode(%d) is invalid", (int)buffer->image_mode);
+ return false;
}
- if(!(buffer->transparency_mode == VG_LITE_IMAGE_OPAQUE
- || buffer->transparency_mode == VG_LITE_IMAGE_TRANSPARENT)) {
- LV_LOG_ERROR("buffer transparency_mode(%d) is invalid",
- (int)buffer->transparency_mode);
- return false;
+ switch(buffer->transparency_mode) {
+ case VG_LITE_IMAGE_OPAQUE:
+ case VG_LITE_IMAGE_TRANSPARENT:
+ break;
+ default:
+ LV_LOG_ERROR("buffer transparency_mode(%d) is invalid",
+ (int)buffer->transparency_mode);
+ return false;
}
return true;
@@ -849,6 +896,23 @@ bool lv_vg_lite_path_check(const vg_lite_path_t * path)
return true;
}
+bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix)
+{
+ if(matrix == NULL) {
+ LV_LOG_ERROR("matrix is NULL");
+ return false;
+ }
+
+ vg_lite_matrix_t result;
+ if(!lv_vg_lite_matrix_inverse(&result, matrix)) {
+ LV_LOG_ERROR("matrix is not invertible");
+ lv_vg_lite_matrix_dump_info(matrix);
+ return false;
+ }
+
+ return true;
+}
+
bool lv_vg_lite_support_blend_normal(void)
{
return vg_lite_query_feature(gcFEATURE_BIT_VG_LVGL_SUPPORT);
@@ -859,81 +923,20 @@ bool lv_vg_lite_16px_align(void)
return vg_lite_query_feature(gcFEATURE_BIT_VG_16PIXELS_ALIGN);
}
-void lv_vg_lite_draw_linear_grad(
- vg_lite_buffer_t * buffer,
- vg_lite_path_t * path,
- const lv_area_t * area,
- const lv_grad_dsc_t * grad,
- const vg_lite_matrix_t * matrix,
- vg_lite_fill_t fill,
- vg_lite_blend_t blend)
-{
- LV_ASSERT_NULL(buffer);
- LV_ASSERT_NULL(path);
- LV_ASSERT_NULL(area);
- LV_ASSERT_NULL(grad);
-
- LV_ASSERT(grad->dir != LV_GRAD_DIR_NONE);
-
- vg_lite_uint32_t colors[VLC_MAX_GRADIENT_STOPS];
- vg_lite_uint32_t stops[VLC_MAX_GRADIENT_STOPS];
-
- /* Gradient setup */
- uint8_t cnt = grad->stops_count;
- LV_ASSERT(cnt < VLC_MAX_GRADIENT_STOPS);
- for(uint8_t i = 0; i < cnt; i++) {
- stops[i] = grad->stops[i].frac;
- const lv_color_t * c = &grad->stops[i].color;
- lv_opa_t opa = grad->stops[i].opa;
-
- /* lvgl color -> gradient color */
- lv_color_t grad_color = lv_color_make(c->blue, c->green, c->red);
- colors[i] = lv_vg_lite_color(grad_color, opa, true);
- }
-
- vg_lite_linear_gradient_t gradient;
- lv_memzero(&gradient, sizeof(gradient));
-
- LV_VG_LITE_CHECK_ERROR(vg_lite_init_grad(&gradient));
- LV_VG_LITE_CHECK_ERROR(vg_lite_set_grad(&gradient, cnt, colors, stops));
- LV_VG_LITE_CHECK_ERROR(vg_lite_update_grad(&gradient));
-
- vg_lite_matrix_t * grad_matrix = vg_lite_get_grad_matrix(&gradient);
- vg_lite_identity(grad_matrix);
- vg_lite_translate(area->x1, area->y1, grad_matrix);
-
- if(grad->dir == LV_GRAD_DIR_VER) {
- vg_lite_scale(1, lv_area_get_height(area) / 256.0f, grad_matrix);
- vg_lite_rotate(90, grad_matrix);
- }
- else { /*LV_GRAD_DIR_HOR*/
- vg_lite_scale(lv_area_get_width(area) / 256.0f, 1, grad_matrix);
- }
-
- LV_VG_LITE_CHECK_ERROR(vg_lite_draw_grad(
- buffer,
- path,
- fill,
- (vg_lite_matrix_t *)matrix,
- &gradient,
- blend));
-
- LV_VG_LITE_CHECK_ERROR(vg_lite_clear_grad(&gradient));
-}
-
void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult)
{
vg_lite_matrix_t temp;
int row, column;
+ vg_lite_float_t (*m)[3] = matrix->m;
/* Process all rows. */
for(row = 0; row < 3; row++) {
/* Process all columns. */
for(column = 0; column < 3; column++) {
/* Compute matrix entry. */
- temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column])
- + (matrix->m[row][1] * mult->m[1][column])
- + (matrix->m[row][2] * mult->m[2][column]);
+ temp.m[row][column] = (m[row][0] * mult->m[0][column])
+ + (m[row][1] * mult->m[1][column])
+ + (m[row][2] * mult->m[2][column]);
}
}
@@ -968,12 +971,14 @@ bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t
return true;
}
- det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]);
- det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]);
- det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]);
+ const vg_lite_float_t (*m)[3] = matrix->m;
+
+ det00 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
+ det01 = m[2][0] * m[1][2] - m[1][0] * m[2][2];
+ det02 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
/* Compute determinant. */
- d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02);
+ d = m[0][0] * det00 + m[0][1] * det01 + m[0][2] * det02;
/* Return 0 if there is no inverse matrix. */
if(d == 0.0f)
@@ -983,17 +988,17 @@ bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t
d = 1.0f / d;
/* Determine if the matrix is affine. */
- is_affine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f);
+ is_affine = (m[2][0] == 0.0f) && (m[2][1] == 0.0f) && (m[2][2] == 1.0f);
result->m[0][0] = d * det00;
- result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2]));
- result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2]));
+ result->m[0][1] = d * ((m[2][1] * m[0][2]) - (m[0][1] * m[2][2]));
+ result->m[0][2] = d * ((m[0][1] * m[1][2]) - (m[1][1] * m[0][2]));
result->m[1][0] = d * det01;
- result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2]));
- result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2]));
+ result->m[1][1] = d * ((m[0][0] * m[2][2]) - (m[2][0] * m[0][2]));
+ result->m[1][2] = d * ((m[1][0] * m[0][2]) - (m[0][0] * m[1][2]));
result->m[2][0] = is_affine ? 0.0f : d * det02;
- result->m[2][1] = is_affine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1]));
- result->m[2][2] = is_affine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1]));
+ result->m[2][1] = is_affine ? 0.0f : d * ((m[2][0] * m[0][1]) - (m[0][0] * m[2][1]));
+ result->m[2][2] = is_affine ? 1.0f : d * ((m[0][0] * m[1][1]) - (m[1][0] * m[0][1]));
/* Success. */
return true;
@@ -1002,28 +1007,79 @@ bool lv_vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t
lv_point_precise_t lv_vg_lite_matrix_transform_point(const vg_lite_matrix_t * matrix, const lv_point_precise_t * point)
{
lv_point_precise_t p;
- p.x = (lv_value_precise_t)(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]);
- p.y = (lv_value_precise_t)(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]);
+ const vg_lite_float_t (*m)[3] = matrix->m;
+ p.x = (lv_value_precise_t)(point->x * m[0][0] + point->y * m[0][1] + m[0][2]);
+ p.y = (lv_value_precise_t)(point->x * m[1][0] + point->y * m[1][1] + m[1][2]);
return p;
}
void lv_vg_lite_set_scissor_area(const lv_area_t * area)
{
- vg_lite_enable_scissor();
- vg_lite_set_scissor(
- area->x1,
- area->y1,
- lv_area_get_width(area),
- lv_area_get_height(area));
+ LV_VG_LITE_CHECK_ERROR(vg_lite_enable_scissor());
+ LV_VG_LITE_CHECK_ERROR(vg_lite_set_scissor(
+ area->x1,
+ area->y1,
+ lv_area_get_width(area),
+ lv_area_get_height(area)));
}
void lv_vg_lite_disable_scissor(void)
{
- vg_lite_disable_scissor();
+ LV_VG_LITE_CHECK_ERROR(vg_lite_disable_scissor());
+}
+
+void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u)
+{
+ LV_ASSERT_NULL(u);
+ LV_PROFILER_BEGIN;
+
+ u->flush_count++;
+
+#if LV_VG_LITE_FLUSH_MAX_COUNT
+ if(u->flush_count < LV_VG_LITE_FLUSH_MAX_COUNT) {
+ /* Do not flush too often */
+ LV_PROFILER_END;
+ return;
+ }
+#else
+ vg_lite_uint32_t is_gpu_idle = 0;
+ LV_VG_LITE_CHECK_ERROR(vg_lite_get_parameter(VG_LITE_GPU_IDLE_STATE, 1, (vg_lite_pointer)&is_gpu_idle));
+ if(!is_gpu_idle) {
+ /* Do not flush if GPU is busy */
+ LV_PROFILER_END;
+ return;
+ }
+#endif
+
+ LV_VG_LITE_CHECK_ERROR(vg_lite_flush());
+ u->flush_count = 0;
+ LV_PROFILER_END;
+}
+
+void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u)
+{
+ LV_ASSERT_NULL(u);
+ LV_PROFILER_BEGIN;
+
+ LV_VG_LITE_CHECK_ERROR(vg_lite_finish());
+
+ /* Clear all gradient caches reference */
+ lv_vg_lite_pending_remove_all(u->grad_pending);
+
+ /* Clear image decoder dsc reference */
+ lv_vg_lite_pending_remove_all(u->image_dsc_pending);
+ u->flush_count = 0;
+ LV_PROFILER_END;
}
/**********************
* STATIC FUNCTIONS
**********************/
+static void image_dsc_free_cb(void * dsc, void * user_data)
+{
+ LV_UNUSED(user_data);
+ lv_image_decoder_close(dsc);
+}
+
#endif /*LV_USE_DRAW_VG_LITE*/
diff --git a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h
index a0edc735c..c50d600c5 100644
--- a/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h
+++ b/lib/libesp32_lvgl/lvgl/src/draw/vg_lite/lv_vg_lite_utils.h
@@ -18,6 +18,8 @@ extern "C" {
#if LV_USE_DRAW_VG_LITE
+#include "../../misc/lv_profiler.h"
+
#include
#if LV_USE_VG_LITE_THORVG
#include "../../others/vg_lite_tvg/vg_lite.h"
@@ -29,10 +31,6 @@ extern "C" {
* DEFINES
*********************/
-#if LV_DRAW_BUF_ALIGN != 64
-#error "LV_DRAW_BUF_ALIGN must be 64"
-#endif
-
#define LV_VG_LITE_IS_ERROR(err) (err > 0)
#define VLC_GET_OP_CODE(ptr) (*((uint8_t*)ptr))
@@ -56,6 +54,7 @@ extern "C" {
#define LV_VG_LITE_ASSERT_PATH(path) LV_VG_LITE_ASSERT(lv_vg_lite_path_check(path))
#define LV_VG_LITE_ASSERT_SRC_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, true))
#define LV_VG_LITE_ASSERT_DEST_BUFFER(buffer) LV_VG_LITE_ASSERT(lv_vg_lite_buffer_check(buffer, false))
+#define LV_VG_LITE_ASSERT_MATRIX(matrix) LV_VG_LITE_ASSERT(lv_vg_lite_matrix_check(matrix))
#define LV_VG_LITE_ALIGN(number, align_bytes) \
(((number) + ((align_bytes)-1)) & ~((align_bytes)-1))
@@ -72,6 +71,8 @@ extern "C" {
* TYPEDEFS
**********************/
+struct _lv_draw_vg_lite_unit_t;
+
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -124,9 +125,15 @@ void lv_vg_lite_buffer_from_draw_buf(vg_lite_buffer_t * buffer, const lv_draw_bu
void lv_vg_lite_image_matrix(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc);
+void lv_vg_lite_image_dec_init(vg_lite_matrix_t * matrix, int32_t x, int32_t y, const lv_draw_image_dsc_t * dsc);
+
bool lv_vg_lite_buffer_open_image(vg_lite_buffer_t * buffer, lv_image_decoder_dsc_t * decoder_dsc, const void * src,
bool no_cache);
+void lv_vg_lite_image_dsc_init(struct _lv_draw_vg_lite_unit_t * unit);
+
+void lv_vg_lite_image_dsc_deinit(struct _lv_draw_vg_lite_unit_t * unit);
+
vg_lite_blend_t lv_vg_lite_blend_mode(lv_blend_mode_t blend_mode);
uint32_t lv_vg_lite_get_palette_size(vg_lite_buffer_format_t format);
@@ -141,21 +148,14 @@ bool lv_vg_lite_buffer_check(const vg_lite_buffer_t * buffer, bool is_src);
bool lv_vg_lite_path_check(const vg_lite_path_t * path);
+bool lv_vg_lite_matrix_check(const vg_lite_matrix_t * matrix);
+
/* Wrapper */
bool lv_vg_lite_support_blend_normal(void);
bool lv_vg_lite_16px_align(void);
-void lv_vg_lite_draw_linear_grad(
- vg_lite_buffer_t * buffer,
- vg_lite_path_t * path,
- const lv_area_t * area,
- const lv_grad_dsc_t * grad,
- const vg_lite_matrix_t * matrix,
- vg_lite_fill_t fill,
- vg_lite_blend_t blend);
-
void lv_vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult);
void lv_vg_lite_matrix_flip_y(vg_lite_matrix_t * matrix);
@@ -168,6 +168,10 @@ void lv_vg_lite_set_scissor_area(const lv_area_t * area);
void lv_vg_lite_disable_scissor(void);
+void lv_vg_lite_flush(struct _lv_draw_vg_lite_unit_t * u);
+
+void lv_vg_lite_finish(struct _lv_draw_vg_lite_unit_t * u);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/display/drm/lv_linux_drm.c b/lib/libesp32_lvgl/lvgl/src/drivers/display/drm/lv_linux_drm.c
index 0f847344a..faa2212bf 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/display/drm/lv_linux_drm.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/display/drm/lv_linux_drm.c
@@ -9,8 +9,6 @@
#include "lv_linux_drm.h"
#if LV_USE_LINUX_DRM
-#include "../../../lv_api_map.h"
-
#include
#include
#include
@@ -26,7 +24,7 @@
* DEFINES
*********************/
#if LV_COLOR_DEPTH == 32
- #define DRM_FOURCC DRM_FORMAT_ARGB8888
+ #define DRM_FOURCC DRM_FORMAT_XRGB8888
#elif LV_COLOR_DEPTH == 16
#define DRM_FOURCC DRM_FORMAT_RGB565
#else
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.c b/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.c
index c835efa80..cf529a25d 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.c
@@ -59,6 +59,7 @@ typedef struct {
char * fbp;
long int screensize;
int fbfd;
+ bool force_refresh;
} lv_linux_fb_t;
/**********************
@@ -92,8 +93,8 @@ lv_display_t * lv_linux_fbdev_create(void)
{
static bool inited = false;
if(!inited) {
- lv_tick_set_cb(tick_get_cb),
- inited = true;
+ lv_tick_set_cb(tick_get_cb);
+ inited = true;
}
lv_linux_fb_t * dsc = lv_malloc_zeroed(sizeof(lv_linux_fb_t));
@@ -230,7 +231,7 @@ void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file)
lv_display_set_buffers(disp, draw_buf, draw_buf_2, draw_buf_size, LV_LINUX_FBDEV_RENDER_MODE);
lv_display_set_resolution(disp, hor_res, ver_res);
- if(width) {
+ if(width > 0) {
lv_display_set_dpi(disp, DIV_ROUND_UP(hor_res * 254, width * 10));
}
@@ -238,6 +239,12 @@ void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file)
hor_res, ver_res, lv_display_get_dpi(disp));
}
+void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled)
+{
+ lv_linux_fb_t * dsc = lv_display_get_driver_data(disp);
+ dsc->force_refresh = enabled;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -275,6 +282,13 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * colo
}
}
+ if(dsc->force_refresh) {
+ dsc->vinfo.activate |= FB_ACTIVATE_NOW | FB_ACTIVATE_FORCE;
+ if(ioctl(dsc->fbfd, FBIOPUT_VSCREENINFO, &(dsc->vinfo)) == -1) {
+ perror("Error setting var screen info");
+ }
+ }
+
lv_display_flush_ready(disp);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.h b/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.h
index b94723c9f..c14e9734c 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.h
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/display/fb/lv_linux_fbdev.h
@@ -33,6 +33,12 @@ lv_display_t * lv_linux_fbdev_create(void);
void lv_linux_fbdev_set_file(lv_display_t * disp, const char * file);
+/**
+ * Force the display to be refreshed on every change.
+ * Expected to be used with LV_DISPLAY_RENDER_MODE_DIRECT or LV_DISPLAY_RENDER_MODE_FULL.
+ */
+void lv_linux_fbdev_set_force_refresh(lv_display_t * disp, bool enabled);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.c b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.c
new file mode 100644
index 000000000..f207fa477
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.c
@@ -0,0 +1,670 @@
+/**
+ * @file lv_libinput.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_libinput.h"
+
+#if LV_USE_LIBINPUT
+
+#include "../../display/lv_display_private.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#if LV_LIBINPUT_BSD
+ #include
+#else
+ #include
+#endif
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+struct lv_libinput_device {
+ lv_libinput_capability capabilities;
+ char * path;
+};
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static bool _rescan_devices(void);
+static bool _add_scanned_device(char * path, lv_libinput_capability capabilities);
+static void _reset_scanned_devices(void);
+
+static void * _poll_thread(void * data);
+
+lv_libinput_event_t * _get_event(lv_libinput_t * state);
+bool _event_pending(lv_libinput_t * state);
+lv_libinput_event_t * _create_event(lv_libinput_t * state);
+
+static void _read(lv_indev_t * indev, lv_indev_data_t * data);
+static void _read_pointer(lv_libinput_t * state, struct libinput_event * event);
+static void _read_keypad(lv_libinput_t * state, struct libinput_event * event);
+
+static int _open_restricted(const char * path, int flags, void * user_data);
+static void _close_restricted(int fd, void * user_data);
+
+static void _delete(lv_libinput_t * dsc);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+static struct lv_libinput_device * devices = NULL;
+static size_t num_devices = 0;
+
+static const int timeout = 100; // ms
+static const nfds_t nfds = 1;
+
+static const struct libinput_interface interface = {
+ .open_restricted = _open_restricted,
+ .close_restricted = _close_restricted,
+};
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device)
+{
+ lv_libinput_capability capability = LV_LIBINPUT_CAPABILITY_NONE;
+ if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_KEYBOARD)
+ && (libinput_device_keyboard_has_key(device, KEY_ENTER) || libinput_device_keyboard_has_key(device, KEY_KPENTER))) {
+ capability |= LV_LIBINPUT_CAPABILITY_KEYBOARD;
+ }
+ if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_POINTER)) {
+ capability |= LV_LIBINPUT_CAPABILITY_POINTER;
+ }
+ if(libinput_device_has_capability(device, LIBINPUT_DEVICE_CAP_TOUCH)) {
+ capability |= LV_LIBINPUT_CAPABILITY_TOUCH;
+ }
+ return capability;
+}
+
+char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan)
+{
+ char * path = NULL;
+ lv_libinput_find_devs(capabilities, &path, 1, force_rescan);
+ return path;
+}
+
+size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan)
+{
+ if((!devices || force_rescan) && !_rescan_devices()) {
+ return 0;
+ }
+
+ size_t num_found = 0;
+
+ for(size_t i = 0; i < num_devices && num_found < count; ++i) {
+ if(devices[i].capabilities & capabilities) {
+ found[num_found] = devices[i].path;
+ num_found++;
+ }
+ }
+
+ return num_found;
+}
+
+lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path)
+{
+ lv_libinput_t * dsc = lv_malloc_zeroed(sizeof(lv_libinput_t));
+ LV_ASSERT_MALLOC(dsc);
+ if(dsc == NULL) return NULL;
+
+ dsc->libinput_context = libinput_path_create_context(&interface, NULL);
+ if(!dsc->libinput_context) {
+ LV_LOG_ERROR("libinput_path_create_context failed: %s", strerror(errno));
+ _delete(dsc);
+ return NULL;
+ }
+
+ dsc->libinput_device = libinput_path_add_device(dsc->libinput_context, dev_path);
+ if(!dsc->libinput_device) {
+ _delete(dsc);
+ return NULL;
+ }
+
+ dsc->libinput_device = libinput_device_ref(dsc->libinput_device);
+ if(!dsc->libinput_device) {
+ _delete(dsc);
+ return NULL;
+ }
+
+ dsc->fd = libinput_get_fd(dsc->libinput_context);
+
+ /* Prepare poll */
+ dsc->fds[0].fd = dsc->fd;
+ dsc->fds[0].events = POLLIN;
+ dsc->fds[0].revents = 0;
+
+#if LV_LIBINPUT_XKB
+ struct xkb_rule_names names = LV_LIBINPUT_XKB_KEY_MAP;
+ lv_xkb_init(&(dsc->xkb), names);
+#endif /* LV_LIBINPUT_XKB */
+
+ /* Create indev */
+ lv_indev_t * indev = lv_indev_create();
+ if(!indev) {
+ _delete(dsc);
+ return NULL;
+ }
+ lv_indev_set_type(indev, indev_type);
+ lv_indev_set_read_cb(indev, _read);
+ lv_indev_set_driver_data(indev, dsc);
+
+ /* Set up thread & lock */
+ pthread_mutex_init(&dsc->event_lock, NULL);
+ pthread_create(&dsc->worker_thread, NULL, _poll_thread, dsc);
+
+ return indev;
+}
+
+void lv_libinput_delete(lv_indev_t * indev)
+{
+ _delete(lv_indev_get_driver_data(indev));
+ lv_indev_delete(indev);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/**
+ * rescan all attached evdev devices and store capable ones into the static devices array for quick later filtering
+ * @return true if the operation succeeded
+ */
+static bool _rescan_devices(void)
+{
+ _reset_scanned_devices();
+
+ DIR * dir;
+ struct dirent * ent;
+ if(!(dir = opendir("/dev/input"))) {
+ perror("unable to open directory /dev/input");
+ return false;
+ }
+
+ struct libinput * context = libinput_path_create_context(&interface, NULL);
+
+ while((ent = readdir(dir))) {
+ if(strncmp(ent->d_name, "event", 5) != 0) {
+ continue;
+ }
+
+ /* 11 characters for /dev/input/ + length of name + 1 NUL terminator */
+ char * path = malloc((11 + strlen(ent->d_name) + 1) * sizeof(char));
+ if(!path) {
+ perror("could not allocate memory for device node path");
+ libinput_unref(context);
+ _reset_scanned_devices();
+ return false;
+ }
+ strcpy(path, "/dev/input/");
+ strcat(path, ent->d_name);
+
+ struct libinput_device * device = libinput_path_add_device(context, path);
+ if(!device) {
+ perror("unable to add device to libinput context");
+ free(path);
+ continue;
+ }
+
+ /* The device pointer is guaranteed to be valid until the next libinput_dispatch. Since we're not dispatching events
+ * as part of this function, we don't have to increase its reference count to keep it alive.
+ * https://wayland.freedesktop.org/libinput/doc/latest/api/group__base.html#gaa797496f0150b482a4e01376bd33a47b */
+
+ lv_libinput_capability capabilities = lv_libinput_query_capability(device);
+
+ libinput_path_remove_device(device);
+
+ if(capabilities == LV_LIBINPUT_CAPABILITY_NONE) {
+ free(path);
+ continue;
+ }
+
+ if(!_add_scanned_device(path, capabilities)) {
+ free(path);
+ libinput_unref(context);
+ _reset_scanned_devices();
+ return false;
+ }
+ }
+
+ libinput_unref(context);
+ return true;
+}
+
+/**
+ * add a new scanned device to the static devices array, growing its size when necessary
+ * @param path device file path
+ * @param capabilities device input capabilities
+ * @return true if the operation succeeded
+ */
+static bool _add_scanned_device(char * path, lv_libinput_capability capabilities)
+{
+ /* Double array size every 2^n elements */
+ if((num_devices & (num_devices + 1)) == 0) {
+ struct lv_libinput_device * tmp = realloc(devices, (2 * num_devices + 1) * sizeof(struct lv_libinput_device));
+ if(!tmp) {
+ perror("could not reallocate memory for devices array");
+ return false;
+ }
+ devices = tmp;
+ }
+
+ devices[num_devices].path = path;
+ devices[num_devices].capabilities = capabilities;
+ num_devices++;
+
+ return true;
+}
+
+/**
+ * reset the array of scanned devices and free any dynamically allocated memory
+ */
+static void _reset_scanned_devices(void)
+{
+ if(!devices) {
+ return;
+ }
+
+ for(size_t i = 0; i < num_devices; ++i) {
+ free(devices[i].path);
+ }
+ free(devices);
+
+ devices = NULL;
+ num_devices = 0;
+}
+
+static void * _poll_thread(void * data)
+{
+ lv_libinput_t * dsc = (lv_libinput_t *)data;
+ struct libinput_event * event;
+ int rc = 0;
+
+ LV_LOG_INFO("libinput: poll worker started");
+
+ while(true) {
+ rc = poll(dsc->fds, nfds, timeout);
+ switch(rc) {
+ case -1:
+ perror(NULL);
+ __attribute__((fallthrough));
+ case 0:
+ if(dsc->deinit) {
+ dsc->deinit = false; /* Signal that we're done */
+ return NULL;
+ }
+ continue;
+ default:
+ break;
+ }
+ libinput_dispatch(dsc->libinput_context);
+ pthread_mutex_lock(&dsc->event_lock);
+ while((event = libinput_get_event(dsc->libinput_context)) != NULL) {
+ _read_pointer(dsc, event);
+ _read_keypad(dsc, event);
+ libinput_event_destroy(event);
+ }
+ pthread_mutex_unlock(&dsc->event_lock);
+ LV_LOG_INFO("libinput: event read");
+ }
+
+ return NULL;
+}
+
+lv_libinput_event_t * _get_event(lv_libinput_t * dsc)
+{
+ if(dsc->start == dsc->end) {
+ return NULL;
+ }
+
+ lv_libinput_event_t * evt = &dsc->points[dsc->start];
+
+ if(++dsc->start == LV_LIBINPUT_MAX_EVENTS)
+ dsc->start = 0;
+
+ return evt;
+}
+
+bool _event_pending(lv_libinput_t * dsc)
+{
+ return dsc->start != dsc->end;
+}
+
+lv_libinput_event_t * _create_event(lv_libinput_t * dsc)
+{
+ lv_libinput_event_t * evt = &dsc->points[dsc->end];
+
+ if(++dsc->end == LV_LIBINPUT_MAX_EVENTS)
+ dsc->end = 0;
+
+ /* We have overflowed the buffer, start overwriting
+ * old events.
+ */
+ if(dsc->end == dsc->start) {
+ LV_LOG_INFO("libinput: overflowed event buffer!");
+ if(++dsc->start == LV_LIBINPUT_MAX_EVENTS)
+ dsc->start = 0;
+ }
+
+ memset(evt, 0, sizeof(lv_libinput_event_t));
+
+ return evt;
+}
+
+static void _read(lv_indev_t * indev, lv_indev_data_t * data)
+{
+ lv_libinput_t * dsc = lv_indev_get_driver_data(indev);
+ LV_ASSERT_NULL(dsc);
+
+ pthread_mutex_lock(&dsc->event_lock);
+
+ lv_libinput_event_t * evt = _get_event(dsc);
+
+ if(!evt)
+ evt = &dsc->last_event; /* indev expects us to report the most recent state */
+
+ data->point = evt->point;
+ data->state = evt->pressed;
+ data->key = evt->key_val;
+ data->continue_reading = _event_pending(dsc);
+
+ dsc->last_event = *evt; /* Remember the last event for the next call */
+
+ pthread_mutex_unlock(&dsc->event_lock);
+
+ if(evt)
+ LV_LOG_TRACE("libinput_read: (%04d, %04d): %d continue_reading? %d", data->point.x, data->point.y, data->state,
+ data->continue_reading);
+}
+
+static void _read_pointer(lv_libinput_t * dsc, struct libinput_event * event)
+{
+ struct libinput_event_touch * touch_event = NULL;
+ struct libinput_event_pointer * pointer_event = NULL;
+ lv_libinput_event_t * evt = NULL;
+ enum libinput_event_type type = libinput_event_get_type(event);
+ int slot = 0;
+
+ switch(type) {
+ case LIBINPUT_EVENT_TOUCH_MOTION:
+ case LIBINPUT_EVENT_TOUCH_DOWN:
+ case LIBINPUT_EVENT_TOUCH_UP:
+ touch_event = libinput_event_get_touch_event(event);
+ break;
+ case LIBINPUT_EVENT_POINTER_MOTION:
+ case LIBINPUT_EVENT_POINTER_BUTTON:
+ case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
+ pointer_event = libinput_event_get_pointer_event(event);
+ break;
+ default:
+ return; /* We don't care about this events */
+ }
+
+ /* We need to read unrotated display dimensions directly from the driver because libinput won't account
+ * for any rotation inside of LVGL */
+ lv_display_t * disp = lv_display_get_default();
+
+ /* ignore more than 2 fingers as it will only confuse LVGL */
+ if(touch_event && (slot = libinput_event_touch_get_slot(touch_event)) > 1)
+ return;
+
+ evt = _create_event(dsc);
+
+ const int32_t hor_res = disp->physical_hor_res > 0 ? disp->physical_hor_res : disp->hor_res;
+ const int32_t ver_res = disp->physical_ver_res > 0 ? disp->physical_ver_res : disp->ver_res;
+
+ switch(type) {
+ case LIBINPUT_EVENT_TOUCH_MOTION:
+ case LIBINPUT_EVENT_TOUCH_DOWN: {
+ lv_point_t point;
+ point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_x_transformed(touch_event, hor_res) - disp->offset_x,
+ INT32_MAX);
+ point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_touch_get_y_transformed(touch_event, ver_res) - disp->offset_y,
+ INT32_MAX);
+ if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) {
+ break; /* ignore touches that are out of bounds */
+ }
+ evt->point = point;
+ evt->pressed = LV_INDEV_STATE_PRESSED;
+ dsc->slots[slot].point = evt->point;
+ dsc->slots[slot].pressed = evt->pressed;
+ break;
+ }
+ case LIBINPUT_EVENT_TOUCH_UP:
+ /*
+ * We don't support "multitouch", but libinput does. To make fast typing with two thumbs
+ * on a keyboard feel good, it's necessary to handle two fingers individually. The edge
+ * case here is if you press a key with one finger and then press a second key with another
+ * finger. No matter which finger you release, it will count as the second finger releasing
+ * and ignore the first because LVGL only stores a single (the latest) pressed state.
+ *
+ * To work around this, we detect the case where one finger is released while the other is
+ * still pressed and insert dummy events so that both release events trigger at the correct
+ * position.
+ */
+ if(slot == 0 && dsc->slots[1].pressed == LV_INDEV_STATE_PRESSED) {
+ /* The first finger is released while the second finger is still pressed.
+ * We turn P1 > P2 > R1 > R2 into P1 > P2 > (P1) > R1 > (P2) > R2.
+ */
+
+ /* Inject the dummy press event for the first finger */
+ lv_libinput_event_t * synth_evt = evt;
+ synth_evt->pressed = LV_INDEV_STATE_PRESSED;
+ synth_evt->point = dsc->slots[0].point;
+
+ /* Append the real release event for the first finger */
+ evt = _create_event(dsc);
+ evt->pressed = LV_INDEV_STATE_RELEASED;
+ evt->point = dsc->slots[0].point;
+
+ /* Inject the dummy press event for the second finger */
+ synth_evt = _create_event(dsc);
+ synth_evt->pressed = LV_INDEV_STATE_PRESSED;
+ synth_evt->point = dsc->slots[1].point;
+ }
+ else if(slot == 1 && dsc->slots[0].pressed == LV_INDEV_STATE_PRESSED) {
+ /* The second finger is released while the first finger is still pressed.
+ * We turn P1 > P2 > R2 > R1 into P1 > P2 > R2 > (P1) > R1.
+ */
+
+ /* Append the real release event for the second finger */
+ evt->pressed = LV_INDEV_STATE_RELEASED;
+ evt->point = dsc->slots[1].point;
+
+ /* Inject the dummy press event for the first finger */
+ lv_libinput_event_t * synth_evt = _create_event(dsc);
+ synth_evt->pressed = LV_INDEV_STATE_PRESSED;
+ synth_evt->point = dsc->slots[0].point;
+ }
+ else {
+ evt->pressed = LV_INDEV_STATE_RELEASED;
+ evt->point = dsc->slots[slot].point;
+ }
+
+ dsc->slots[slot].pressed = evt->pressed;
+ break;
+ case LIBINPUT_EVENT_POINTER_MOTION:
+ dsc->pointer_position.x = (int32_t)LV_CLAMP(0, dsc->pointer_position.x + libinput_event_pointer_get_dx(pointer_event),
+ disp->hor_res - 1);
+ dsc->pointer_position.y = (int32_t)LV_CLAMP(0, dsc->pointer_position.y + libinput_event_pointer_get_dy(pointer_event),
+ disp->ver_res - 1);
+ evt->point.x = dsc->pointer_position.x;
+ evt->point.y = dsc->pointer_position.y;
+ evt->pressed = dsc->pointer_button_down;
+ break;
+ case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE: {
+ lv_point_t point;
+ point.x = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_x_transformed(pointer_event,
+ hor_res) - disp->offset_x, INT32_MAX);
+ point.y = (int32_t)LV_CLAMP(INT32_MIN, libinput_event_pointer_get_absolute_y_transformed(pointer_event,
+ ver_res) - disp->offset_y, INT32_MAX);
+ if(point.x < 0 || point.x > disp->hor_res || point.y < 0 || point.y > disp->ver_res) {
+ break; /* ignore pointer events that are out of bounds */
+ }
+ evt->point = point;
+ evt->pressed = dsc->pointer_button_down;
+ break;
+ }
+ case LIBINPUT_EVENT_POINTER_BUTTON: {
+ enum libinput_button_state button_state = libinput_event_pointer_get_button_state(pointer_event);
+ dsc->pointer_button_down = button_state == LIBINPUT_BUTTON_STATE_RELEASED ? LV_INDEV_STATE_RELEASED :
+ LV_INDEV_STATE_PRESSED;
+ evt->point.x = dsc->pointer_position.x;
+ evt->point.y = dsc->pointer_position.y;
+ evt->pressed = dsc->pointer_button_down;
+ }
+ default:
+ break;
+ }
+}
+
+static void _read_keypad(lv_libinput_t * dsc, struct libinput_event * event)
+{
+ struct libinput_event_keyboard * keyboard_event = NULL;
+ enum libinput_event_type type = libinput_event_get_type(event);
+ lv_libinput_event_t * evt = NULL;
+ switch(type) {
+ case LIBINPUT_EVENT_KEYBOARD_KEY:
+ evt = _create_event(dsc);
+ keyboard_event = libinput_event_get_keyboard_event(event);
+ enum libinput_key_state key_state = libinput_event_keyboard_get_key_state(keyboard_event);
+ uint32_t code = libinput_event_keyboard_get_key(keyboard_event);
+#if LV_LIBINPUT_XKB
+ evt->key_val = lv_xkb_process_key(&(dsc->xkb), code, key_state == LIBINPUT_KEY_STATE_PRESSED);
+#else
+ switch(code) {
+ case KEY_BACKSPACE:
+ evt->key_val = LV_KEY_BACKSPACE;
+ break;
+ case KEY_ENTER:
+ evt->key_val = LV_KEY_ENTER;
+ break;
+ case KEY_PREVIOUS:
+ evt->key_val = LV_KEY_PREV;
+ break;
+ case KEY_NEXT:
+ evt->key_val = LV_KEY_NEXT;
+ break;
+ case KEY_UP:
+ evt->key_val = LV_KEY_UP;
+ break;
+ case KEY_LEFT:
+ evt->key_val = LV_KEY_LEFT;
+ break;
+ case KEY_RIGHT:
+ evt->key_val = LV_KEY_RIGHT;
+ break;
+ case KEY_DOWN:
+ evt->key_val = LV_KEY_DOWN;
+ break;
+ case KEY_TAB:
+ evt->key_val = LV_KEY_NEXT;
+ break;
+ case KEY_HOME:
+ evt->key_val = LV_KEY_HOME;
+ break;
+ case KEY_END:
+ evt->key_val = LV_KEY_END;
+ break;
+ default:
+ evt->key_val = 0;
+ break;
+ }
+#endif /* LV_LIBINPUT_XKB */
+ if(evt->key_val != 0) {
+ /* Only record button state when actual output is produced to prevent widgets from refreshing */
+ evt->pressed = (key_state == LIBINPUT_KEY_STATE_RELEASED) ? LV_INDEV_STATE_RELEASED : LV_INDEV_STATE_PRESSED;
+
+ // just release the key immediatly after it got pressed.
+ // but don't handle special keys where holding a key makes sense
+ if(evt->key_val != LV_KEY_BACKSPACE &&
+ evt->key_val != LV_KEY_UP &&
+ evt->key_val != LV_KEY_LEFT &&
+ evt->key_val != LV_KEY_RIGHT &&
+ evt->key_val != LV_KEY_DOWN &&
+ key_state == LIBINPUT_KEY_STATE_PRESSED) {
+ lv_libinput_event_t * release_evt = _create_event(dsc);
+ release_evt->pressed = LV_INDEV_STATE_RELEASED;
+ release_evt->key_val = evt->key_val;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static int _open_restricted(const char * path, int flags, void * user_data)
+{
+ LV_UNUSED(user_data);
+ int fd = open(path, flags);
+ return fd < 0 ? -errno : fd;
+}
+
+static void _close_restricted(int fd, void * user_data)
+{
+ LV_UNUSED(user_data);
+ close(fd);
+}
+
+static void _delete(lv_libinput_t * dsc)
+{
+ if(dsc->fd)
+ dsc->deinit = true;
+
+ /* Give worker thread a whole second to quit */
+ for(int i = 0; i < 100; i++) {
+ if(!dsc->deinit)
+ break;
+ usleep(10000);
+ }
+
+ if(dsc->deinit) {
+ LV_LOG_ERROR("libinput worker thread did not quit in time, cancelling it");
+ pthread_cancel(dsc->worker_thread);
+ }
+
+ if(dsc->libinput_device) {
+ libinput_path_remove_device(dsc->libinput_device);
+ libinput_device_unref(dsc->libinput_device);
+ }
+
+ if(dsc->libinput_context) {
+ libinput_unref(dsc->libinput_context);
+ }
+
+#if LV_LIBINPUT_XKB
+ lv_xkb_deinit(&(dsc->xkb));
+#endif /* LV_LIBINPUT_XKB */
+
+ lv_free(dsc);
+}
+
+#endif /* LV_USE_LIBINPUT */
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.h b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.h
new file mode 100644
index 000000000..4ec1160a0
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_libinput.h
@@ -0,0 +1,134 @@
+/**
+ * @file lv_libinput.h
+ *
+ */
+
+#ifndef LV_LIBINPUT_H
+#define LV_LIBINPUT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../indev/lv_indev.h"
+
+#if LV_USE_LIBINPUT
+
+#include
+#include
+
+#if LV_LIBINPUT_XKB
+#include "lv_xkb.h"
+#endif /* LV_LIBINPUT_XKB */
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef enum {
+ LV_LIBINPUT_CAPABILITY_NONE = 0,
+ LV_LIBINPUT_CAPABILITY_KEYBOARD = 1U << 0,
+ LV_LIBINPUT_CAPABILITY_POINTER = 1U << 1,
+ LV_LIBINPUT_CAPABILITY_TOUCH = 1U << 2
+} lv_libinput_capability;
+
+typedef struct {
+ lv_indev_state_t pressed;
+ int key_val;
+ lv_point_t point;
+} lv_libinput_event_t;
+
+#define LV_LIBINPUT_MAX_EVENTS 32
+
+typedef struct {
+ int fd;
+ struct pollfd fds[1];
+
+ /* The points array is implemented as a circular LIFO queue */
+ lv_libinput_event_t points[LV_LIBINPUT_MAX_EVENTS]; /* Event buffer */
+ lv_libinput_event_t slots[2]; /* Realtime state of up to 2 fingers to handle multitouch */
+
+ /* Pointer devices work a bit differently in libinput which requires us to store their last known state */
+ lv_point_t pointer_position;
+ bool pointer_button_down;
+
+ int start; /* Index of start of event queue */
+ int end; /* Index of end of queue*/
+ lv_libinput_event_t last_event; /* Report when no new events
+ * to keep indev state consistent
+ */
+ bool deinit; /* Tell worker thread to quit */
+ pthread_mutex_t event_lock;
+ pthread_t worker_thread;
+
+ struct libinput * libinput_context;
+ struct libinput_device * libinput_device;
+
+#if LV_LIBINPUT_XKB
+ lv_xkb_t xkb;
+#endif /* LV_LIBINPUT_XKB */
+} lv_libinput_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Determine the capabilities of a specific libinput device.
+ * @param device the libinput device to query
+ * @return the supported input capabilities
+ */
+lv_libinput_capability lv_libinput_query_capability(struct libinput_device * device);
+
+/**
+ * Find connected input device with specific capabilities
+ * @param capabilities required device capabilities
+ * @param force_rescan erase the device cache (if any) and rescan the file system for available devices
+ * @return device node path (e.g. /dev/input/event0) for the first matching device or NULL if no device was found.
+ * The pointer is safe to use until the next forceful device search.
+ */
+char * lv_libinput_find_dev(lv_libinput_capability capabilities, bool force_rescan);
+
+/**
+ * Find connected input devices with specific capabilities
+ * @param capabilities required device capabilities
+ * @param devices pre-allocated array to store the found device node paths (e.g. /dev/input/event0). The pointers are
+ * safe to use until the next forceful device search.
+ * @param count maximum number of devices to find (the devices array should be at least this long)
+ * @param force_rescan erase the device cache (if any) and rescan the file system for available devices
+ * @return number of devices that were found
+ */
+size_t lv_libinput_find_devs(lv_libinput_capability capabilities, char ** found, size_t count, bool force_rescan);
+
+/**
+ * Create a new libinput input device
+ * @param type LV_INDEV_TYPE_POINTER or LV_INDEV_TYPE_KEYPAD
+ * @param dev_path device path, e.g. /dev/input/event0
+ * @return pointer to input device or NULL if opening failed
+ */
+lv_indev_t * lv_libinput_create(lv_indev_type_t indev_type, const char * dev_path);
+
+/**
+ * Delete a libinput input devic
+ * @param indev pointer to input device
+ */
+void lv_libinput_delete(lv_indev_t * indev);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /* LV_USE_LIBINPUT */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* LV_LIBINPUT_H */
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.c b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.c
new file mode 100644
index 000000000..96aeb4c0b
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.c
@@ -0,0 +1,180 @@
+/**
+ * @file lv_xkb.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_xkb.h"
+
+#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB
+
+#include "../../core/lv_group.h"
+#include "../../misc/lv_log.h"
+
+#include
+#include
+#include
+#include
+#include
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+static struct xkb_context * context = NULL;
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names)
+{
+ if(!context) {
+ context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ if(!context) {
+ LV_LOG_ERROR("xkb_context_new failed: %s", strerror(errno));
+ return false;
+ }
+ }
+
+ return _set_keymap(dsc, names);
+}
+
+void lv_xkb_deinit(lv_xkb_t * dsc)
+{
+ if(dsc->state) {
+ xkb_state_unref(dsc->state);
+ dsc->state = NULL;
+ }
+
+ if(dsc->keymap) {
+ xkb_keymap_unref(dsc->keymap);
+ dsc->keymap = NULL;
+ }
+}
+
+uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down)
+{
+ /* Offset the evdev scancode by 8, see https://xkbcommon.org/doc/current/xkbcommon_8h.html#ac29aee92124c08d1953910ab28ee1997 */
+ xkb_keycode_t keycode = scancode + 8;
+
+ uint32_t result = 0;
+
+ switch(xkb_state_key_get_one_sym(dsc->state, keycode)) {
+ case XKB_KEY_BackSpace:
+ result = LV_KEY_BACKSPACE;
+ break;
+ case XKB_KEY_Return:
+ case XKB_KEY_KP_Enter:
+ result = LV_KEY_ENTER;
+ break;
+ case XKB_KEY_Prior:
+ case XKB_KEY_KP_Prior:
+ result = LV_KEY_PREV;
+ break;
+ case XKB_KEY_Next:
+ case XKB_KEY_KP_Next:
+ result = LV_KEY_NEXT;
+ break;
+ case XKB_KEY_Up:
+ case XKB_KEY_KP_Up:
+ result = LV_KEY_UP;
+ break;
+ case XKB_KEY_Left:
+ case XKB_KEY_KP_Left:
+ result = LV_KEY_LEFT;
+ break;
+ case XKB_KEY_Right:
+ case XKB_KEY_KP_Right:
+ result = LV_KEY_RIGHT;
+ break;
+ case XKB_KEY_Down:
+ case XKB_KEY_KP_Down:
+ result = LV_KEY_DOWN;
+ break;
+ case XKB_KEY_Tab:
+ case XKB_KEY_KP_Tab:
+ result = LV_KEY_NEXT;
+ break;
+ case XKB_KEY_ISO_Left_Tab: /* Sent on SHIFT + TAB */
+ result = LV_KEY_PREV;
+ break;
+ case XKB_KEY_Home:
+ case XKB_KEY_KP_Home:
+ result = LV_KEY_HOME;
+ break;
+ case XKB_KEY_End:
+ case XKB_KEY_KP_End:
+ result = LV_KEY_END;
+ break;
+ default:
+ break;
+ }
+
+ if(result == 0) {
+ char buffer[4] = { 0, 0, 0, 0 };
+ int size = xkb_state_key_get_utf8(dsc->state, keycode, NULL, 0) + 1;
+ if(size > 1) {
+ xkb_state_key_get_utf8(dsc->state, keycode, buffer, size);
+ memcpy(&result, buffer, 4);
+ }
+ }
+
+ xkb_state_update_key(dsc->state, keycode, down ? XKB_KEY_DOWN : XKB_KEY_UP);
+
+ return result;
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static bool _set_keymap(lv_xkb_t * dsc, struct xkb_rule_names names)
+{
+ if(dsc->keymap) {
+ xkb_keymap_unref(dsc->keymap);
+ dsc->keymap = NULL;
+ }
+
+ dsc->keymap = xkb_keymap_new_from_names(context, &names, XKB_KEYMAP_COMPILE_NO_FLAGS);
+ if(!dsc->keymap) {
+ LV_LOG_ERROR("xkb_keymap_new_from_names failed: %s", strerror(errno));
+ return false;
+ }
+
+ if(dsc->state) {
+ xkb_state_unref(dsc->state);
+ dsc->state = NULL;
+ }
+
+ dsc->state = xkb_state_new(dsc->keymap);
+ if(!dsc->state) {
+ LV_LOG_ERROR("xkb_state_new failed: %s", strerror(errno));
+ return false;
+ }
+
+ return true;
+}
+
+#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.h b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.h
new file mode 100644
index 000000000..d048f33cb
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/libinput/lv_xkb.h
@@ -0,0 +1,72 @@
+/**
+ * @file lv_xkb.h
+ *
+ */
+
+#ifndef LV_XKB_H
+#define LV_XKB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../lv_conf_internal.h"
+
+#if defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB
+
+#include
+#include
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+typedef struct {
+ struct xkb_keymap * keymap;
+ struct xkb_state * state;
+} lv_xkb_t;
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**
+ * Initialise an XKB descriptor.
+ * @return true if the initialisation was successful
+ */
+bool lv_xkb_init(lv_xkb_t * dsc, struct xkb_rule_names names);
+
+/**
+ * De-initialise an XKB descriptor.
+ * @param dsc Pointer to descriptor
+ */
+void lv_xkb_deinit(lv_xkb_t * dsc);
+
+/**
+ * Process an evdev scancode using a specific XKB descriptor.
+ * @param state XKB descriptor to use
+ * @param scancode evdev scancode to process
+ * @param down true if the key was pressed, false if it was releases
+ * @return the (first) UTF-8 character produced by the event or 0 if no output was produced
+ */
+uint32_t lv_xkb_process_key(lv_xkb_t * dsc, uint32_t scancode, bool down);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /* LV_LIBINPUT_XKB */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* defined(LV_LIBINPUT_XKB) && LV_LIBINPUT_XKB */
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/lv_drivers.h b/lib/libesp32_lvgl/lvgl/src/drivers/lv_drivers.h
index ec126d352..f07e000d5 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/lv_drivers.h
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/lv_drivers.h
@@ -32,6 +32,7 @@ extern "C" {
#include "nuttx/lv_nuttx_libuv.h"
#include "evdev/lv_evdev.h"
+#include "libinput/lv_libinput.h"
#include "windows/lv_windows_input.h"
#include "windows/lv_windows_display.h"
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_cache.c b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_cache.c
index 173ad5428..0655d2f56 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_cache.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_cache.c
@@ -26,7 +26,7 @@
* STATIC PROTOTYPES
**********************/
-static void invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area);
+static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area);
/**********************
* STATIC VARIABLES
@@ -50,24 +50,18 @@ void lv_nuttx_cache_init(void)
* STATIC FUNCTIONS
**********************/
-static void invalidate_cache(void * buf, uint32_t stride, lv_color_format_t color_format, const lv_area_t * area)
+static void invalidate_cache(const lv_draw_buf_t * draw_buf, const lv_area_t * area)
{
- LV_UNUSED(color_format);
- LV_ASSERT_NULL(buf);
+ LV_ASSERT_NULL(draw_buf);
+ void * buf = draw_buf->data;
+ uint32_t stride = draw_buf->header.stride;
lv_uintptr_t start;
lv_uintptr_t end;
- if(area) {
- int32_t h = lv_area_get_height(area);
- start = (lv_uintptr_t)buf + area->y1 * stride;
- end = start + h * stride;
- }
- else {
- /* If area is empty, use stride as length */
- start = (lv_uintptr_t)buf;
- end = start + stride;
- }
+ int32_t h = lv_area_get_height(area);
+ start = (lv_uintptr_t)buf + area->y1 * stride;
+ end = start + h * stride;
LV_UNUSED(start);
LV_UNUSED(end);
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.c b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.c
index e484a137d..559f9bbac 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.c
@@ -12,8 +12,10 @@
#include
#include
+#include
#include
#include "lv_nuttx_cache.h"
+#include "lv_nuttx_image_cache.h"
#include "lv_nuttx_profiler.h"
#include "../../../lvgl.h"
@@ -21,7 +23,7 @@
/*********************
* DEFINES
*********************/
-
+#define nuttx_ctx_p (LV_GLOBAL_DEFAULT()->nuttx_ctx)
/**********************
* TYPEDEFS
**********************/
@@ -92,6 +94,9 @@ void lv_nuttx_dsc_init(lv_nuttx_dsc_t * dsc)
void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
{
+ nuttx_ctx_p = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_t));
+ LV_ASSERT_MALLOC(nuttx_ctx_p);
+
#if LV_USE_LOG
lv_log_register_print_cb(syslog_print);
#endif
@@ -99,6 +104,10 @@ void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
lv_nuttx_cache_init();
+#if LV_CACHE_DEF_SIZE > 0
+ lv_nuttx_image_cache_init();
+#endif
+
#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
lv_nuttx_profiler_init();
#endif
@@ -150,6 +159,26 @@ void lv_nuttx_init(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result)
#endif
}
+#ifdef CONFIG_SCHED_CPULOAD
+
+uint32_t lv_nuttx_get_idle(void)
+{
+ struct cpuload_s cpuload;
+ int ret = clock_cpuload(0, &cpuload);
+ if(ret < 0) {
+ LV_LOG_WARN("clock_cpuload failed: %d", ret);
+ return 0;
+ }
+
+ uint32_t idle = cpuload.active * 100 / cpuload.total;
+ LV_LOG_TRACE("active = %" LV_PRIu32 ", total = %" LV_PRIu32,
+ cpuload.active, cpuload.total);
+
+ return idle;
+}
+
+#endif
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.h b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.h
index 16c92dbca..2e0d8bd71 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.h
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_entry.h
@@ -18,6 +18,7 @@ extern "C" {
* INCLUDES
*********************/
+#include "../../lv_conf_internal.h"
#include "../../display/lv_display.h"
#include "../../indev/lv_indev.h"
@@ -41,6 +42,15 @@ typedef struct {
lv_indev_t * indev;
lv_indev_t * utouch_indev;
} lv_nuttx_result_t;
+
+typedef struct _lv_nuttx_ctx_t {
+
+#if LV_CACHE_DEF_SIZE > 0
+ void * image_cache;
+#endif
+
+} lv_nuttx_ctx_t;
+
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -68,6 +78,12 @@ void lv_nuttx_init_custom(const lv_nuttx_dsc_t * dsc, lv_nuttx_result_t * result
#endif /* LV_USE_NUTTX_CUSTOM_INIT */
+/**
+ * Get the idle percentage of the system.
+ * @return The idle percentage of the system.
+ */
+uint32_t lv_nuttx_get_idle(void);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c
index 2cf83b027..d4cd7f737 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_fbdev.c
@@ -40,6 +40,9 @@ typedef struct {
void * mem;
void * mem2;
uint32_t mem2_yoffset;
+
+ lv_draw_buf_t buf1;
+ lv_draw_buf_t buf2;
} lv_nuttx_fb_t;
/**********************
@@ -123,16 +126,25 @@ int lv_nuttx_fbdev_set_file(lv_display_t * disp, const char * file)
goto errout;
}
+ uint32_t w = dsc->vinfo.xres;
+ uint32_t h = dsc->vinfo.yres;
+ uint32_t stride = dsc->pinfo.stride;
+ uint32_t data_size = h * stride;
+ lv_draw_buf_init(&dsc->buf1, w, h, LV_COLOR_FORMAT_NATIVE, stride, dsc->mem, data_size);
+
/* double buffer mode */
- if(dsc->pinfo.yres_virtual == (dsc->vinfo.yres * 2)) {
+ bool double_buffer = dsc->pinfo.yres_virtual == (dsc->vinfo.yres * 2);
+ if(double_buffer) {
if((ret = fbdev_init_mem2(dsc)) < 0) {
goto errout;
}
+
+ lv_draw_buf_init(&dsc->buf2, w, h, LV_COLOR_FORMAT_NATIVE, stride, dsc->mem2, data_size);
}
- lv_display_set_buffers(disp, dsc->mem, dsc->mem2,
- (dsc->pinfo.stride * dsc->vinfo.yres), LV_DISP_RENDER_MODE_DIRECT);
+ lv_display_set_draw_buffers(disp, &dsc->buf1, double_buffer ? &dsc->buf2 : NULL);
+ lv_display_set_render_mode(disp, LV_DISP_RENDER_MODE_DIRECT);
lv_display_set_resolution(disp, dsc->vinfo.xres, dsc->vinfo.yres);
lv_timer_set_cb(disp->refr_timer, display_refr_timer_cb);
@@ -191,10 +203,12 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * colo
#if defined(CONFIG_FB_UPDATE)
/*May be some direct update command is required*/
+ int yoffset = disp->buf_act == disp->buf_1 ?
+ 0 : dsc->mem2_yoffset;
struct fb_area_s fb_area;
fb_area.x = area->x1;
- fb_area.y = area->y1;
+ fb_area.y = area->y1 + yoffset;
fb_area.w = lv_area_get_width(area);
fb_area.h = lv_area_get_height(area);
if(ioctl(dsc->fd, FBIO_UPDATE, (unsigned long)((uintptr_t)&fb_area)) < 0) {
@@ -205,7 +219,7 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * colo
/* double framebuffer */
if(dsc->mem2 != NULL) {
- if(disp->buf_act == &disp->buf_1) {
+ if(disp->buf_act == disp->buf_1) {
dsc->pinfo.yoffset = 0;
}
else {
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c
new file mode 100644
index 000000000..839704c12
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.c
@@ -0,0 +1,129 @@
+/**
+ * @file lv_nuttx_image_cache.c
+ *
+ */
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "lv_nuttx_cache.h"
+#include "../../../lvgl.h"
+
+#if LV_CACHE_DEF_SIZE > 0
+
+#if LV_USE_NUTTX
+
+#include
+
+/*********************
+ * DEFINES
+ *********************/
+
+#define HEAP_NAME "GImageCache"
+
+#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache)
+#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache)
+#define ctx (*(lv_nuttx_ctx_image_cache_t **)&LV_GLOBAL_DEFAULT()->nuttx_ctx->image_cache)
+/**********************
+ * TYPEDEFS
+ **********************/
+typedef struct {
+ uint8_t * mem;
+ uint32_t mem_size;
+
+ struct mm_heap_s * heap;
+ uint32_t heap_size;
+} lv_nuttx_ctx_image_cache_t;
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+
+static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format);
+static void free_cb(void * draw_buf);
+
+/**********************
+ * STATIC VARIABLES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * GLOBAL FUNCTIONS
+ **********************/
+
+void lv_nuttx_image_cache_init(void)
+{
+ lv_draw_buf_handlers_t * handlers = lv_draw_buf_get_handlers();
+ handlers->buf_malloc_cb = malloc_cb;
+ handlers->buf_free_cb = free_cb;
+
+ ctx = lv_malloc_zeroed(sizeof(lv_nuttx_ctx_image_cache_t));
+ LV_ASSERT_MALLOC(ctx);
+
+ ctx->mem_size = LV_CACHE_DEF_SIZE;
+ ctx->mem = malloc(ctx->mem_size);
+ LV_ASSERT_MALLOC(ctx->mem);
+
+ ctx->heap = mm_initialize(
+ HEAP_NAME,
+ ctx->mem,
+ ctx->mem_size
+ );
+
+ struct mallinfo info = mm_mallinfo(ctx->heap);
+ ctx->heap_size = info.arena;
+
+ LV_LOG_USER("heap info:");
+ LV_LOG_USER(" heap: %p", ctx->heap);
+ LV_LOG_USER(" mem: %p", ctx->mem);
+ LV_LOG_USER(" mem_size: %" LV_PRIu32, ctx->mem_size);
+ LV_LOG_USER(" arena: %d", info.arena);
+ LV_LOG_USER(" ordblks: %d", info.ordblks);
+ LV_LOG_USER(" aordblks: %d", info.aordblks);
+ LV_LOG_USER(" mxordblk: %d", info.mxordblk);
+ LV_LOG_USER(" uordblks: %d", info.uordblks);
+ LV_LOG_USER(" fordblks: %d", info.fordblks);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+static void * malloc_cb(size_t size_bytes, lv_color_format_t color_format)
+{
+ LV_UNUSED(color_format);
+
+ /*Allocate larger memory to be sure it can be aligned as needed*/
+ size_bytes += LV_DRAW_BUF_ALIGN - 1;
+ uint32_t cache_max_size = lv_cache_get_max_size(img_cache_p, NULL);
+
+ if(size_bytes > cache_max_size) {
+ LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")",
+ (uint32_t)size_bytes,
+ cache_max_size);
+ return NULL;
+ }
+
+ while(1) {
+ void * mem = mm_malloc(ctx->heap, size_bytes);
+ if(mem) return mem;
+ LV_LOG_INFO("appears to be out of memory. attempting to evict one cache entry. with allocated size %" LV_PRIu32,
+ (uint32_t)size_bytes);
+ bool evict_res = lv_cache_evict_one(img_cache_p, NULL);
+ if(evict_res == false) {
+ LV_LOG_ERROR("failed to evict one cache entry");
+ return NULL;
+ }
+ }
+}
+
+static void free_cb(void * draw_buf)
+{
+ mm_free(ctx->heap, draw_buf);
+}
+
+#endif /* LV_USE_NUTTX */
+#endif /* LV_CACHE_DEF_SIZE > 0 */
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h
new file mode 100644
index 000000000..e2af31f41
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_image_cache.h
@@ -0,0 +1,45 @@
+/**
+ * @file lv_nuttx_image_cache.h
+ *
+ */
+
+#ifndef LV_NUTTX_IMAGE_CACHE_H
+#define LV_NUTTX_IMAGE_CACHE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+
+#include "../../lv_conf_internal.h"
+
+#if LV_CACHE_DEF_SIZE > 0
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+void lv_nuttx_image_cache_init(void);
+
+/**********************
+ * MACROS
+ **********************/
+
+#endif /*LV_CACHE_DEF_SIZE > 0*/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_NUTTX_IMAGE_CACHE_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c
index 3139c98f7..a17c3a566 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/nuttx/lv_nuttx_profiler.c
@@ -10,7 +10,7 @@
#include "lv_nuttx_profiler.h"
#include "../../../lvgl.h"
-#if LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
+#if LV_USE_NUTTX && LV_USE_PROFILER && LV_USE_PROFILER_BUILTIN
#include
#include
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_keyboard.c b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_keyboard.c
index 012a1a15a..ebff6a130 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_keyboard.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_keyboard.c
@@ -77,7 +77,6 @@ static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data)
if(dev->dummy_read) {
dev->dummy_read = false;
data->state = LV_INDEV_STATE_RELEASED;
- data->continue_reading = len > 0;
}
/*Send the pressed character*/
else if(len > 0) {
@@ -85,7 +84,6 @@ static void sdl_keyboard_read(lv_indev_t * indev, lv_indev_data_t * data)
data->state = LV_INDEV_STATE_PRESSED;
data->key = dev->buf[0];
memmove(dev->buf, dev->buf + 1, len);
- data->continue_reading = true;
}
}
@@ -152,7 +150,15 @@ void _lv_sdl_keyboard_handler(SDL_Event * event)
break;
}
- lv_indev_read(indev);
+
+ size_t len = lv_strlen(dsc->buf);
+ while(len) {
+ lv_indev_read(indev);
+
+ /*Call again to handle dummy read in `sdl_keyboard_read`*/
+ lv_indev_read(indev);
+ len--;
+ }
}
/**
@@ -198,6 +204,12 @@ static uint32_t keycode_to_ctrl_key(SDL_Keycode sdl_key)
case SDLK_PAGEUP:
return LV_KEY_PREV;
+ case SDLK_HOME:
+ return LV_KEY_HOME;
+
+ case SDLK_END:
+ return LV_KEY_END;
+
default:
return '\0';
}
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mouse.c b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mouse.c
index 124cd1740..a6c1c692a 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mouse.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mouse.c
@@ -35,6 +35,9 @@ typedef struct {
int16_t last_x;
int16_t last_y;
bool left_button_down;
+#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN
+ int32_t diff;
+#endif
} lv_sdl_mouse_t;
/**********************
@@ -76,6 +79,10 @@ static void sdl_mouse_read(lv_indev_t * indev, lv_indev_data_t * data)
data->point.x = dsc->last_x;
data->point.y = dsc->last_y;
data->state = dsc->left_button_down ? LV_INDEV_STATE_PRESSED : LV_INDEV_STATE_RELEASED;
+#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN
+ data->enc_diff = dsc->diff;
+ dsc->diff = 0;
+#endif
}
static void release_indev_cb(lv_event_t * e)
@@ -101,7 +108,11 @@ void _lv_sdl_mouse_handler(SDL_Event * event)
case SDL_MOUSEMOTION:
win_id = event->motion.windowID;
break;
-
+#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN
+ case SDL_MOUSEWHEEL:
+ win_id = event->wheel.windowID;
+ break;
+#endif
case SDL_FINGERUP:
case SDL_FINGERDOWN:
case SDL_FINGERMOTION:
@@ -174,6 +185,17 @@ void _lv_sdl_mouse_handler(SDL_Event * event)
indev_dev->last_x = (int16_t)((float)hor_res * event->tfinger.x / zoom);
indev_dev->last_y = (int16_t)((float)ver_res * event->tfinger.y / zoom);
break;
+ case SDL_MOUSEWHEEL:
+#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN
+#ifdef __EMSCRIPTEN__
+ /*Escripten scales it wrong*/
+ if(event->wheel.y < 0) dsc->diff++;
+ if(event->wheel.y > 0) dsc->diff--;
+#else
+ indev_dev->diff = -event->wheel.y;
+#endif /*__EMSCRIPTEN__*/
+#endif /*LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_CROWN*/
+ break;
}
lv_indev_read(indev);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c
index c75fbc4ee..f331e3788 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.c
@@ -7,7 +7,7 @@
* INCLUDES
*********************/
#include "lv_sdl_mousewheel.h"
-#if LV_USE_SDL
+#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER
#include "../../core/lv_group.h"
#include "../../indev/lv_indev_private.h"
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h
index 6adf6ee02..7ca34bdbb 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_mousewheel.h
@@ -14,7 +14,7 @@ extern "C" {
* INCLUDES
*********************/
#include "lv_sdl_window.h"
-#if LV_USE_SDL
+#if LV_USE_SDL && LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER
/*********************
* DEFINES
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.c b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.c
index 123703a93..b4300666f 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.c
@@ -31,10 +31,14 @@
typedef struct {
SDL_Window * window;
SDL_Renderer * renderer;
+#if LV_USE_DRAW_SDL == 0
SDL_Texture * texture;
uint8_t * fb1;
uint8_t * fb2;
uint8_t * fb_act;
+ uint8_t * buf1;
+ uint8_t * buf2;
+#endif
uint8_t zoom;
uint8_t ignore_size_chg;
} lv_sdl_window_t;
@@ -45,7 +49,9 @@ typedef struct {
static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * color_p);
static void window_create(lv_display_t * disp);
static void window_update(lv_display_t * disp);
-static void texture_resize(lv_display_t * disp);
+#if LV_USE_DRAW_SDL == 0
+ static void texture_resize(lv_display_t * disp);
+#endif
static void sdl_event_handler(lv_timer_t * t);
static void release_disp_cb(lv_event_t * e);
@@ -107,13 +113,14 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res)
window_create(disp);
lv_display_set_flush_cb(disp, flush_cb);
+
+#if LV_USE_DRAW_SDL == 0
if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) {
- uint8_t * buf1 = malloc(32 * 1024);
- uint8_t * buf2 = NULL;
+ dsc->buf1 = malloc(32 * 1024);
#if LV_SDL_BUF_COUNT == 2
- buf2 = malloc(32 * 1024);
+ dsc->buf2 = malloc(32 * 1024);
#endif
- lv_display_set_buffers(disp, buf1, buf2,
+ lv_display_set_buffers(disp, dsc->buf1, dsc->buf2,
32 * 1024, LV_DISPLAY_RENDER_MODE_PARTIAL);
}
/*LV_DISPLAY_RENDER_MODE_DIRECT or FULL */
@@ -123,6 +130,14 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res)
lv_display_set_buffers(disp, dsc->fb1, dsc->fb2, stride * lv_display_get_vertical_resolution(disp),
LV_SDL_RENDER_MODE);
}
+#else /*/*LV_USE_DRAW_SDL == 1*/
+ uint32_t stride = lv_draw_buf_width_to_stride(lv_display_get_horizontal_resolution(disp),
+ lv_display_get_color_format(disp));
+ /*It will render directly to default Texture, so the buffer is not used, so just set something*/
+ static uint8_t dummy_buf[1];
+ lv_display_set_buffers(disp, dummy_buf, NULL, stride * lv_display_get_vertical_resolution(disp),
+ LV_SDL_RENDER_MODE);
+#endif /*LV_USE_DRAW_SDL == 0*/
lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL);
return disp;
@@ -191,22 +206,23 @@ void lv_sdl_quit()
static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_map)
{
+#if LV_USE_DRAW_SDL == 0
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
if(LV_SDL_RENDER_MODE == LV_DISPLAY_RENDER_MODE_PARTIAL) {
int32_t y;
uint8_t * fb_tmp = dsc->fb_act;
uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp));
- uint32_t px_map_stride = lv_area_get_width(area) * px_size;
+ uint32_t px_map_stride = lv_draw_buf_width_to_stride(lv_area_get_width(area), lv_display_get_color_format(disp));
+ uint32_t data_size = lv_area_get_width(area) * px_size;
int32_t fb_stride = lv_display_get_horizontal_resolution(disp) * px_size;
fb_tmp += area->y1 * fb_stride;
fb_tmp += area->x1 * px_size;
for(y = area->y1; y <= area->y2; y++) {
- lv_memcpy(fb_tmp, px_map, px_map_stride);
+ lv_memcpy(fb_tmp, px_map, data_size);
px_map += px_map_stride;
fb_tmp += fb_stride;
}
}
-
/* TYPICALLY YOU DO NOT NEED THIS
* If it was the last part to refresh update the texture of the window.*/
if(lv_display_flush_is_last(disp)) {
@@ -215,6 +231,11 @@ static void flush_cb(lv_display_t * disp, const lv_area_t * area, uint8_t * px_m
}
window_update(disp);
}
+#else
+ if(lv_display_flush_is_last(disp)) {
+ window_update(disp);
+ }
+#endif /*LV_USE_DRAW_SDL == 0*/
/*IMPORTANT! It must be called to tell the system the flush is ready*/
lv_display_flush_ready(disp);
@@ -232,7 +253,9 @@ static void sdl_event_handler(lv_timer_t * t)
SDL_Event event;
while(SDL_PollEvent(&event)) {
_lv_sdl_mouse_handler(&event);
+#if LV_SDL_MOUSEWHEEL_MODE == LV_SDL_MOUSEWHEEL_MODE_ENCODER
_lv_sdl_mousewheel_handler(&event);
+#endif
_lv_sdl_keyboard_handler(&event);
if(event.type == SDL_WINDOWEVENT) {
@@ -288,6 +311,7 @@ static void window_create(lv_display_t * disp)
hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/
dsc->renderer = SDL_CreateRenderer(dsc->window, -1, SDL_RENDERER_SOFTWARE);
+#if LV_USE_DRAW_SDL == 0
texture_resize(disp);
uint32_t px_size = lv_color_format_get_size(lv_display_get_color_format(disp));
@@ -295,9 +319,12 @@ static void window_create(lv_display_t * disp)
#if LV_SDL_BUF_COUNT == 2
lv_memset(dsc->fb2, 0xff, hor_res * ver_res * px_size);
#endif
+#endif /*LV_USE_DRAW_SDL == 0*/
/*Some platforms (e.g. Emscripten) seem to require setting the size again */
SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom);
+#if LV_USE_DRAW_SDL == 0
texture_resize(disp);
+#endif /*LV_USE_DRAW_SDL == 0*/
}
static void window_update(lv_display_t * disp)
@@ -316,6 +343,7 @@ static void window_update(lv_display_t * disp)
SDL_RenderPresent(dsc->renderer);
}
+#if LV_USE_DRAW_SDL == 0
static void texture_resize(lv_display_t * disp)
{
int32_t hor_res = lv_display_get_horizontal_resolution(disp);
@@ -354,6 +382,7 @@ static void texture_resize(lv_display_t * disp)
SDL_TEXTUREACCESS_STATIC, hor_res, ver_res);
SDL_SetTextureBlendMode(dsc->texture, SDL_BLENDMODE_BLEND);
}
+#endif
static void res_chg_event_cb(lv_event_t * e)
{
@@ -366,7 +395,9 @@ static void res_chg_event_cb(lv_event_t * e)
SDL_SetWindowSize(dsc->window, hor_res * dsc->zoom, ver_res * dsc->zoom);
}
+#if LV_USE_DRAW_SDL == 0
texture_resize(disp);
+#endif
}
static void release_disp_cb(lv_event_t * e)
@@ -378,11 +409,17 @@ static void release_disp_cb(lv_event_t * e)
lv_display_t * disp = (lv_display_t *) lv_event_get_user_data(e);
lv_sdl_window_t * dsc = lv_display_get_driver_data(disp);
+#if LV_USE_DRAW_SDL == 0
SDL_DestroyTexture(dsc->texture);
+#endif
SDL_DestroyRenderer(dsc->renderer);
SDL_DestroyWindow(dsc->window);
+#if LV_USE_DRAW_SDL == 0
if(dsc->fb1) free(dsc->fb1);
if(dsc->fb2) free(dsc->fb2);
+ if(dsc->buf1) free(dsc->buf1);
+ if(dsc->buf2) free(dsc->buf2);
+#endif
lv_free(dsc);
lv_display_set_driver_data(disp, NULL);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.h b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.h
index 53c7b194b..4a3901fdc 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.h
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/sdl/lv_sdl_window.h
@@ -23,6 +23,10 @@ extern "C" {
* DEFINES
*********************/
+/* Possible values of LV_SDL_MOUSEWHEEL_MODE */
+#define LV_SDL_MOUSEWHEEL_MODE_ENCODER 0 /* The mousewheel emulates an encoder input device*/
+#define LV_SDL_MOUSEWHEEL_MODE_CROWN 1 /* The mousewheel emulates a smart watch crown*/
+
/**********************
* TYPEDEFS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/windows/lv_windows_context.c b/lib/libesp32_lvgl/lvgl/src/drivers/windows/lv_windows_context.c
index 7bb1f4a35..1479d0ff6 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/windows/lv_windows_context.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/windows/lv_windows_context.c
@@ -1,4 +1,4 @@
-/**
+/**
* @file lv_windows_context.c
*
*/
@@ -26,6 +26,8 @@
static uint32_t lv_windows_tick_count_callback(void);
+static void lv_windows_delay_callback(uint32_t ms);
+
static void lv_windows_check_display_existence_timer_callback(
lv_timer_t * timer);
@@ -72,6 +74,8 @@ void lv_windows_platform_init(void)
{
lv_tick_set_cb(lv_windows_tick_count_callback);
+ lv_delay_set_cb(lv_windows_delay_callback);
+
lv_timer_create(
lv_windows_check_display_existence_timer_callback,
200,
@@ -118,7 +122,33 @@ lv_windows_window_context_t * lv_windows_get_window_context(
static uint32_t lv_windows_tick_count_callback(void)
{
- return GetTickCount();
+ LARGE_INTEGER Frequency;
+ if(QueryPerformanceFrequency(&Frequency)) {
+ LARGE_INTEGER PerformanceCount;
+ if(QueryPerformanceCounter(&PerformanceCount)) {
+ return (uint32_t)(PerformanceCount.QuadPart * 1000 / Frequency.QuadPart);
+ }
+ }
+
+ return (uint32_t)GetTickCount64();
+}
+
+static void lv_windows_delay_callback(uint32_t ms)
+{
+ HANDLE timer_handle = CreateWaitableTimerExW(
+ NULL,
+ NULL,
+ CREATE_WAITABLE_TIMER_MANUAL_RESET |
+ CREATE_WAITABLE_TIMER_HIGH_RESOLUTION,
+ TIMER_ALL_ACCESS);
+ if(timer_handle) {
+ LARGE_INTEGER due_time;
+ due_time.QuadPart = -((int64_t)ms) * 1000 * 10;
+ SetWaitableTimer(timer_handle, &due_time, 0, NULL, NULL, FALSE);
+ WaitForSingleObject(timer_handle, INFINITE);
+
+ CloseHandle(timer_handle);
+ }
}
static void lv_windows_check_display_existence_timer_callback(
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_display.c b/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_display.c
index 7e4de3801..1321b82b3 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_display.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_display.c
@@ -199,7 +199,6 @@ static void x11_disp_delete_evt_cb(lv_event_t * e)
lv_timer_delete(xd->timer);
- lv_display_set_buffers(disp, NULL, NULL, 0, LV_DISPLAY_RENDER_MODE_PARTIAL);
lv_free(xd->buffer[0]);
if(LV_X11_DOUBLE_BUFFER) {
lv_free(xd->buffer[1]);
diff --git a/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_input.c b/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_input.c
index bf9948204..efa94a560 100644
--- a/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_input.c
+++ b/lib/libesp32_lvgl/lvgl/src/drivers/x11/lv_x11_input.c
@@ -120,6 +120,54 @@ static void x11_inp_event_handler(lv_timer_t * t)
if(len < (sizeof(xd->kb_buffer) - 2 /* space for 1 char + '\0' */)) {
KeySym key;
int n = XLookupString(&event.xkey, &xd->kb_buffer[len], sizeof(xd->kb_buffer) - (len + 1), &key, NULL);
+ n += !!key;
+ switch(key) {
+ case XK_Home:
+ case XK_KP_Home:
+ xd->kb_buffer[len] = LV_KEY_HOME;
+ break;
+ case XK_Left:
+ case XK_KP_Left:
+ xd->kb_buffer[len] = LV_KEY_LEFT;
+ break;
+ case XK_Up:
+ case XK_KP_Up:
+ xd->kb_buffer[len] = LV_KEY_UP;
+ break;
+ case XK_Right:
+ case XK_KP_Right:
+ xd->kb_buffer[len] = LV_KEY_RIGHT;
+ break;
+ case XK_Down:
+ case XK_KP_Down:
+ xd->kb_buffer[len] = LV_KEY_DOWN;
+ break;
+ case XK_Prior:
+ case XK_KP_Prior:
+ xd->kb_buffer[len] = LV_KEY_PREV;
+ break;
+ case XK_Next:
+ case XK_KP_Next:
+ xd->kb_buffer[len] = LV_KEY_NEXT;
+ break;
+ case XK_End:
+ case XK_KP_End:
+ xd->kb_buffer[len] = LV_KEY_END;
+ break;
+ case XK_BackSpace:
+ xd->kb_buffer[len] = LV_KEY_BACKSPACE;
+ break;
+ case XK_Escape:
+ xd->kb_buffer[len] = LV_KEY_ESC;
+ break;
+ case XK_Delete:
+ case XK_KP_Delete:
+ xd->kb_buffer[len] = LV_KEY_DEL;
+ break;
+ case XK_KP_Enter:
+ xd->kb_buffer[len] = LV_KEY_ENTER;
+ break;
+ }
xd->kb_buffer[len + n] = '\0';
}
}
@@ -214,7 +262,7 @@ static void x11_mousewheel_read_cb(lv_indev_t * indev, lv_indev_data_t * data)
static lv_indev_t * lv_x11_keyboard_create(lv_display_t * disp)
{
lv_indev_t * indev = lv_indev_create();
- LV_ASSERT_OBJ(indev, MY_CLASS);
+ LV_ASSERT_NULL(indev);
if(NULL != indev) {
lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD);
lv_indev_set_read_cb(indev, x11_keyboard_read_cb);
diff --git a/lib/libesp32_lvgl/lvgl/src/font/lv_binfont_loader.c b/lib/libesp32_lvgl/lvgl/src/font/lv_binfont_loader.c
index 3d65de9ad..f121f4048 100644
--- a/lib/libesp32_lvgl/lvgl/src/font/lv_binfont_loader.c
+++ b/lib/libesp32_lvgl/lvgl/src/font/lv_binfont_loader.c
@@ -238,7 +238,7 @@ static bool load_cmaps_tables(lv_fs_file_t * fp, lv_font_fmt_txt_dsc_t * font_ds
switch(cmap_table[i].format_type) {
case LV_FONT_FMT_TXT_CMAP_FORMAT0_FULL: {
- uint8_t ids_size = sizeof(uint8_t) * cmap_table[i].data_entries_count;
+ uint8_t ids_size = (uint8_t)(sizeof(uint8_t) * cmap_table[i].data_entries_count);
uint8_t * glyph_id_ofs_list = lv_malloc(ids_size);
cmap->glyph_id_ofs_list = glyph_id_ofs_list;
@@ -482,8 +482,8 @@ static bool lvgl_load_font(lv_fs_file_t * fp, lv_font_t * font)
font->get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt;
font->get_glyph_bitmap = lv_font_get_bitmap_fmt_txt;
font->subpx = font_header.subpixels_mode;
- font->underline_position = font_header.underline_position;
- font->underline_thickness = font_header.underline_thickness;
+ font->underline_position = (int8_t) font_header.underline_position;
+ font->underline_thickness = (int8_t) font_header.underline_thickness;
font_dsc->bpp = font_header.bits_per_pixel;
font_dsc->kern_scale = font_header.kerning_scale;
diff --git a/lib/libesp32_lvgl/lvgl/src/font/lv_font.c b/lib/libesp32_lvgl/lvgl/src/font/lv_font.c
index 6cbd8e0d1..6484889f6 100644
--- a/lib/libesp32_lvgl/lvgl/src/font/lv_font.c
+++ b/lib/libesp32_lvgl/lvgl/src/font/lv_font.c
@@ -102,7 +102,7 @@ bool lv_font_get_glyph_dsc(const lv_font_t * font_p, lv_font_glyph_dsc_t * dsc_o
dsc_out->box_h = font_p->line_height;
dsc_out->ofs_x = 0;
dsc_out->ofs_y = 0;
- dsc_out->bpp = 1;
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_A1;
dsc_out->is_placeholder = true;
return false;
diff --git a/lib/libesp32_lvgl/lvgl/src/font/lv_font.h b/lib/libesp32_lvgl/lvgl/src/font/lv_font.h
index 7c3f55eaa..85bdec101 100644
--- a/lib/libesp32_lvgl/lvgl/src/font/lv_font.h
+++ b/lib/libesp32_lvgl/lvgl/src/font/lv_font.h
@@ -28,10 +28,6 @@ extern "C" {
* DEFINES
*********************/
-/* imgfont identifier */
-#define LV_IMGFONT_BPP 9
-#define LV_VECFONT_BPP 10
-
/**********************
* TYPEDEFS
**********************/
@@ -40,6 +36,30 @@ extern "C" {
* General types
*-----------------*/
+/** The font format.*/
+enum _lv_font_glyph_format_t {
+ LV_FONT_GLYPH_FORMAT_NONE = 0, /**< Maybe not visible*/
+
+ /**< Legacy simple formats*/
+ LV_FONT_GLYPH_FORMAT_A1 = 0x01, /**< 1 bit per pixel*/
+ LV_FONT_GLYPH_FORMAT_A2 = 0x02, /**< 2 bit per pixel*/
+ LV_FONT_GLYPH_FORMAT_A4 = 0x04, /**< 4 bit per pixel*/
+ LV_FONT_GLYPH_FORMAT_A8 = 0x08, /**< 8 bit per pixel*/
+
+ LV_FONT_GLYPH_FORMAT_IMAGE = 0x09, /**< Image format*/
+
+ /**< Advanced formats*/
+ LV_FONT_GLYPH_FORMAT_VECTOR = 0x0A, /**< Vectorial format*/
+ LV_FONT_GLYPH_FORMAT_SVG = 0x0B, /**< SVG format*/
+ LV_FONT_GLYPH_FORMAT_CUSTOM = 0xFF, /**< Custom format*/
+};
+
+#ifdef DOXYGEN
+typedef _lv_font_glyph_format_t lv_font_glyph_format_t;
+#else
+typedef uint8_t lv_font_glyph_format_t;
+#endif /*DOXYGEN*/
+
/** Describes the properties of a glyph.*/
typedef struct {
const lv_font_t *
@@ -49,8 +69,8 @@ typedef struct {
uint16_t box_h; /**< Height of the glyph's bounding box*/
int16_t ofs_x; /**< x offset of the bounding box*/
int16_t ofs_y; /**< y offset of the bounding box*/
- uint8_t bpp: 4; /**< Bit-per-pixel: 1, 2, 4, 8*/
- uint8_t is_placeholder: 1; /** Glyph is missing. But placeholder will still be displayed */
+ lv_font_glyph_format_t format; /**< Font format of the glyph see @lv_font_glyph_format_t*/
+ uint8_t is_placeholder: 1; /**< Glyph is missing. But placeholder will still be displayed*/
uint32_t glyph_index; /**< The index of the glyph in the font file. Used by the font cache*/
lv_cache_entry_t * entry; /**< The cache entry of the glyph draw data. Used by the font cache*/
@@ -172,9 +192,6 @@ LV_FONT_DECLARE(lv_font_montserrat_8)
#if LV_FONT_MONTSERRAT_10
LV_FONT_DECLARE(lv_font_montserrat_10)
#endif
-#if LV_FONT_MONTSERRAT_TASMOTA_10
-LV_FONT_DECLARE(lv_font_montserrat_tasmota_10)
-#endif
#if LV_FONT_MONTSERRAT_12
LV_FONT_DECLARE(lv_font_montserrat_12)
@@ -183,9 +200,6 @@ LV_FONT_DECLARE(lv_font_montserrat_12)
#if LV_FONT_MONTSERRAT_14
LV_FONT_DECLARE(lv_font_montserrat_14)
#endif
-#if LV_FONT_MONTSERRAT_TASMOTA_14
-LV_FONT_DECLARE(lv_font_montserrat_tasmota_14)
-#endif
#if LV_FONT_MONTSERRAT_16
LV_FONT_DECLARE(lv_font_montserrat_16)
@@ -198,9 +212,6 @@ LV_FONT_DECLARE(lv_font_montserrat_18)
#if LV_FONT_MONTSERRAT_20
LV_FONT_DECLARE(lv_font_montserrat_20)
#endif
-#if LV_FONT_MONTSERRAT_TASMOTA_20
-LV_FONT_DECLARE(lv_font_montserrat_tasmota_20)
-#endif
#if LV_FONT_MONTSERRAT_22
LV_FONT_DECLARE(lv_font_montserrat_22)
diff --git a/lib/libesp32_lvgl/lvgl/src/font/lv_font_fmt_txt.c b/lib/libesp32_lvgl/lvgl/src/font/lv_font_fmt_txt.c
index fa5595f8d..d1d3e38bd 100644
--- a/lib/libesp32_lvgl/lvgl/src/font/lv_font_fmt_txt.c
+++ b/lib/libesp32_lvgl/lvgl/src/font/lv_font_fmt_txt.c
@@ -25,6 +25,10 @@
/**********************
* TYPEDEFS
**********************/
+typedef struct {
+ uint32_t gid_left;
+ uint32_t gid_right;
+} kern_pair_ref_t;
/**********************
* STATIC PROTOTYPES
@@ -200,7 +204,7 @@ bool lv_font_get_glyph_dsc_fmt_txt(const lv_font_t * font, lv_font_glyph_dsc_t *
dsc_out->box_w = gdsc->box_w;
dsc_out->ofs_x = gdsc->ofs_x;
dsc_out->ofs_y = gdsc->ofs_y;
- dsc_out->bpp = (uint8_t)fdsc->bpp;
+ dsc_out->format = (uint8_t)fdsc->bpp;
dsc_out->is_placeholder = false;
if(is_tab) dsc_out->box_w = dsc_out->box_w * 2;
@@ -239,7 +243,7 @@ static uint32_t get_glyph_dsc_id(const lv_font_t * font, uint32_t letter)
if(p) {
lv_uintptr_t ofs = p - fdsc->cmaps[i].unicode_list;
- glyph_id = fdsc->cmaps[i].glyph_id_start + ofs;
+ glyph_id = fdsc->cmaps[i].glyph_id_start + (uint32_t) ofs;
}
}
else if(fdsc->cmaps[i].type == LV_FONT_FMT_TXT_CMAP_SPARSE_FULL) {
@@ -274,7 +278,7 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t
/*Use binary search to find the kern value.
*The pairs are ordered left_id first, then right_id secondly.*/
const uint16_t * g_ids = kdsc->glyph_ids;
- uint16_t g_id_both = (gid_right << 8) + gid_left; /*Create one number from the ids*/
+ kern_pair_ref_t g_id_both = {gid_left, gid_right};
uint16_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 2, kern_pair_8_compare);
/*If the `g_id_both` were found get its index from the pointer*/
@@ -287,7 +291,7 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t
/*Use binary search to find the kern value.
*The pairs are ordered left_id first, then right_id secondly.*/
const uint32_t * g_ids = kdsc->glyph_ids;
- uint32_t g_id_both = (gid_right << 16) + gid_left; /*Create one number from the ids*/
+ kern_pair_ref_t g_id_both = {gid_left, gid_right};
uint32_t * kid_p = _lv_utils_bsearch(&g_id_both, g_ids, kdsc->pair_cnt, 4, kern_pair_16_compare);
/*If the `g_id_both` were found get its index from the pointer*/
@@ -319,23 +323,23 @@ static int8_t get_kern_value(const lv_font_t * font, uint32_t gid_left, uint32_t
static int32_t kern_pair_8_compare(const void * ref, const void * element)
{
- const uint8_t * ref8_p = ref;
+ const kern_pair_ref_t * ref8_p = ref;
const uint8_t * element8_p = element;
/*If the MSB is different it will matter. If not return the diff. of the LSB*/
- if(ref8_p[0] != element8_p[0]) return (int32_t)ref8_p[0] - element8_p[0];
- else return (int32_t) ref8_p[1] - element8_p[1];
+ if(ref8_p->gid_left != element8_p[0]) return (int32_t) ref8_p->gid_left - element8_p[0];
+ else return (int32_t) ref8_p->gid_right - element8_p[1];
}
static int32_t kern_pair_16_compare(const void * ref, const void * element)
{
- const uint16_t * ref16_p = ref;
+ const kern_pair_ref_t * ref16_p = ref;
const uint16_t * element16_p = element;
/*If the MSB is different it will matter. If not return the diff. of the LSB*/
- if(ref16_p[0] != element16_p[0]) return (int32_t)ref16_p[0] - element16_p[0];
- else return (int32_t) ref16_p[1] - element16_p[1];
+ if(ref16_p->gid_left != element16_p[0]) return (int32_t) ref16_p->gid_left - element16_p[0];
+ else return (int32_t) ref16_p->gid_right - element16_p[1];
}
#if LV_USE_FONT_COMPRESSED
diff --git a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.c b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.c
index 5c83739f6..66624922c 100644
--- a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.c
+++ b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.c
@@ -43,8 +43,11 @@
/*Gesture min velocity at release before swipe (pixels)*/
#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 3
+/**< Rotary diff count will be multiplied by this and divided by 256 */
+#define LV_INDEV_DEF_ROTARY_SENSITIVITY 256
+
#if LV_INDEV_DEF_SCROLL_THROW <= 0
- #warning "LV_INDEV_DRAG_THROW must be greater than 0"
+ #warning "LV_INDEV_DEF_SCROLL_THROW must be greater than 0"
#endif
#define indev_act LV_GLOBAL_DEFAULT()->indev_active
@@ -64,6 +67,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data);
static void indev_button_proc(lv_indev_t * i, lv_indev_data_t * data);
static void indev_proc_press(lv_indev_t * indev);
static void indev_proc_release(lv_indev_t * indev);
+static void indev_proc_pointer_diff(lv_indev_t * indev);
static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p);
static void indev_proc_reset_query_handler(lv_indev_t * indev);
static void indev_click_focus(lv_indev_t * indev);
@@ -111,12 +115,14 @@ lv_indev_t * lv_indev_create(void)
lv_indev_t * indev = _lv_ll_ins_head(indev_ll_head);
LV_ASSERT_MALLOC(indev);
- if(!indev) {
+ if(indev == NULL) {
return NULL;
}
lv_memzero(indev, sizeof(lv_indev_t));
indev->reset_query = 1;
+ indev->enabled = 1;
+
indev->read_timer = lv_timer_create(lv_indev_read_timer_cb, LV_DEF_REFR_PERIOD, indev);
indev->disp = lv_display_get_default();
@@ -128,6 +134,7 @@ lv_indev_t * lv_indev_create(void)
indev->long_press_repeat_time = LV_INDEV_DEF_LONG_PRESS_REP_TIME;
indev->gesture_limit = LV_INDEV_DEF_GESTURE_LIMIT;
indev->gesture_min_velocity = LV_INDEV_DEF_GESTURE_MIN_VELOCITY;
+ indev->rotary_sensitvity = LV_INDEV_DEF_ROTARY_SENSITIVITY;
return indev;
}
@@ -190,22 +197,22 @@ void lv_indev_read_timer_cb(lv_timer_t * timer)
lv_indev_read(timer->user_data);
}
-void lv_indev_read(lv_indev_t * indev_p)
+void lv_indev_read(lv_indev_t * indev)
{
- if(!indev_p) return;
+ if(indev == NULL) return;
LV_TRACE_INDEV("begin");
- indev_act = indev_p;
+ indev_act = indev;
/*Read and process all indevs*/
- if(indev_p->disp == NULL) return; /*Not assigned to any displays*/
+ if(indev->disp == NULL) return; /*Not assigned to any displays*/
/*Handle reset query before processing the point*/
- indev_proc_reset_query_handler(indev_p);
+ indev_proc_reset_query_handler(indev);
- if(indev_p->disabled ||
- indev_p->disp->prev_scr != NULL) return; /*Input disabled or screen animation active*/
+ if((indev->enabled == 0) ||
+ (indev->disp->prev_scr != NULL)) return; /*Input disabled or screen animation active*/
LV_PROFILER_BEGIN;
@@ -214,37 +221,37 @@ void lv_indev_read(lv_indev_t * indev_p)
do {
/*Read the data*/
- indev_read_core(indev_p, &data);
- continue_reading = indev_p->mode != LV_INDEV_MODE_EVENT && data.continue_reading;
+ indev_read_core(indev, &data);
+ continue_reading = indev->mode != LV_INDEV_MODE_EVENT && data.continue_reading;
/*The active object might be deleted even in the read function*/
- indev_proc_reset_query_handler(indev_p);
+ indev_proc_reset_query_handler(indev);
indev_obj_act = NULL;
- indev_p->state = data.state;
+ indev->state = data.state;
/*Save the last activity time*/
- if(indev_p->state == LV_INDEV_STATE_PRESSED) {
- indev_p->disp->last_activity_time = lv_tick_get();
+ if(indev->state == LV_INDEV_STATE_PRESSED) {
+ indev->disp->last_activity_time = lv_tick_get();
}
- else if(indev_p->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) {
- indev_p->disp->last_activity_time = lv_tick_get();
+ else if(indev->type == LV_INDEV_TYPE_ENCODER && data.enc_diff) {
+ indev->disp->last_activity_time = lv_tick_get();
}
- if(indev_p->type == LV_INDEV_TYPE_POINTER) {
- indev_pointer_proc(indev_p, &data);
+ if(indev->type == LV_INDEV_TYPE_POINTER) {
+ indev_pointer_proc(indev, &data);
}
- else if(indev_p->type == LV_INDEV_TYPE_KEYPAD) {
- indev_keypad_proc(indev_p, &data);
+ else if(indev->type == LV_INDEV_TYPE_KEYPAD) {
+ indev_keypad_proc(indev, &data);
}
- else if(indev_p->type == LV_INDEV_TYPE_ENCODER) {
- indev_encoder_proc(indev_p, &data);
+ else if(indev->type == LV_INDEV_TYPE_ENCODER) {
+ indev_encoder_proc(indev, &data);
}
- else if(indev_p->type == LV_INDEV_TYPE_BUTTON) {
- indev_button_proc(indev_p, &data);
+ else if(indev->type == LV_INDEV_TYPE_BUTTON) {
+ indev_button_proc(indev, &data);
}
/*Handle reset query if it happened in during processing*/
- indev_proc_reset_query_handler(indev_p);
+ indev_proc_reset_query_handler(indev);
} while(continue_reading);
/*End of indev processing, so no act indev*/
@@ -255,17 +262,15 @@ void lv_indev_read(lv_indev_t * indev_p)
LV_PROFILER_END;
}
-void lv_indev_enable(lv_indev_t * indev, bool en)
+void lv_indev_enable(lv_indev_t * indev, bool enable)
{
- uint8_t enable = en ? 0 : 1;
-
if(indev) {
- indev->disabled = enable;
+ indev->enabled = (uint8_t) enable;
}
else {
lv_indev_t * i = lv_indev_get_next(NULL);
while(i) {
- i->disabled = enable;
+ i->enabled = (uint8_t) enable;
i = lv_indev_get_next(i);
}
}
@@ -305,7 +310,7 @@ void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data)
lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev)
{
- if(!indev) {
+ if(indev == NULL) {
LV_LOG_WARN("lv_indev_get_read_cb: indev was NULL");
return NULL;
}
@@ -396,14 +401,14 @@ void lv_indev_set_cursor(lv_indev_t * indev, lv_obj_t * cur_obj)
void lv_indev_set_group(lv_indev_t * indev, lv_group_t * group)
{
- if(indev->type == LV_INDEV_TYPE_KEYPAD || indev->type == LV_INDEV_TYPE_ENCODER) {
+ if(indev && (indev->type == LV_INDEV_TYPE_KEYPAD || indev->type == LV_INDEV_TYPE_ENCODER)) {
indev->group = group;
}
}
void lv_indev_set_button_points(lv_indev_t * indev, const lv_point_t points[])
{
- if(indev->type == LV_INDEV_TYPE_BUTTON) {
+ if(indev && indev->type == LV_INDEV_TYPE_BUTTON) {
indev->btn_points = points;
}
}
@@ -413,9 +418,8 @@ void lv_indev_get_point(const lv_indev_t * indev, lv_point_t * point)
if(indev == NULL) {
point->x = 0;
point->y = 0;
- return;
}
- if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) {
+ else if(indev->type != LV_INDEV_TYPE_POINTER && indev->type != LV_INDEV_TYPE_BUTTON) {
point->x = -1;
point->y = -1;
}
@@ -432,10 +436,12 @@ lv_dir_t lv_indev_get_gesture_dir(const lv_indev_t * indev)
uint32_t lv_indev_get_key(const lv_indev_t * indev)
{
- if(indev->type != LV_INDEV_TYPE_KEYPAD)
- return 0;
- else
- return indev->keypad.last_key;
+ uint32_t key = 0;
+
+ if(indev && indev->type == LV_INDEV_TYPE_KEYPAD)
+ key = indev->keypad.last_key;
+
+ return key;
}
lv_dir_t lv_indev_get_scroll_dir(const lv_indev_t * indev)
@@ -478,7 +484,7 @@ lv_obj_t * lv_indev_get_active_obj(void)
lv_timer_t * lv_indev_get_read_timer(lv_indev_t * indev)
{
- if(!indev) {
+ if(indev == NULL) {
LV_LOG_WARN("lv_indev_get_read_timer: indev was NULL");
return NULL;
}
@@ -494,7 +500,7 @@ lv_indev_mode_t lv_indev_get_mode(lv_indev_t * indev)
void lv_indev_set_mode(lv_indev_t * indev, lv_indev_mode_t mode)
{
- if(!indev || indev->mode == mode)
+ if(indev == NULL || indev->mode == mode)
return;
indev->mode = mode;
@@ -518,7 +524,7 @@ lv_obj_t * lv_indev_search_obj(lv_obj_t * obj, lv_point_t * point)
if(lv_obj_has_flag(obj, LV_OBJ_FLAG_HIDDEN)) return NULL;
lv_point_t p_trans = *point;
- lv_obj_transform_point(obj, &p_trans, false, true);
+ lv_obj_transform_point(obj, &p_trans, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE);
bool hit_test_ok = lv_obj_hit_test(obj, &p_trans);
@@ -659,6 +665,10 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data)
i->pointer.act_point.x = data->point.x;
i->pointer.act_point.y = data->point.y;
+ i->pointer.diff = data->enc_diff;
+
+ /*Process the diff first as scrolling will be processed in indev_proc_release*/
+ indev_proc_pointer_diff(i);
if(i->state == LV_INDEV_STATE_PRESSED) {
indev_proc_press(i);
@@ -669,6 +679,7 @@ static void indev_pointer_proc(lv_indev_t * i, lv_indev_data_t * data)
i->pointer.last_point.x = i->pointer.act_point.x;
i->pointer.last_point.y = i->pointer.act_point.y;
+
}
/**
@@ -687,20 +698,17 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
i->keypad.last_state = LV_INDEV_STATE_RELEASED; /*To skip the processing of release*/
}
+ /*Save the last key. *It must be done here else `lv_indev_get_key` will return the last key in events*/
+ uint32_t prev_key = i->keypad.last_key;
+ i->keypad.last_key = data->key;
+
lv_group_t * g = i->group;
if(g == NULL) return;
indev_obj_act = lv_group_get_focused(g);
if(indev_obj_act == NULL) return;
- bool dis = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
-
- /*Save the last key to compare it with the current latter on RELEASE*/
- uint32_t prev_key = i->keypad.last_key;
-
- /*Save the last key.
- *It must be done here else `lv_indev_get_key` will return the last key in events*/
- i->keypad.last_key = data->key;
+ const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
/*Save the previous state so we can detect state changes below and also set the last state now
*so if any event handler on the way returns `LV_RESULT_INVALID` the last state is remembered
@@ -725,7 +733,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
lv_group_focus_prev(g);
if(indev_reset_check(i)) return;
}
- else if(!dis) {
+ else if(is_enabled) {
/*Simulate a press on the object if ENTER was pressed*/
if(data->key == LV_KEY_ENTER) {
/*Send the ENTER as a normal KEY*/
@@ -750,7 +758,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
}
}
/*Pressing*/
- else if(!dis && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) {
+ else if(is_enabled && data->state == LV_INDEV_STATE_PRESSED && prev_state == LV_INDEV_STATE_PRESSED) {
if(data->key == LV_KEY_ENTER) {
if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return;
@@ -795,7 +803,7 @@ static void indev_keypad_proc(lv_indev_t * i, lv_indev_data_t * data)
}
}
/*Release happened*/
- else if(!dis && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) {
+ else if(is_enabled && data->state == LV_INDEV_STATE_RELEASED && prev_state == LV_INDEV_STATE_PRESSED) {
LV_LOG_INFO("%" LV_PRIu32 " key is released", data->key);
/*The user might clear the key when it was released. Always release the pressed key*/
data->key = prev_key;
@@ -849,7 +857,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
data->enc_diff = 0;
}
- const bool is_disabled = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
+ const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
/*Button press happened*/
if(data->state == LV_INDEV_STATE_PRESSED && last_state == LV_INDEV_STATE_RELEASED) {
@@ -862,7 +870,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
lv_obj_has_flag(indev_obj_act, LV_OBJ_FLAG_SCROLLABLE);
if(lv_group_get_editing(g) == true || editable_or_scrollable == false) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return;
}
}
@@ -880,7 +888,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
lv_group_send_data(g, LV_KEY_ESC);
if(indev_reset_check(i)) return;
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_CANCEL, indev_act) == LV_RESULT_INVALID) return;
}
}
@@ -913,7 +921,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
}
/*If not editable then just send a long press event*/
else {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return;
}
}
@@ -927,7 +935,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
i->longpr_rep_timestamp = lv_tick_get();
if(data->key == LV_KEY_ENTER) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return;
}
}
@@ -957,15 +965,15 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
/*The button was released on a non-editable object. Just send enter*/
if(editable_or_scrollable == false) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return;
}
- if(i->long_pr_sent == 0 && !is_disabled) {
+ if(i->long_pr_sent == 0 && is_enabled) {
if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return;
}
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return;
}
@@ -974,7 +982,7 @@ static void indev_encoder_proc(lv_indev_t * i, lv_indev_data_t * data)
else if(lv_group_get_editing(g)) {
/*Ignore long pressed enter release because it comes from mode switch*/
if(!i->long_pr_sent || lv_group_get_obj_count(g) <= 1) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return;
if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return;
if(send_event(LV_EVENT_CLICKED, indev_act) == LV_RESULT_INVALID) return;
@@ -1115,12 +1123,13 @@ static void indev_proc_press(lv_indev_t * indev)
new_obj_searched = true;
}
- /*The last object might have scroll throw. Stop it manually*/
- if(new_obj_searched && indev->pointer.last_obj) {
+ /*The scroll object might have scroll throw. Stop it manually*/
+ if(new_obj_searched && indev->pointer.scroll_obj) {
/*Attempt to stop scroll throw animation firstly*/
- if(!indev->scroll_throw_anim || !lv_anim_delete(indev, indev_scroll_throw_anim_cb)) {
- indev_scroll_throw_anim_reset(indev);
+ if(indev->scroll_throw_anim) {
+ lv_anim_delete(indev, indev_scroll_throw_anim_cb);
+ indev->scroll_throw_anim = NULL;
}
_lv_indev_scroll_throw_handler(indev);
@@ -1157,6 +1166,7 @@ static void indev_proc_press(lv_indev_t * indev)
indev->pointer.scroll_sum.x = 0;
indev->pointer.scroll_sum.y = 0;
indev->pointer.scroll_dir = LV_DIR_NONE;
+ indev->pointer.scroll_obj = NULL;
indev->pointer.gesture_dir = LV_DIR_NONE;
indev->pointer.gesture_sent = 0;
indev->pointer.gesture_sum.x = 0;
@@ -1164,8 +1174,8 @@ static void indev_proc_press(lv_indev_t * indev)
indev->pointer.vect.x = 0;
indev->pointer.vect.y = 0;
- const bool is_disabled = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
- if(!is_disabled) {
+ const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
+ if(is_enabled) {
if(send_event(LV_EVENT_PRESSED, indev_act) == LV_RESULT_INVALID) return;
}
@@ -1188,9 +1198,9 @@ static void indev_proc_press(lv_indev_t * indev)
indev->pointer.scroll_throw_vect_ori = indev->pointer.scroll_throw_vect;
if(indev_obj_act) {
- const bool is_disabled = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
+ const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_PRESSING, indev_act) == LV_RESULT_INVALID) return;
}
@@ -1209,7 +1219,7 @@ static void indev_proc_press(lv_indev_t * indev)
if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 0) {
/*Send a long press event if enough time elapsed*/
if(lv_tick_elaps(indev->pr_timestamp) > indev_act->long_press_time) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_LONG_PRESSED, indev_act) == LV_RESULT_INVALID) return;
}
/*Mark it to do not send the event again*/
@@ -1222,7 +1232,7 @@ static void indev_proc_press(lv_indev_t * indev)
if(indev->pointer.scroll_obj == NULL && indev->long_pr_sent == 1) {
if(lv_tick_elaps(indev->longpr_rep_timestamp) > indev_act->long_press_repeat_time) {
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_LONG_PRESSED_REPEAT, indev_act) == LV_RESULT_INVALID) return;
}
indev->longpr_rep_timestamp = lv_tick_get();
@@ -1257,13 +1267,13 @@ static void indev_proc_release(lv_indev_t * indev)
if(indev_obj_act) {
LV_LOG_INFO("released");
- const bool is_disabled = lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
+ const bool is_enabled = !lv_obj_has_state(indev_obj_act, LV_STATE_DISABLED);
- if(!is_disabled) {
+ if(is_enabled) {
if(send_event(LV_EVENT_RELEASED, indev_act) == LV_RESULT_INVALID) return;
}
- if(!is_disabled) {
+ if(is_enabled) {
if(scroll_obj == NULL) {
if(indev->long_pr_sent == 0) {
if(send_event(LV_EVENT_SHORT_CLICKED, indev_act) == LV_RESULT_INVALID) return;
@@ -1302,7 +1312,6 @@ static void indev_proc_release(lv_indev_t * indev)
lv_point_transform(&indev->pointer.scroll_throw_vect_ori, angle, scale_x, scale_y, &pivot, false);
}
}
-
}
if(scroll_obj) {
@@ -1314,6 +1323,40 @@ static void indev_proc_release(lv_indev_t * indev)
}
}
+static void indev_proc_pointer_diff(lv_indev_t * indev)
+{
+ lv_obj_t * obj = indev->pointer.last_pressed;
+ if(obj == NULL) return;
+ if(indev->pointer.diff == 0) return;
+
+ indev_obj_act = obj;
+
+ bool editable = lv_obj_is_editable(obj);
+
+ if(editable) {
+ uint32_t indev_sensitivity = indev->rotary_sensitvity;
+ uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(indev_obj_act, 0);
+ int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16;
+ send_event(LV_EVENT_ROTARY, &diff);
+ }
+ else {
+
+ int32_t vect = indev->pointer.diff > 0 ? indev->scroll_limit : -indev->scroll_limit;
+ indev->pointer.vect.y = vect;
+ indev->pointer.act_obj = obj;
+ lv_obj_t * scroll_obj = lv_indev_find_scroll_obj(indev);
+ if(scroll_obj == NULL) return;
+ uint32_t indev_sensitivity = indev->rotary_sensitvity;
+ uint32_t obj_sensitivity = lv_obj_get_style_rotary_sensitivity(scroll_obj, 0);
+ int32_t diff = (int32_t)((int32_t)indev->pointer.diff * indev_sensitivity * obj_sensitivity + 32768) >> 16;
+
+ indev->pointer.scroll_throw_vect.y = diff;
+ indev->pointer.scroll_throw_vect_ori.y = diff;
+ _lv_indev_scroll_handler(indev);
+ }
+
+}
+
static lv_obj_t * pointer_search_obj(lv_display_t * disp, lv_point_t * p)
{
indev_obj_act = lv_indev_search_obj(lv_display_get_layer_sys(disp), p);
@@ -1349,6 +1392,7 @@ static void indev_proc_reset_query_handler(lv_indev_t * indev)
indev->pointer.scroll_sum.x = 0;
indev->pointer.scroll_sum.y = 0;
indev->pointer.scroll_dir = LV_DIR_NONE;
+ indev->pointer.scroll_obj = NULL;
indev->pointer.scroll_throw_vect.x = 0;
indev->pointer.scroll_throw_vect.y = 0;
indev->pointer.gesture_sum.x = 0;
@@ -1545,7 +1589,8 @@ static lv_result_t send_event(lv_event_code_t code, void * param)
code == LV_EVENT_CLICKED ||
code == LV_EVENT_RELEASED ||
code == LV_EVENT_LONG_PRESSED ||
- code == LV_EVENT_LONG_PRESSED_REPEAT) {
+ code == LV_EVENT_LONG_PRESSED_REPEAT ||
+ code == LV_EVENT_ROTARY) {
lv_indev_send_event(indev_act, code, indev_obj_act);
if(indev_reset_check(indev_act)) return LV_RESULT_INVALID;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.h b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.h
index 62e44b8ea..ea5794f2e 100644
--- a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.h
+++ b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev.h
@@ -55,7 +55,7 @@ typedef struct {
int16_t enc_diff; /**< For LV_INDEV_TYPE_ENCODER number of steps since the previous read*/
lv_indev_state_t state; /**< LV_INDEV_STATE_REL or LV_INDEV_STATE_PR*/
- bool continue_reading; /**< If set to true, the read callback is invoked again*/
+ bool continue_reading; /**< If set to true, the read callback is invoked again, unless the device is in event-driven mode*/
} lv_indev_data_t;
typedef void (*lv_indev_read_cb_t)(lv_indev_t * indev, lv_indev_data_t * data);
@@ -64,6 +64,10 @@ typedef void (*lv_indev_read_cb_t)(lv_indev_t * indev, lv_indev_data_t * data);
* GLOBAL PROTOTYPES
**********************/
+/**
+ * Create an indev
+ * @return Pointer to the created indev or NULL when allocation failed
+ */
lv_indev_t * lv_indev_create(void);
/**
@@ -95,9 +99,9 @@ void lv_indev_read_timer_cb(lv_timer_t * timer);
/**
* Enable or disable one or all input devices (default enabled)
* @param indev pointer to an input device or NULL to enable/disable all of them
- * @param en true to enable, false to disable
+ * @param enable true to enable, false to disable
*/
-void lv_indev_enable(lv_indev_t * indev, bool en);
+void lv_indev_enable(lv_indev_t * indev, bool enable);
/**
* Get the currently processed input device. Can be used in action functions too.
@@ -113,12 +117,34 @@ lv_indev_t * lv_indev_active(void);
*/
void lv_indev_set_type(lv_indev_t * indev, lv_indev_type_t indev_type);
+/**
+ * Set a callback function to read input device data to the indev
+ * @param indev pointer to an input device
+ * @param read_cb pointer to callback function to read input device data
+ */
void lv_indev_set_read_cb(lv_indev_t * indev, lv_indev_read_cb_t read_cb);
+/**
+ * Set user data to the indev
+ * @param indev pointer to an input device
+ * @param user_data pointer to user data
+ */
void lv_indev_set_user_data(lv_indev_t * indev, void * user_data);
+/**
+ * Set driver data to the indev
+ * @param indev pointer to an input device
+ * @param driver_data pointer to driver data
+ */
void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data);
+/**
+ * Assign a display to the indev
+ * @param indev pointer to an input device
+ * @param disp pointer to an display
+ */
+void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp);
+
/**
* Get the type of an input device
* @param indev pointer to an input device
@@ -126,18 +152,46 @@ void lv_indev_set_driver_data(lv_indev_t * indev, void * driver_data);
*/
lv_indev_type_t lv_indev_get_type(const lv_indev_t * indev);
+/**
+ * Get the callback function to read input device data to the indev
+ * @param indev pointer to an input device
+ * @return Pointer to callback function to read input device data or NULL if indev is NULL
+ */
lv_indev_read_cb_t lv_indev_get_read_cb(lv_indev_t * indev);
+/**
+ * Get the indev state
+ * @param indev pointer to an input device
+ * @return Indev state or LV_INDEV_STATE_RELEASED if indev is NULL
+ */
lv_indev_state_t lv_indev_get_state(const lv_indev_t * indev);
+/**
+ * Get the indev assigned group
+ * @param indev pointer to an input device
+ * @return Pointer to indev assigned group or NULL if indev is NULL
+ */
lv_group_t * lv_indev_get_group(const lv_indev_t * indev);
-void lv_indev_set_display(lv_indev_t * indev, struct _lv_display_t * disp);
-
+/**
+ * Get a pointer to the assigned display of the indev
+ * @param indev pointer to an input device
+ * @return pointer to the assigned display or NULL if indev is NULL
+ */
lv_display_t * lv_indev_get_display(const lv_indev_t * indev);
+/**
+ * Get a pointer to the user data of the indev
+ * @param indev pointer to an input device
+ * @return pointer to the user data or NULL if indev is NULL
+ */
void * lv_indev_get_user_data(const lv_indev_t * indev);
+/**
+ * Get a pointer to the driver data of the indev
+ * @param indev pointer to an input device
+ * @return pointer to the driver data or NULL if indev is NULL
+ */
void * lv_indev_get_driver_data(const lv_indev_t * indev);
/**
diff --git a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_private.h b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_private.h
index 70b428836..96ba4739a 100644
--- a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_private.h
+++ b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_private.h
@@ -36,7 +36,7 @@ struct _lv_indev_t {
/*Flags*/
uint8_t long_pr_sent : 1;
uint8_t reset_query : 1;
- uint8_t disabled : 1;
+ uint8_t enabled : 1;
uint8_t wait_until_release : 1;
uint32_t pr_timestamp; /**< Pressed time stamp*/
@@ -69,6 +69,9 @@ struct _lv_indev_t {
/**< Repeated trigger period in long press [ms]*/
uint16_t long_press_repeat_time;
+ /**< Rotary diff count will be multiplied by this value and divided by 256*/
+ int32_t rotary_sensitvity;
+
struct {
/*Pointer and button data*/
lv_point_t act_point; /**< Current point of input device.*/
@@ -84,6 +87,7 @@ struct _lv_indev_t {
lv_obj_t * last_pressed; /*The lastly pressed object*/
lv_area_t scroll_area;
lv_point_t gesture_sum; /*Count the gesture pixels to check LV_INDEV_DEF_GESTURE_LIMIT*/
+ int32_t diff;
/*Flags*/
lv_dir_t scroll_dir : 4;
@@ -100,14 +104,22 @@ struct _lv_indev_t {
lv_group_t * group; /**< Keypad destination group*/
const lv_point_t * btn_points; /**< Array points assigned to the button ()screen will be pressed
here by the buttons*/
-
lv_event_list_t event_list;
lv_anim_t * scroll_throw_anim;
};
+
/**********************
* GLOBAL PROTOTYPES
**********************/
+/**
+ * Find a scrollable object based on the current scroll vector in the indev.
+ * In handles scroll propagation to the parent if needed, and scroll directions too.
+ * @param indev pointer to an indev
+ * @return the found scrollable object or NULL if not found.
+ */
+lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_scroll.c b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_scroll.c
index 7352d4363..947bda5e6 100644
--- a/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_scroll.c
+++ b/lib/libesp32_lvgl/lvgl/src/indev/lv_indev_scroll.c
@@ -22,13 +22,10 @@
/**********************
* STATIC PROTOTYPES
**********************/
-static lv_obj_t * find_scroll_obj(lv_indev_t * indev);
static void init_scroll_limits(lv_indev_t * indev);
static int32_t find_snap_point_x(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs);
static int32_t find_snap_point_y(const lv_obj_t * obj, int32_t min, int32_t max, int32_t ofs);
static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * diff_y);
-static int32_t scroll_throw_predict_y(lv_indev_t * indev);
-static int32_t scroll_throw_predict_x(lv_indev_t * indev);
static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end,
lv_dir_t dir);
@@ -53,11 +50,12 @@ void _lv_indev_scroll_handler(lv_indev_t * indev)
lv_obj_t * scroll_obj = indev->pointer.scroll_obj;
/*If there is no scroll object yet try to find one*/
if(scroll_obj == NULL) {
- scroll_obj = find_scroll_obj(indev);
+ scroll_obj = lv_indev_find_scroll_obj(indev);
if(scroll_obj == NULL) return;
init_scroll_limits(indev);
+ lv_obj_remove_state(indev->pointer.act_obj, LV_STATE_PRESSED);
lv_obj_send_event(scroll_obj, LV_EVENT_SCROLL_BEGIN, NULL);
if(indev->reset_query) return;
}
@@ -146,7 +144,7 @@ void _lv_indev_scroll_throw_handler(lv_indev_t * indev)
}
/*With snapping find the nearest snap point and scroll there*/
else {
- int32_t diff_y = scroll_throw_predict_y(indev);
+ int32_t diff_y = lv_indev_scroll_throw_predict(indev, LV_DIR_VER);
indev->pointer.scroll_throw_vect.y = 0;
scroll_limit_diff(indev, NULL, &diff_y);
int32_t y = find_snap_point_y(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_y);
@@ -172,7 +170,7 @@ void _lv_indev_scroll_throw_handler(lv_indev_t * indev)
}
/*With snapping find the nearest snap point and scroll there*/
else {
- int32_t diff_x = scroll_throw_predict_x(indev);
+ int32_t diff_x = lv_indev_scroll_throw_predict(indev, LV_DIR_HOR);
indev->pointer.scroll_throw_vect.x = 0;
scroll_limit_diff(indev, &diff_x, NULL);
int32_t x = find_snap_point_x(scroll_obj, LV_COORD_MIN, LV_COORD_MAX, diff_x);
@@ -255,11 +253,7 @@ void lv_indev_scroll_get_snap_dist(lv_obj_t * obj, lv_point_t * p)
p->y = find_snap_point_y(obj, obj->coords.y1, obj->coords.y2, 0);
}
-/**********************
- * STATIC FUNCTIONS
- **********************/
-
-static lv_obj_t * find_scroll_obj(lv_indev_t * indev)
+lv_obj_t * lv_indev_find_scroll_obj(lv_indev_t * indev)
{
lv_obj_t * obj_candidate = NULL;
lv_dir_t dir_candidate = LV_DIR_NONE;
@@ -390,6 +384,10 @@ static lv_obj_t * find_scroll_obj(lv_indev_t * indev)
return obj_candidate;
}
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
static void init_scroll_limits(lv_indev_t * indev)
{
lv_obj_t * obj = indev->pointer.scroll_obj;
@@ -582,34 +580,6 @@ static void scroll_limit_diff(lv_indev_t * indev, int32_t * diff_x, int32_t * di
}
}
-static int32_t scroll_throw_predict_y(lv_indev_t * indev)
-{
- int32_t y = indev->pointer.scroll_throw_vect.y;
- int32_t move = 0;
-
- int32_t scroll_throw = indev->scroll_throw;
-
- while(y) {
- move += y;
- y = y * (100 - scroll_throw) / 100;
- }
- return move;
-}
-
-static int32_t scroll_throw_predict_x(lv_indev_t * indev)
-{
- int32_t x = indev->pointer.scroll_throw_vect.x;
- int32_t move = 0;
-
- int32_t scroll_throw = indev->scroll_throw;
-
- while(x) {
- move += x;
- x = x * (100 - scroll_throw) / 100;
- }
- return move;
-}
-
static int32_t elastic_diff(lv_obj_t * scroll_obj, int32_t diff, int32_t scroll_start, int32_t scroll_end,
lv_dir_t dir)
{
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/barcode/code128.c b/lib/libesp32_lvgl/lvgl/src/libs/barcode/code128.c
index 88e329fa8..4fc00cb66 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/barcode/code128.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/barcode/code128.c
@@ -531,7 +531,7 @@ size_t code128_encode_raw(const char * s, char * out, size_t maxlength)
// Compute the checksum
int sum = codes[0];
for(i = 1; i < num_codes; i++)
- sum += codes[i] * i;
+ sum += (int)(codes[i] * i);
out += code128_append_code(sum % 103, out);
// Finalize the code.
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.c b/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.c
index 0af46725e..16eebcdd6 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.c
@@ -7,6 +7,8 @@
* INCLUDES
*********************/
#include "lv_barcode.h"
+#include "../../lvgl.h"
+
#if LV_USE_BARCODE
#include "code128.h"
@@ -14,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_barcode_class
+#define MY_CLASS (&lv_barcode_class)
/**********************
* TYPEDEFS
@@ -115,7 +117,7 @@ lv_result_t lv_barcode_update(lv_obj_t * obj, const char * data)
return LV_RESULT_INVALID;
}
- int32_t barcode_w = code128_encode_gs1(data, out_buf, len);
+ int32_t barcode_w = (int32_t) code128_encode_gs1(data, out_buf, len);
LV_LOG_INFO("barcode width = %d", (int)barcode_w);
LV_ASSERT(barcode->scale > 0);
@@ -216,7 +218,7 @@ static bool lv_barcode_change_buf_size(lv_obj_t * obj, int32_t w, int32_t h)
}
lv_canvas_set_draw_buf(obj, new_buf);
- LV_LOG_INFO("set canvas buffer: %p, width = %d", new_buf, (int)w);
+ LV_LOG_INFO("set canvas buffer: %p, width = %d", (void *)new_buf, (int)w);
if(old_buf != NULL) lv_draw_buf_destroy(old_buf);
return true;
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.h b/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.h
index ecd01eb78..4f7b446b9 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/barcode/lv_barcode.h
@@ -13,7 +13,11 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../misc/lv_types.h"
+#include "../../misc/lv_color.h"
+#include "../../widgets/canvas/lv_canvas.h"
+
#if LV_USE_BARCODE
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/bin_decoder/lv_bin_decoder.c b/lib/libesp32_lvgl/lvgl/src/libs/bin_decoder/lv_bin_decoder.c
index 21ed30e3a..b6a44c89a 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/bin_decoder/lv_bin_decoder.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/bin_decoder/lv_bin_decoder.c
@@ -71,8 +71,6 @@ static lv_fs_res_t fs_read_file_at(lv_fs_file_t * f, uint32_t pos, void * buff,
static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image_compressed_t * compressed);
-static void bin_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data);
-
/**********************
* STATIC VARIABLES
**********************/
@@ -103,7 +101,7 @@ void lv_bin_decoder_init(void)
lv_image_decoder_set_open_cb(decoder, lv_bin_decoder_open);
lv_image_decoder_set_get_area_cb(decoder, lv_bin_decoder_get_area);
lv_image_decoder_set_close_cb(decoder, lv_bin_decoder_close);
- lv_image_decoder_set_cache_free_cb(decoder, (lv_cache_free_cb_t)bin_decoder_cache_free_cb);
+ lv_image_decoder_set_cache_free_cb(decoder, NULL); /*Use general cache free method*/
}
lv_result_t lv_bin_decoder_info(lv_image_decoder_t * decoder, const void * src, lv_image_header_t * header)
@@ -230,7 +228,8 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
|| cf == LV_COLOR_FORMAT_XRGB8888 \
|| cf == LV_COLOR_FORMAT_RGB888 \
|| cf == LV_COLOR_FORMAT_RGB565 \
- || cf == LV_COLOR_FORMAT_RGB565A8) {
+ || cf == LV_COLOR_FORMAT_RGB565A8 \
+ || cf == LV_COLOR_FORMAT_ARGB8565) {
res = decode_rgb(decoder, dsc);
}
#else
@@ -262,6 +261,7 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
if(dsc->args.use_indexed) {
/*Palette for indexed image and whole image of A8 image are always loaded to RAM for simplicity*/
res = load_indexed(decoder, dsc);
+ use_directly = true; /*If draw unit supports indexed image, it can be used directly.*/
}
else {
res = decode_indexed(decoder, dsc);
@@ -281,9 +281,16 @@ lv_result_t lv_bin_decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
*So simply give its pointer*/
decoder_data_t * decoder_data = get_decoder_data(dsc);
- lv_draw_buf_t * decoded = &decoder_data->c_array;
+ lv_draw_buf_t * decoded;
+ if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) {
+ decoded = (lv_draw_buf_t *)image;
+ }
+ else {
+ decoded = &decoder_data->c_array;
+ lv_draw_buf_from_image(decoded, image);
+ }
+
dsc->decoded = decoded;
- lv_draw_buf_from_image(decoded, image);
if(decoded->header.stride == 0) {
/*Use the auto calculated value from decoder_info callback*/
@@ -373,6 +380,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
|| cf == LV_COLOR_FORMAT_XRGB8888 \
|| cf == LV_COLOR_FORMAT_RGB888 \
|| cf == LV_COLOR_FORMAT_RGB565 \
+ || cf == LV_COLOR_FORMAT_ARGB8565 \
|| cf == LV_COLOR_FORMAT_RGB565A8;
if(!supported) {
LV_LOG_WARN("CF: %d is not supported", cf);
@@ -391,7 +399,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
int32_t w_px = lv_area_get_width(full_area);
uint8_t * img_data = NULL;
lv_draw_buf_t * decoded = NULL;
- uint32_t offset = 0;
+ uint32_t offset = dsc->src_type == LV_IMAGE_SRC_FILE ? sizeof(lv_image_header_t) : 0; /*Skip the image header*/
/*We only support read line by line for now*/
if(decoded_area->y1 == LV_COORD_MIN) {
@@ -435,7 +443,6 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
offset += decoded_area->y1 * dsc->header.stride;
offset += decoded_area->x1 * bpp / 8; /*Move to x1*/
if(dsc->src_type == LV_IMAGE_SRC_FILE) {
- offset += sizeof(lv_image_header_t); /*File image starts with image header*/
buf = lv_malloc(len);
LV_ASSERT_NULL(buf);
if(buf == NULL)
@@ -461,7 +468,7 @@ lv_result_t lv_bin_decoder_get_area(lv_image_decoder_t * decoder, lv_image_decod
}
if(cf == LV_COLOR_FORMAT_ARGB8888 || cf == LV_COLOR_FORMAT_XRGB8888 || cf == LV_COLOR_FORMAT_RGB888
- || cf == LV_COLOR_FORMAT_RGB565) {
+ || cf == LV_COLOR_FORMAT_RGB565 || cf == LV_COLOR_FORMAT_ARGB8565) {
uint32_t len = (w_px * bpp) / 8;
offset += decoded_area->y1 * dsc->header.stride;
offset += decoded_area->x1 * bpp / 8; /*Move to x1*/
@@ -645,6 +652,7 @@ static lv_result_t decode_indexed(lv_image_decoder_t * decoder, lv_image_decoder
exit_with_buf:
if(dsc->src_type == LV_IMAGE_SRC_FILE && !is_compressed) {
lv_free((void *)palette);
+ decoder_data->palette = NULL;
}
if(draw_buf_indexed) lv_draw_buf_destroy(draw_buf_indexed);
@@ -685,9 +693,16 @@ static lv_result_t load_indexed(lv_image_decoder_t * decoder, lv_image_decoder_d
if(dsc->src_type == LV_IMAGE_SRC_VARIABLE) {
lv_image_dsc_t * image = (lv_image_dsc_t *)dsc->src;
- lv_draw_buf_t * decoded = &decoder_data->c_array;
+ lv_draw_buf_t * decoded;
+ if(image->header.flags & LV_IMAGE_FLAGS_ALLOCATED) {
+ decoded = (lv_draw_buf_t *)image;
+ }
+ else {
+ decoded = &decoder_data->c_array;
+ lv_draw_buf_from_image(decoded, image);
+ }
+
dsc->decoded = decoded;
- lv_draw_buf_from_image(decoded, image);
if(decoded->header.stride == 0) {
/*Use the auto calculated value from decoder_info callback*/
@@ -809,7 +824,7 @@ static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_deco
lv_draw_buf_t * decoded;
uint32_t file_len = (uint32_t)dsc->header.stride * dsc->header.h;
- decoded = lv_draw_buf_create(w, dsc->header.h, LV_COLOR_FORMAT_A8, buf_stride);
+ decoded = lv_draw_buf_create(dsc->header.w, dsc->header.h, LV_COLOR_FORMAT_A8, buf_stride);
if(decoded == NULL) {
LV_LOG_ERROR("Out of memory");
return LV_RESULT_INVALID;
@@ -868,6 +883,7 @@ static lv_result_t decode_alpha_only(lv_image_decoder_t * decoder, lv_image_deco
static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc)
{
+#if LV_BIN_DECODER_RAM_LOAD
uint32_t rn;
uint32_t len;
uint32_t compressed_len;
@@ -973,6 +989,13 @@ static lv_result_t decode_compressed(lv_image_decoder_t * decoder, lv_image_deco
}
return res;
+#else
+ LV_UNUSED(decompress_image);
+ LV_UNUSED(decoder);
+ LV_UNUSED(dsc);
+ LV_LOG_ERROR("Need LV_BIN_DECODER_RAM_LOAD to be enabled");
+ return LV_RESULT_INVALID;
+#endif
}
static lv_result_t decode_indexed_line(lv_color_format_t color_format, const lv_color32_t * palette, int32_t x,
@@ -1053,13 +1076,8 @@ static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image
uint32_t out_len = compressed->decompressed_size;
uint32_t input_len = compressed->compressed_size;
LV_UNUSED(input_len);
+ LV_UNUSED(out_len);
- /**
- * @todo
- * FIXME, RLE compressed image needs extra memory because decompression operates on
- * pixel unit not byte unit. Should optimize RLE decompress to not write to extra memory.
- */
- dsc->header.h += 1;
lv_draw_buf_t * decompressed = lv_draw_buf_create(dsc->header.w, dsc->header.h, dsc->header.cf,
dsc->header.stride);
if(decompressed == NULL) {
@@ -1067,13 +1085,6 @@ static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image
return LV_RESULT_INVALID;
}
- dsc->header.h -= 1; /*Change it back*/
- if(decompressed->data_size < out_len) {
- LV_LOG_WARN("decompressed size mismatch: %" LV_PRIu32 ", %" LV_PRIu32, decompressed->data_size, out_len);
- lv_draw_buf_destroy(decompressed);
- return LV_RESULT_INVALID;
- }
-
img_data = decompressed->data;
if(compressed->method == LV_IMAGE_COMPRESS_RLE) {
@@ -1126,11 +1137,3 @@ static lv_result_t decompress_image(lv_image_decoder_dsc_t * dsc, const lv_image
decoder_data->decompressed = decompressed; /*Free on decoder close*/
return LV_RESULT_OK;
}
-
-static void bin_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data)
-{
- LV_UNUSED(user_data); /*Unused*/
-
- lv_draw_buf_destroy((lv_draw_buf_t *)cached_data->decoded);
- if(cached_data->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)cached_data->src);
-}
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.c b/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.c
index 7efc5773a..29d674938 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.c
@@ -29,7 +29,7 @@
#error Unsupported LV_COLOR_DEPTH
#endif
-#define MY_CLASS &lv_ffmpeg_player_class
+#define MY_CLASS (&lv_ffmpeg_player_class)
#define FRAME_DEF_REFR_PERIOD 33 /*[ms]*/
@@ -176,6 +176,7 @@ lv_result_t lv_ffmpeg_player_set_src(lv_obj_t * obj, const char * path)
player->imgdsc.header.h = height;
player->imgdsc.data_size = data_size;
player->imgdsc.header.cf = has_alpha ? LV_COLOR_FORMAT_ARGB8888 : LV_COLOR_FORMAT_NATIVE;
+ player->imgdsc.header.stride = width * lv_color_format_get_size(player->imgdsc.header.cf);
player->imgdsc.data = ffmpeg_get_image_data(player->ffmpeg_ctx);
lv_image_set_src(&player->img.obj, &(player->imgdsc));
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.h b/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.h
index 6c1730609..51203e543 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/ffmpeg/lv_ffmpeg.h
@@ -12,7 +12,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../widgets/image/lv_image.h"
#if LV_USE_FFMPEG != 0
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.c b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.c
index 7fbe8a16c..93729199b 100755
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.c
@@ -20,6 +20,9 @@
#define ft_ctx LV_GLOBAL_DEFAULT()->ft_context
#define LV_FREETYPE_OUTLINE_REF_SIZE_DEF 128
+/**< This value is from the FreeType's function `FT_GlyphSlot_Oblique` in `ftsynth.c` */
+#define LV_FREETYPE_OBLIQUE_SLANT_DEF 0x0366A
+
#if LV_FREETYPE_CACHE_FT_GLYPH_CNT <= 0
#error "LV_FREETYPE_CACHE_FT_GLYPH_CNT must be greater than 0"
#endif
@@ -37,14 +40,10 @@ typedef struct {
/**********************
* STATIC PROTOTYPES
**********************/
-static FT_Error lv_freetype_face_requester(FTC_FaceID face_id,
- FT_Library library,
- FT_Pointer req_data,
- FT_Face * aface);
static void lv_freetype_cleanup(lv_freetype_context_t * ctx);
static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const char * pathname);
static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID face_id);
-static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc);
+static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt);
static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc);
static bool cache_node_cache_create_cb(lv_freetype_cache_node_t * node, void * user_data);
@@ -63,7 +62,7 @@ static lv_cache_compare_res_t cache_node_cache_compare_cb(const lv_freetype_cach
* GLOBAL FUNCTIONS
**********************/
-lv_result_t lv_freetype_init(uint32_t max_faces, uint32_t max_sizes, uint32_t max_kilobytes)
+lv_result_t lv_freetype_init(uint32_t max_glyph_cnt)
{
if(ft_ctx) {
LV_LOG_WARN("freetype already initialized");
@@ -78,6 +77,9 @@ lv_result_t lv_freetype_init(uint32_t max_faces, uint32_t max_sizes, uint32_t ma
}
lv_freetype_context_t * ctx = lv_freetype_get_context();
+
+ ctx->max_glyph_cnt = max_glyph_cnt;
+
FT_Error error;
error = FT_Init_FreeType(&ctx->library);
@@ -86,26 +88,6 @@ lv_result_t lv_freetype_init(uint32_t max_faces, uint32_t max_sizes, uint32_t ma
return LV_RESULT_INVALID;
}
- error = FTC_Manager_New(ctx->library,
- max_faces,
- max_sizes,
- max_kilobytes * 1024,
- lv_freetype_face_requester,
- NULL,
- &ctx->cache_manager);
- if(error) {
- FT_ERROR_MSG("FTC_Manager_New", error);
- lv_freetype_cleanup(ctx);
- return LV_RESULT_INVALID;
- }
-
- error = FTC_CMapCache_New(ctx->cache_manager, &ctx->cmap_cache);
- if(error) {
- FT_ERROR_MSG("FTC_CMapCache_New", error);
- lv_freetype_cleanup(ctx);
- return LV_RESULT_INVALID;
- }
-
_lv_ll_init(&ctx->face_id_ll, sizeof(face_id_node_t));
lv_cache_ops_t ops = {
@@ -168,7 +150,7 @@ lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_rend
dsc->cache_node = lv_cache_entry_get_data(cache_node_entry);
dsc->cache_node_entry = cache_node_entry;
- if(cache_hitting == false && freetype_on_font_create(dsc) == false) {
+ if(cache_hitting == false && freetype_on_font_create(dsc, ctx->max_glyph_cnt) == false) {
lv_cache_release(ctx->cache_node_cache, dsc->cache_node_entry, NULL);
lv_freetype_drop_face_id(ctx, dsc->face_id);
lv_free(dsc);
@@ -218,51 +200,33 @@ lv_freetype_context_t * lv_freetype_get_context(void)
return LV_GLOBAL_DEFAULT()->ft_context;
}
-FT_Size lv_freetype_lookup_size(const lv_freetype_font_dsc_t * dsc)
-{
- FT_Error error;
- lv_freetype_context_t * ctx = dsc->context;
-
- FT_Size ft_size;
- struct FTC_ScalerRec_ scaler;
- scaler.face_id = dsc->face_id;
- scaler.width = dsc->size;
- scaler.height = dsc->size;
- scaler.pixel = 1;
- error = FTC_Manager_LookupSize(ctx->cache_manager, &scaler, &ft_size);
-
- if(error) {
- FT_ERROR_MSG("FTC_Manager_LookupSize", error);
- return NULL;
- }
-
- return ft_size;
-}
-
void lv_freetype_italic_transform(FT_Face face)
{
LV_ASSERT_NULL(face);
FT_Matrix matrix;
matrix.xx = FT_INT_TO_F16DOT16(1);
- matrix.xy = 0x5800;
+ matrix.xy = LV_FREETYPE_OBLIQUE_SLANT_DEF;
matrix.yx = 0;
matrix.yy = FT_INT_TO_F16DOT16(1);
FT_Set_Transform(face, &matrix, NULL);
}
-const char * lv_freetype_get_pathname(FTC_FaceID face_id)
+int32_t lv_freetype_italic_transform_on_pos(lv_point_t point)
{
- LV_ASSERT_NULL(face_id);
- return (const char *)face_id;
+ return point.x + FT_F16DOT16_TO_INT(point.y * LV_FREETYPE_OBLIQUE_SLANT_DEF);
}
/**********************
* STATIC FUNCTIONS
**********************/
-static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc)
+static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc, uint32_t max_glyph_cnt)
{
- lv_cache_t * glyph_cache = lv_freetype_create_glyph_cache();
+ /*
+ * Glyph info uses a small amount of memory, and uses glyph info more frequently,
+ * so it plans to use twice the maximum number of caches here to
+ * get a better info acquisition performance.*/
+ lv_cache_t * glyph_cache = lv_freetype_create_glyph_cache(max_glyph_cnt * 2);
if(glyph_cache == NULL) {
LV_LOG_ERROR("glyph cache creating failed");
return false;
@@ -271,10 +235,10 @@ static bool freetype_on_font_create(lv_freetype_font_dsc_t * dsc)
lv_cache_t * draw_data_cache = NULL;
if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) {
- draw_data_cache = lv_freetype_create_draw_data_image();
+ draw_data_cache = lv_freetype_create_draw_data_image(max_glyph_cnt);
}
else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_OUTLINE) {
- draw_data_cache = lv_freetype_create_draw_data_outline();
+ draw_data_cache = lv_freetype_create_draw_data_outline(max_glyph_cnt);
}
else {
LV_LOG_ERROR("unknown render mode");
@@ -302,24 +266,6 @@ static void freetype_on_font_set_cbs(lv_freetype_font_dsc_t * dsc)
}
}
-static FT_Error lv_freetype_face_requester(FTC_FaceID face_id,
- FT_Library library,
- FT_Pointer req_data,
- FT_Face * aface)
-{
- LV_UNUSED(library);
- LV_UNUSED(req_data);
-
- const char * pathname = lv_freetype_get_pathname(face_id);
-
- FT_Error error = FT_New_Face(library, pathname, 0, aface);
- if(error) {
- FT_ERROR_MSG("FT_New_Face", error);
- LV_LOG_ERROR("error pathname = %s", pathname);
- }
- return error;
-}
-
static void lv_freetype_cleanup(lv_freetype_context_t * ctx)
{
LV_ASSERT_NULL(ctx);
@@ -328,11 +274,6 @@ static void lv_freetype_cleanup(lv_freetype_context_t * ctx)
ctx->cache_node_cache = NULL;
}
- if(ctx->cache_manager) {
- FTC_Manager_Done(ctx->cache_manager);
- ctx->cache_manager = NULL;
- }
-
if(ctx->library) {
FT_Done_FreeType(ctx->library);
ctx->library = NULL;
@@ -360,9 +301,21 @@ static FTC_FaceID lv_freetype_req_face_id(lv_freetype_context_t * ctx, const cha
node = _lv_ll_ins_tail(ll_p);
LV_ASSERT_MALLOC(node);
- node->pathname = lv_malloc(len + 1);
- LV_ASSERT_MALLOC(node->pathname);
- strcpy(node->pathname, pathname);
+#if LV_USE_FS_MEMFS
+ if(pathname[0] == LV_FS_MEMFS_LETTER) {
+#if !LV_FREETYPE_USE_LVGL_PORT
+ LV_LOG_WARN("LV_FREETYPE_USE_LVGL_PORT is not enabled");
+#endif
+ node->pathname = lv_malloc(sizeof(lv_fs_path_ex_t));
+ LV_ASSERT_MALLOC(node->pathname);
+ lv_memcpy(node->pathname, pathname, sizeof(lv_fs_path_ex_t));
+ }
+ else
+#endif
+ {
+ node->pathname = lv_strdup(pathname);
+ LV_ASSERT_NULL(node->pathname);
+ }
LV_LOG_INFO("add face_id: %s", node->pathname);
@@ -381,7 +334,6 @@ static void lv_freetype_drop_face_id(lv_freetype_context_t * ctx, FTC_FaceID fac
if(node->ref_cnt == 0) {
LV_LOG_INFO("drop face_id: %s", node->pathname);
_lv_ll_remove(ll_p, node);
- FTC_Manager_RemoveFaceID(ctx->cache_manager, face_id);
lv_free(node->pathname);
lv_free(node);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.h b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.h
index eed28a37e..7104e2f1b 100755
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype.h
@@ -12,7 +12,10 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../misc/lv_types.h"
+#include "../../misc/lv_event.h"
+#include
#if LV_USE_FREETYPE
@@ -76,13 +79,9 @@ typedef struct {
/**
* Initialize the freetype library.
- * @param max_faces Maximum number of opened FT_Face objects managed by this cache instance. Use 0 for defaults.
- * @param max_sizes Maximum number of opened FT_Size objects managed by this cache instance. Use 0 for defaults.
- * @param max_kilobytes Maximum number of kilobytes to use for cached data nodes. Use 0 for defaults.
- * Note that this value does not account for managed FT_Face and FT_Size objects.
* @return LV_RESULT_OK on success, otherwise LV_RESULT_INVALID.
*/
-lv_result_t lv_freetype_init(uint32_t max_faces, uint32_t max_sizes, uint32_t max_kilobytes);
+lv_result_t lv_freetype_init(uint32_t max_glyph_cnt);
/**
* Uninitialize the freetype library
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_glyph.c b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_glyph.c
index 8e9339417..e0bbcd7e2 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_glyph.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_glyph.c
@@ -7,6 +7,7 @@
* INCLUDES
*********************/
+#include "../../lvgl.h"
#include "lv_freetype_private.h"
#if LV_USE_FREETYPE
@@ -15,7 +16,6 @@
* DEFINES
*********************/
-#define LV_FREETYPE_GLYPH_DSC_CACHE_SIZE (LV_FREETYPE_CACHE_FT_GLYPH_CNT * 2)
/**********************
* TYPEDEFS
**********************/
@@ -49,7 +49,7 @@ static lv_cache_compare_res_t freetype_glyph_compare_cb(const lv_freetype_glyph_
* GLOBAL FUNCTIONS
**********************/
-lv_cache_t * lv_freetype_create_glyph_cache(void)
+lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size)
{
lv_cache_ops_t ops = {
.create_cb = (lv_cache_create_cb_t)freetype_glyph_create_cb,
@@ -58,7 +58,7 @@ lv_cache_t * lv_freetype_create_glyph_cache(void)
};
lv_cache_t * glyph_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_glyph_cache_data_t),
- LV_FREETYPE_GLYPH_DSC_CACHE_SIZE, ops);
+ cache_size, ops);
return glyph_cache;
}
@@ -80,12 +80,12 @@ static bool freetype_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_
LV_ASSERT_NULL(g_dsc);
if(unicode_letter < 0x20) {
- g_dsc->adv_w = 0;
- g_dsc->box_h = 0;
- g_dsc->box_w = 0;
- g_dsc->ofs_x = 0;
- g_dsc->ofs_y = 0;
- g_dsc->bpp = 0;
+ g_dsc->adv_w = 0;
+ g_dsc->box_h = 0;
+ g_dsc->box_w = 0;
+ g_dsc->ofs_x = 0;
+ g_dsc->ofs_y = 0;
+ g_dsc->format = LV_FONT_GLYPH_FORMAT_NONE;
return true;
}
@@ -130,8 +130,7 @@ static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void
lv_font_glyph_dsc_t * dsc_out = &data->glyph_dsc;
FT_Face face = dsc->cache_node->face;
- FT_UInt charmap_index = FT_Get_Charmap_Index(face->charmap);
- FT_UInt glyph_index = FTC_CMapCache_Lookup(dsc->context->cmap_cache, dsc->face_id, charmap_index, data->unicode);
+ FT_UInt glyph_index = FT_Get_Char_Index(face, data->unicode);
FT_Set_Pixel_Sizes(face, 0, dsc->size);
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_COMPUTE_METRICS | FT_LOAD_NO_BITMAP);
@@ -149,7 +148,14 @@ static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void
dsc_out->ofs_x = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingX); /*X offset of the bitmap in [pf]*/
dsc_out->ofs_y = FT_F26DOT6_TO_INT(glyph->metrics.horiBearingY -
glyph->metrics.height); /*Y offset of the bitmap measured from the as line*/
- dsc_out->bpp = LV_VECFONT_BPP; /*Bit per pixel: 1/2/4/8*/
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_VECTOR;
+
+ /*Transform the glyph to italic if required*/
+ if(dsc->style & LV_FREETYPE_FONT_STYLE_ITALIC) {
+ dsc_out->box_w = lv_freetype_italic_transform_on_pos((lv_point_t) {
+ dsc_out->box_w, dsc_out->box_h
+ });
+ }
}
else if(dsc->render_mode == LV_FREETYPE_FONT_RENDER_MODE_BITMAP) {
FT_Bitmap * glyph_bitmap = &face->glyph->bitmap;
@@ -160,7 +166,7 @@ static bool freetype_glyph_create_cb(lv_freetype_glyph_cache_data_t * data, void
dsc_out->ofs_x = glyph->bitmap_left; /*X offset of the bitmap in [pf]*/
dsc_out->ofs_y = glyph->bitmap_top -
dsc_out->box_h; /*Y offset of the bitmap measured from the as line*/
- dsc_out->bpp = 8; /*Bit per pixel: 1/2/4/8*/
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_A8;
}
dsc_out->is_placeholder = glyph_index == 0;
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_image.c b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_image.c
index f1ef689e3..7a7b04d46 100755
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_image.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_image.c
@@ -7,6 +7,7 @@
* INCLUDES
*********************/
+#include "../../lvgl.h"
#include "lv_freetype_private.h"
#if LV_USE_FREETYPE
@@ -51,7 +52,7 @@ static void freetype_image_release_cb(const lv_font_t * font, lv_font_glyph_dsc_
* GLOBAL FUNCTIONS
**********************/
-lv_cache_t * lv_freetype_create_draw_data_image(void)
+lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size)
{
lv_cache_ops_t ops = {
.compare_cb = (lv_cache_compare_cb_t)freetype_image_compare_cb,
@@ -60,7 +61,7 @@ lv_cache_t * lv_freetype_create_draw_data_image(void)
};
lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_image_cache_data_t),
- LV_FREETYPE_CACHE_FT_GLYPH_CNT, ops);
+ cache_size, ops);
return draw_data_cache;
}
@@ -87,8 +88,7 @@ static const void * freetype_get_glyph_bitmap_cb(lv_font_glyph_dsc_t * g_dsc,
LV_ASSERT_FREETYPE_FONT_DSC(dsc);
FT_Face face = dsc->cache_node->face;
- FT_UInt charmap_index = FT_Get_Charmap_Index(face->charmap);
- FT_UInt glyph_index = FTC_CMapCache_Lookup(dsc->context->cmap_cache, dsc->face_id, charmap_index, unicode_letter);
+ FT_UInt glyph_index = FT_Get_Char_Index(face, unicode_letter);
lv_cache_t * cache = dsc->cache_node->draw_data_cache;
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_outline.c b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_outline.c
index 6bff04b08..43c66cc18 100755
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_outline.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_outline.c
@@ -7,6 +7,7 @@
* INCLUDES
*********************/
+#include "../../lvgl.h"
#include "lv_freetype_private.h"
#if LV_USE_FREETYPE
@@ -56,7 +57,7 @@ static lv_cache_compare_res_t freetype_glyph_outline_cmp_cb(const lv_freetype_ou
* GLOBAL FUNCTIONS
**********************/
-lv_cache_t * lv_freetype_create_draw_data_outline(void)
+lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size)
{
lv_cache_ops_t glyph_outline_cache_ops = {
.create_cb = (lv_cache_create_cb_t)freetype_glyph_outline_create_cb,
@@ -65,7 +66,7 @@ lv_cache_t * lv_freetype_create_draw_data_outline(void)
};
lv_cache_t * draw_data_cache = lv_cache_create(&lv_cache_class_lru_rb_count, sizeof(lv_freetype_outline_node_t),
- LV_FREETYPE_CACHE_FT_GLYPH_CNT,
+ cache_size,
glyph_outline_cache_ops);
return draw_data_cache;
@@ -187,8 +188,8 @@ static lv_cache_entry_t * lv_freetype_outline_lookup(lv_freetype_font_dsc_t * ds
{
lv_freetype_cache_node_t * cache_node = dsc->cache_node;
- FT_UInt charmap_index = FT_Get_Charmap_Index(cache_node->face->charmap);
- FT_UInt glyph_index = FTC_CMapCache_Lookup(dsc->context->cmap_cache, dsc->face_id, charmap_index, unicode_letter);
+ FT_Face face = cache_node->face;
+ FT_UInt glyph_index = FT_Get_Char_Index(face, unicode_letter);
lv_freetype_outline_node_t tmp_node;
tmp_node.glyph_index = glyph_index;
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_private.h b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_private.h
index 3e6b4297f..976e54fea 100755
--- a/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_private.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/freetype/lv_freetype_private.h
@@ -38,10 +38,6 @@ extern "C" {
LV_LOG_ERROR(msg " error(0x%x)", (int)error_code)
#endif
-#if LV_FREETYPE_CACHE_SIZE <= 0
-#error "LV_FREETYPE_CACHE_SIZE must > 0"
-#endif
-
#define LV_FREETYPE_FONT_DSC_MAGIC_NUM 0x5F5F4654 /* '__FT' */
#define LV_FREETYPE_FONT_DSC_HAS_MAGIC_NUM(dsc) ((dsc)->magic_num == LV_FREETYPE_FONT_DSC_MAGIC_NUM)
#define LV_ASSERT_FREETYPE_FONT_DSC(dsc) \
@@ -80,11 +76,11 @@ struct _lv_freetype_cache_node_t {
typedef struct _lv_freetype_context_t {
FT_Library library;
- FTC_Manager cache_manager;
- FTC_CMapCache cmap_cache;
lv_ll_t face_id_ll;
lv_event_cb_t event_cb;
+ uint32_t max_glyph_cnt;
+
lv_cache_t * cache_node_cache;
} lv_freetype_context_t;
@@ -111,26 +107,16 @@ typedef struct _lv_freetype_font_dsc_t {
*/
lv_freetype_context_t * lv_freetype_get_context(void);
-/**
- * Look up a FreeType size object for a given font descriptor and size.
- *
- * @param dsc The font descriptor to use.
- * @param size The size of the font.
- * @return A pointer to the FreeType size object.
- */
-FT_Size lv_freetype_lookup_size(const lv_freetype_font_dsc_t * dsc);
-
void lv_freetype_italic_transform(FT_Face face);
+int32_t lv_freetype_italic_transform_on_pos(lv_point_t point);
-const char * lv_freetype_get_pathname(FTC_FaceID face_id);
-
-lv_cache_t * lv_freetype_create_glyph_cache(void);
+lv_cache_t * lv_freetype_create_glyph_cache(uint32_t cache_size);
void lv_freetype_set_cbs_glyph(lv_freetype_font_dsc_t * dsc);
-lv_cache_t * lv_freetype_create_draw_data_image(void);
+lv_cache_t * lv_freetype_create_draw_data_image(uint32_t cache_size);
void lv_freetype_set_cbs_image_font(lv_freetype_font_dsc_t * dsc);
-lv_cache_t * lv_freetype_create_draw_data_outline(void);
+lv_cache_t * lv_freetype_create_draw_data_outline(uint32_t cache_size);
void lv_freetype_set_cbs_outline_font(lv_freetype_font_dsc_t * dsc);
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_cbfs.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_cbfs.c
index d4833bb0e..6f1245bb2 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_cbfs.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_cbfs.c
@@ -7,4 +7,4 @@
IS_NOT_USED static void nothing(void)
{
// do nothing
-}
\ No newline at end of file
+}
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_fatfs.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_fatfs.c
index 44971733b..e4343220e 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_fatfs.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_fatfs.c
@@ -62,7 +62,6 @@ void lv_fs_fatfs_init(void)
* Register the file system interface in LVGL
*--------------------------------------------------*/
- /*Add a simple drive to open images*/
lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->fatfs_fs_drv);
lv_fs_drv_init(fs_drv_p);
@@ -205,8 +204,8 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
- * @param file_p pointer to a FIL variable.
- * @param pos_p pointer to to store the result
+ * @param file_p pointer to a FIL variable
+ * @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error, the file is read
* any error from lv_fs_res_t enum
*/
@@ -257,6 +256,8 @@ static lv_fs_res_t fs_dir_read(lv_fs_drv_t * drv, void * dir_p, char * fn, uint3
res = f_readdir(dir_p, &fno);
if(res != FR_OK) return LV_FS_RES_UNKNOWN;
+ if(fno.fname[0] == 0) break; /* End of the directory */
+
if(fno.fattrib & AM_DIR) {
lv_snprintf(fn, fn_len, "/%s", fno.fname);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_littlefs.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_littlefs.c
new file mode 100644
index 000000000..3ac523361
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_littlefs.c
@@ -0,0 +1,188 @@
+#include "../../../lvgl.h"
+#if LV_USE_FS_LITTLEFS
+
+#include "lfs.h"
+#include "../../core/lv_global.h"
+
+typedef struct LittleFile {
+ lfs_file_t file;
+} LittleFile;
+
+/**********************
+ * STATIC PROTOTYPES
+ **********************/
+static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode);
+static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p);
+static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br);
+static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw);
+static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence);
+static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p);
+
+void lv_littlefs_set_handler(lfs_t * lfs)
+{
+ lv_fs_drv_t * drv = lv_fs_get_drv(LV_FS_LITTLEFS_LETTER);
+ drv->user_data = lfs;
+}
+
+/**
+ * Register a driver for the LittleFS File System interface
+ */
+void lv_fs_littlefs_init(void)
+{
+ lv_fs_drv_t * fs_drv = &(LV_GLOBAL_DEFAULT()->littlefs_fs_drv);
+ lv_fs_drv_init(fs_drv);
+
+ fs_drv->letter = LV_FS_LITTLEFS_LETTER;
+ fs_drv->open_cb = fs_open;
+ fs_drv->close_cb = fs_close;
+ fs_drv->read_cb = fs_read;
+ fs_drv->write_cb = fs_write;
+ fs_drv->seek_cb = fs_seek;
+ fs_drv->tell_cb = fs_tell;
+
+ fs_drv->dir_close_cb = NULL;
+ fs_drv->dir_open_cb = NULL;
+ fs_drv->dir_read_cb = NULL;
+
+ lv_fs_drv_register(fs_drv);
+}
+
+/**********************
+ * STATIC FUNCTIONS
+ **********************/
+
+/**
+ * Open a file
+ * @param drv pointer to a driver where this function belongs
+ * @param path path to the file beginning with the driver letter (e.g. S:/folder/file.txt)
+ * @param mode read: FS_MODE_RD, write: FS_MODE_WR, both: FS_MODE_RD | FS_MODE_WR
+ * @return a file descriptor or NULL on error
+ */
+static void * fs_open(lv_fs_drv_t * drv, const char * path, lv_fs_mode_t mode)
+{
+ LV_UNUSED(drv);
+
+ int flags;
+ if(mode == LV_FS_MODE_WR)
+ flags = LFS_O_WRONLY;
+ else if(mode == LV_FS_MODE_RD)
+ flags = LFS_O_RDONLY;
+ else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD))
+ flags = LFS_O_RDWR;
+
+ LittleFile * lf = (LittleFile *)lv_malloc(sizeof(LittleFile));
+ LV_ASSERT_NULL(lf);
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ int err = lfs_file_open(lfs, &lf->file, path, flags);
+ if(err) {
+ return NULL;
+ }
+
+ return (void *)lf;
+}
+
+/**
+ * Close an opened file
+ * @param drv pointer to a driver where this function belongs
+ * @param file_p pointer to a file_t variable. (opened with fs_open)
+ * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
+ */
+static lv_fs_res_t fs_close(lv_fs_drv_t * drv, void * file_p)
+{
+ LV_UNUSED(drv);
+ LittleFile * lf = (LittleFile *)file_p;
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ lfs_file_close(lfs, &lf->file);
+ lv_free(lf);
+
+ return LV_FS_RES_OK;
+}
+
+/**
+ * Read data from an opened file
+ * @param drv pointer to a driver where this function belongs
+ * @param file_p pointer to a file_t variable.
+ * @param buf pointer to a memory block where to store the read data
+ * @param btr number of Bytes To Read
+ * @param br the real number of read bytes (Byte Read)
+ * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
+ */
+static lv_fs_res_t fs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br)
+{
+ LV_UNUSED(drv);
+ LittleFile * lf = (LittleFile *)file_p;
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ *br = lfs_file_read(lfs, &lf->file, (uint8_t *)buf, btr);
+
+ return (int32_t)(*br) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
+}
+
+/**
+ * Write into a file
+ * @param drv pointer to a driver where this function belongs
+ * @param file_p pointer to a file_t variable
+ * @param buf pointer to a buffer with the bytes to write
+ * @param btw Bytes To Write
+ * @param bw the number of real written bytes (Bytes Written)
+ * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
+ */
+static lv_fs_res_t fs_write(lv_fs_drv_t * drv, void * file_p, const void * buf, uint32_t btw, uint32_t * bw)
+{
+ LV_UNUSED(drv);
+ LittleFile * lf = (LittleFile *)file_p;
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ *bw = lfs_file_write(lfs, &lf->file, (uint8_t *)buf, btw);
+
+ return (int32_t)(*bw) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
+}
+
+/**
+ * Set the read write pointer. Also expand the file size if necessary.
+ * @param drv pointer to a driver where this function belongs
+ * @param file_p pointer to a file_t variable. (opened with fs_open )
+ * @param pos the new position of read write pointer
+ * @param whence tells from where to interpret the `pos`. See @lv_fs_whence_t
+ * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
+ */
+static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs_whence_t whence)
+{
+ LV_UNUSED(drv);
+ int mode;
+ if(whence == LV_FS_SEEK_SET)
+ mode = LFS_SEEK_SET;
+ else if(whence == LV_FS_SEEK_CUR)
+ mode = LFS_SEEK_CUR;
+ else if(whence == LV_FS_SEEK_END)
+ mode = LFS_SEEK_END;
+
+ LittleFile * lf = (LittleFile *)file_p;
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ int rc = lfs_file_seek(lfs, &lf->file, pos, mode);
+
+ return rc < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
+}
+
+/**
+ * Give the position of the read write pointer
+ * @param drv pointer to a driver where this function belongs
+ * @param file_p pointer to a file_p variable
+ * @param pos_p pointer to store the result
+ * @return LV_FS_RES_OK: no error or any error from @lv_fs_res_t enum
+ */
+static lv_fs_res_t fs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p)
+{
+ LV_UNUSED(drv);
+ LittleFile * lf = (LittleFile *)file_p;
+
+ lfs_t * lfs = (lfs_t *)drv->user_data;
+ *pos_p = lfs_file_tell(lfs, &lf->file);
+
+ return (int32_t)(*pos_p) < 0 ? LV_FS_RES_UNKNOWN : LV_FS_RES_OK;
+}
+
+#endif
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_memfs.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_memfs.c
index 746f62ea1..52379beb7 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_memfs.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_memfs.c
@@ -84,7 +84,6 @@ void lv_fs_memfs_init(void)
* Register the file system interface in LVGL
*--------------------------------------------------*/
- /*Add a simple drive to open images*/
lv_fs_drv_init(&fs_drv);
/*Set up fields...*/
@@ -194,8 +193,8 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
- * @param file_p pointer to a FILE variable.
- * @param pos_p pointer to to store the result
+ * @param file_p pointer to a FILE variable
+ * @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error, the file is read
* any error from lv_fs_res_t enum
*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_posix.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_posix.c
index b345ea969..839742fc5 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_posix.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_posix.c
@@ -68,7 +68,6 @@ void lv_fs_posix_init(void)
* Register the file system interface in LVGL
*--------------------------------------------------*/
- /*Add a simple drive to open images*/
lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->posix_fs_drv);
lv_fs_drv_init(fs_drv_p);
@@ -200,8 +199,8 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
- * @param file_p a file handle variable.
- * @param pos_p pointer to to store the result
+ * @param file_p a file handle variable
+ * @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error, the file is read
* any error from lv_fs_res_t enum
*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_stdio.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_stdio.c
index fd5c2d183..020749d65 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_stdio.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_stdio.c
@@ -69,7 +69,6 @@ void lv_fs_stdio_init(void)
* Register the file system interface in LVGL
*--------------------------------------------------*/
- /*Add a simple drive to open images*/
lv_fs_drv_t * fs_drv_p = &(LV_GLOBAL_DEFAULT()->stdio_fs_drv);
lv_fs_drv_init(fs_drv_p);
@@ -200,8 +199,8 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
- * @param file_p pointer to a FILE variable.
- * @param pos_p pointer to to store the result
+ * @param file_p pointer to a FILE variable
+ * @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error, the file is read
* any error from lv_fs_res_t enum
*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_win32.c b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_win32.c
index 4a8ac0a81..e021219ed 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_win32.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fs_win32.c
@@ -315,8 +315,8 @@ static lv_fs_res_t fs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos, lv_fs
/**
* Give the position of the read write pointer
* @param drv pointer to a driver where this function belongs
- * @param file_p pointer to a FILE variable.
- * @param pos_p pointer to to store the result
+ * @param file_p pointer to a FILE variable
+ * @param pos_p pointer to store the result
* @return LV_FS_RES_OK: no error, the file is read
* any error from lv_fs_res_t enum
*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fsdrv.h b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fsdrv.h
index fcf5bd79e..993a96735 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fsdrv.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/fsdrv/lv_fsdrv.h
@@ -47,6 +47,10 @@ void lv_fs_win32_init(void);
void lv_fs_memfs_init(void);
#endif
+#if LV_USE_FS_LITTLEFS
+void lv_fs_littlefs_init(void);
+#endif
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/gif/gifdec.h b/lib/libesp32_lvgl/lvgl/src/libs/gif/gifdec.h
index 71cb9ffbf..3fd60bf3b 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/gif/gifdec.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/gif/gifdec.h
@@ -1,6 +1,10 @@
#ifndef GIFDEC_H
#define GIFDEC_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include
#include "../../misc/lv_fs.h"
@@ -60,4 +64,8 @@ void gd_close_gif(gd_GIF * gif);
#endif /*LV_USE_GIF*/
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
#endif /* GIFDEC_H */
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.c b/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.c
index 1ab48e30f..e1eab06b0 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.c
@@ -14,7 +14,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_gif_class
+#define MY_CLASS (&lv_gif_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.h b/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.h
index 9a7ca7a8e..9228bf557 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/gif/lv_gif.h
@@ -31,7 +31,7 @@ typedef struct {
lv_image_t img;
gd_GIF * gif;
lv_timer_t * timer;
- lv_image_dsc_t imgdsc;
+ lv_draw_buf_t imgdsc;
uint32_t last_call;
} lv_gif_t;
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c b/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c
index 59803323c..f3ac140d2 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.c
@@ -12,6 +12,7 @@
#include "lv_libjpeg_turbo.h"
#include
#include
+#include
#include
/*********************
@@ -36,16 +37,27 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static lv_draw_buf_t * decode_jpeg_file(const char * filename);
-static bool get_jpeg_size(const char * filename, uint32_t * width, uint32_t * height);
+static uint8_t * read_file(const char * filename, uint32_t * size);
+static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation);
+static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height);
+static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation);
+static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle);
static void error_exit(j_common_ptr cinfo);
-static void jpeg_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data);
/**********************
* STATIC VARIABLES
**********************/
+const int JPEG_EXIF = 0x45786966; /* Exif data structure tag */
+const int JPEG_BIG_ENDIAN_TAG = 0x4d4d;
+const int JPEG_LITTLE_ENDIAN_TAG = 0x4949;
/**********************
* MACROS
**********************/
+#define TRANS_32_VALUE(big_endian, data) big_endian ? \
+ ((*(data) << 24) | (*((data) + 1) << 16) | (*((data) + 2) << 8) | *((data) + 3)) : \
+ (*(data) | (*((data) + 1) << 8) | (*((data) + 2) << 16) | (*((data) + 3) << 24))
+#define TRANS_16_VALUE(big_endian, data) big_endian ? \
+ ((*(data) << 8) | *((data) + 1)) : (*(data) | (*((data) + 1) << 8))
/**********************
* GLOBAL FUNCTIONS
@@ -60,7 +72,7 @@ void lv_libjpeg_turbo_init(void)
lv_image_decoder_set_info_cb(dec, decoder_info);
lv_image_decoder_set_open_cb(dec, decoder_open);
lv_image_decoder_set_close_cb(dec, decoder_close);
- lv_image_decoder_set_cache_free_cb(dec, (lv_cache_free_cb_t)jpeg_decoder_cache_free_cb);
+ lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/
}
void lv_libjpeg_turbo_deinit(void)
@@ -122,15 +134,16 @@ static lv_result_t decoder_info(lv_image_decoder_t * decoder, const void * src,
uint32_t width;
uint32_t height;
+ uint32_t orientation = 0;
- if(!get_jpeg_size(fn, &width, &height)) {
+ if(!get_jpeg_head_info(fn, &width, &height, &orientation)) {
return LV_RESULT_INVALID;
}
/*Save the data in the header*/
header->cf = LV_COLOR_FORMAT_RGB888;
- header->w = width;
- header->h = height;
+ header->w = (orientation % 180) ? height : width;
+ header->h = (orientation % 180) ? width : height;
return LV_RESULT_OK;
}
@@ -194,7 +207,7 @@ static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t *
lv_cache_release(dsc->cache, dsc->cache_entry, NULL);
}
-static uint8_t * alloc_file(const char * filename, uint32_t * size)
+static uint8_t * read_file(const char * filename, uint32_t * size)
{
uint8_t * data = NULL;
lv_fs_file_t f;
@@ -263,7 +276,9 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
/* More stuff */
JSAMPARRAY buffer; /* Output row buffer */
+
int row_stride; /* physical row width in output buffer */
+ uint32_t image_angle = 0; /* image rotate angle */
lv_draw_buf_t * decoded = NULL;
@@ -274,7 +289,7 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
*/
uint32_t data_size;
- uint8_t * data = alloc_file(filename, &data_size);
+ uint8_t * data = read_file(filename, &data_size);
if(data == NULL) {
LV_LOG_WARN("can't load file %s", filename);
return NULL;
@@ -301,6 +316,12 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
lv_free(data);
return NULL;
}
+
+ /* Get rotate angle from Exif data */
+ if(!get_jpeg_direction(data, data_size, &image_angle)) {
+ LV_LOG_WARN("read jpeg orientation failed.");
+ }
+
/* Now we can initialize the JPEG decompression object. */
jpeg_create_decompress(&cinfo);
@@ -345,12 +366,11 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
/* Make a one-row-high sample array that will go away when done with image */
buffer = (*cinfo.mem->alloc_sarray)
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
-
- decoded = lv_draw_buf_create(cinfo.output_width, cinfo.output_height, LV_COLOR_FORMAT_RGB888, LV_STRIDE_AUTO);
+ uint32_t buf_width = (image_angle % 180) ? cinfo.output_height : cinfo.output_width;
+ uint32_t buf_height = (image_angle % 180) ? cinfo.output_width : cinfo.output_height;
+ decoded = lv_draw_buf_create(buf_width, buf_height, LV_COLOR_FORMAT_RGB888, LV_STRIDE_AUTO);
if(decoded != NULL) {
- uint8_t * cur_pos = decoded->data;
- size_t stride = cinfo.output_width * JPEG_PIXEL_SIZE;
-
+ uint32_t line_index = 0;
/* while (scan lines remain to be read) */
/* jpeg_read_scanlines(...); */
@@ -365,8 +385,9 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
jpeg_read_scanlines(&cinfo, buffer, 1);
/* Assume put_scanline_someplace wants a pointer and sample count. */
- lv_memcpy(cur_pos, buffer[0], stride);
- cur_pos += decoded->header.stride;
+ rotate_buffer(decoded, buffer[0], line_index, image_angle);
+
+ line_index++;
}
}
@@ -398,25 +419,39 @@ static lv_draw_buf_t * decode_jpeg_file(const char * filename)
return decoded;
}
-static bool get_jpeg_size(const char * filename, uint32_t * width, uint32_t * height)
+static bool get_jpeg_head_info(const char * filename, uint32_t * width, uint32_t * height, uint32_t * orientation)
{
- struct jpeg_decompress_struct cinfo;
- error_mgr_t jerr;
-
uint8_t * data = NULL;
uint32_t data_size;
- data = alloc_file(filename, &data_size);
+ data = read_file(filename, &data_size);
if(data == NULL) {
return false;
}
+ if(!get_jpeg_size(data, data_size, width, height)) {
+ LV_LOG_WARN("read jpeg size failed.");
+ }
+
+ if(!get_jpeg_direction(data, data_size, orientation)) {
+ LV_LOG_WARN("read jpeg orientation failed.");
+ }
+
+ lv_free(data);
+
+ return JPEG_HEADER_OK;
+}
+
+static bool get_jpeg_size(uint8_t * data, uint32_t data_size, uint32_t * width, uint32_t * height)
+{
+ struct jpeg_decompress_struct cinfo;
+ error_mgr_t jerr;
+
cinfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = error_exit;
if(setjmp(jerr.jb)) {
LV_LOG_WARN("read jpeg head failed");
jpeg_destroy_decompress(&cinfo);
- lv_free(data);
return false;
}
@@ -436,9 +471,120 @@ static bool get_jpeg_size(const char * filename, uint32_t * width, uint32_t * he
jpeg_destroy_decompress(&cinfo);
- lv_free(data);
+ return JPEG_HEADER_OK;
+}
- return (ret == JPEG_HEADER_OK);
+static bool get_jpeg_direction(uint8_t * data, uint32_t data_size, uint32_t * orientation)
+{
+ struct jpeg_decompress_struct cinfo;
+ error_mgr_t jerr;
+
+ cinfo.err = jpeg_std_error(&jerr.pub);
+ jerr.pub.error_exit = error_exit;
+
+ if(setjmp(jerr.jb)) {
+ LV_LOG_WARN("read jpeg orientation failed");
+ jpeg_destroy_decompress(&cinfo);
+ return false;
+ }
+
+ jpeg_create_decompress(&cinfo);
+
+ jpeg_mem_src(&cinfo, data, data_size);
+
+ jpeg_save_markers(&cinfo, JPEG_APP0 + 1, 0xFFFF);
+
+ cinfo.marker->read_markers(&cinfo);
+
+ jpeg_saved_marker_ptr marker = cinfo.marker_list;
+ while(marker != NULL) {
+ if(marker->marker == JPEG_APP0 + 1) {
+ JOCTET FAR * app1_data = marker->data;
+ if(TRANS_32_VALUE(true, app1_data) == JPEG_EXIF) {
+ uint16_t endian_tag = TRANS_16_VALUE(true, app1_data + 4 + 2);
+ if(!(endian_tag == JPEG_LITTLE_ENDIAN_TAG || endian_tag == JPEG_BIG_ENDIAN_TAG)) {
+ jpeg_destroy_decompress(&cinfo);
+ return false;
+ }
+ bool is_big_endian = endian_tag == JPEG_BIG_ENDIAN_TAG;
+ /* first ifd offset addr : 4bytes(Exif) + 2bytes(0x00) + 2bytes(align) + 2bytes(tag mark) */
+ unsigned int offset = TRANS_32_VALUE(is_big_endian, app1_data + 8 + 2);
+ /* ifd base : 4bytes(Exif) + 2bytes(0x00) */
+ unsigned char * ifd = 0;
+ do {
+ /* ifd start: 4bytes(Exif) + 2bytes(0x00) + offset value(2bytes(align) + 2bytes(tag mark) + 4bytes(offset size)) */
+ unsigned int entry_offset = 4 + 2 + offset + 2;
+ if(entry_offset >= marker->data_length) {
+ jpeg_destroy_decompress(&cinfo);
+ return false;
+ }
+ ifd = app1_data + entry_offset;
+ unsigned short num_entries = TRANS_16_VALUE(is_big_endian, ifd - 2);
+ if(entry_offset + num_entries * 12 >= marker->data_length) {
+ jpeg_destroy_decompress(&cinfo);
+ return false;
+ }
+ for(int i = 0; i < num_entries; i++) {
+ unsigned short tag = TRANS_16_VALUE(is_big_endian, ifd);
+ if(tag == 0x0112) {
+ /* ifd entry: 12bytes = 2bytes(tag number) + 2bytes(kind of data) + 4bytes(number of components) + 4bytes(data)
+ * orientation kind(0x03) of data is unsigned short */
+ int dirc = TRANS_16_VALUE(is_big_endian, ifd + 2 + 2 + 4);
+ switch(dirc) {
+ case 1:
+ *orientation = 0;
+ break;
+ case 3:
+ *orientation = 180;
+ break;
+ case 6:
+ *orientation = 90;
+ break;
+ case 8:
+ *orientation = 270;
+ break;
+ default:
+ *orientation = 0;
+ }
+ }
+ ifd += 12;
+ }
+ offset = TRANS_32_VALUE(is_big_endian, ifd);
+ } while(offset != 0);
+ }
+ break;
+ }
+ marker = marker->next;
+ }
+
+ jpeg_destroy_decompress(&cinfo);
+
+ return JPEG_HEADER_OK;
+}
+
+static void rotate_buffer(lv_draw_buf_t * decoded, uint8_t * buffer, uint32_t line_index, uint32_t angle)
+{
+ if(angle == 90) {
+ for(uint32_t x = 0; x < decoded->header.h; x++) {
+ uint32_t dst_index = x * decoded->header.stride + (decoded->header.w - line_index - 1) * JPEG_PIXEL_SIZE;
+ lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE);
+ }
+ }
+ else if(angle == 180) {
+ for(uint32_t x = 0; x < decoded->header.w; x++) {
+ uint32_t dst_index = (decoded->header.h - line_index - 1) * decoded->header.stride + x * JPEG_PIXEL_SIZE;
+ lv_memcpy(decoded->data + dst_index, buffer + (decoded->header.w - x - 1) * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE);
+ }
+ }
+ else if(angle == 270) {
+ for(uint32_t x = 0; x < decoded->header.h; x++) {
+ uint32_t dst_index = (decoded->header.h - x - 1) * decoded->header.stride + line_index * JPEG_PIXEL_SIZE;
+ lv_memcpy(decoded->data + dst_index, buffer + x * JPEG_PIXEL_SIZE, JPEG_PIXEL_SIZE);
+ }
+ }
+ else {
+ lv_memcpy(decoded->data + line_index * decoded->header.stride, buffer, decoded->header.stride);
+ }
}
static void error_exit(j_common_ptr cinfo)
@@ -448,12 +594,4 @@ static void error_exit(j_common_ptr cinfo)
longjmp(myerr->jb, 1);
}
-static void jpeg_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data)
-{
- LV_UNUSED(user_data);
-
- if(cached_data->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)cached_data->src);
- lv_draw_buf_destroy((lv_draw_buf_t *)cached_data->decoded);
-}
-
#endif /*LV_USE_LIBJPEG_TURBO*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h b/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h
index ff5e5df7d..177c83a61 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/libjpeg_turbo/lv_libjpeg_turbo.h
@@ -45,4 +45,4 @@ void lv_libjpeg_turbo_deinit(void);
} /* extern "C" */
#endif
-#endif /*LV_LIBJPEG_TURBO_H*/
\ No newline at end of file
+#endif /*LV_LIBJPEG_TURBO_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/libpng/lv_libpng.c b/lib/libesp32_lvgl/lvgl/src/libs/libpng/lv_libpng.c
index 2776e6c2d..8f539b86b 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/libpng/lv_libpng.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/libpng/lv_libpng.c
@@ -28,7 +28,6 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
static void decoder_close(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc);
static lv_draw_buf_t * decode_png_file(const char * filename);
-static void png_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data);
/**********************
* STATIC VARIABLES
**********************/
@@ -50,7 +49,7 @@ void lv_libpng_init(void)
lv_image_decoder_set_info_cb(dec, decoder_info);
lv_image_decoder_set_open_cb(dec, decoder_open);
lv_image_decoder_set_close_cb(dec, decoder_close);
- lv_image_decoder_set_cache_free_cb(dec, (lv_cache_free_cb_t)png_decoder_cache_free_cb);
+ lv_image_decoder_set_cache_free_cb(dec, NULL); /*Use general cache free method*/
}
void lv_libpng_deinit(void)
@@ -267,7 +266,7 @@ static lv_draw_buf_t * decode_png_file(const char * filename)
lv_draw_buf_t * decoded;
decoded = lv_draw_buf_create(image.width, image.height, LV_COLOR_FORMAT_ARGB8888, PNG_IMAGE_ROW_STRIDE(image));
if(decoded == NULL) {
- LV_LOG_ERROR("png draw buff alloc %" LV_PRIu32 " failed: %s", PNG_IMAGE_SIZE(image), filename);
+ LV_LOG_ERROR("alloc PNG_IMAGE_SIZE(%" LV_PRIu32 ") failed: %s", (uint32_t)PNG_IMAGE_SIZE(image), filename);
lv_free(data);
return NULL;
}
@@ -285,12 +284,4 @@ static lv_draw_buf_t * decode_png_file(const char * filename)
return decoded;
}
-static void png_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data)
-{
- LV_UNUSED(user_data);
-
- if(cached_data->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)cached_data->src);
- lv_draw_buf_destroy((lv_draw_buf_t *)cached_data->decoded);
-}
-
#endif /*LV_USE_LIBPNG*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lodepng.h b/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lodepng.h
index b23c25a68..de9eec5ff 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lodepng.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lodepng.h
@@ -26,6 +26,10 @@ freely, subject to the following restrictions:
#ifndef LODEPNG_H
#define LODEPNG_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
#include /*for size_t*/
#include "../../../lvgl.h"
@@ -1092,6 +1096,10 @@ TODO:
#endif /*LV_USE_LODEPNG*/
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
#endif /*LODEPNG_H inclusion guard*/
/*
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lv_lodepng.c b/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lv_lodepng.c
index 49a1e8825..34b3bef87 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lv_lodepng.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/lodepng/lv_lodepng.c
@@ -29,7 +29,6 @@ static lv_result_t decoder_open(lv_image_decoder_t * decoder, lv_image_decoder_d
static void decoder_close(lv_image_decoder_t * dec, lv_image_decoder_dsc_t * dsc);
static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt);
static lv_draw_buf_t * decode_png_data(const void * png_data, size_t png_data_size);
-static void lodepng_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data);
/**********************
* STATIC VARIABLES
**********************/
@@ -51,7 +50,6 @@ void lv_lodepng_init(void)
lv_image_decoder_set_info_cb(dec, decoder_info);
lv_image_decoder_set_open_cb(dec, decoder_open);
lv_image_decoder_set_close_cb(dec, decoder_close);
- lv_image_decoder_set_cache_free_cb(dec, (lv_cache_free_cb_t)lodepng_decoder_cache_free_cb);
}
void lv_lodepng_deinit(void)
@@ -271,12 +269,4 @@ static void convert_color_depth(uint8_t * img_p, uint32_t px_cnt)
}
}
-static void lodepng_decoder_cache_free_cb(lv_image_cache_data_t * cached_data, void * user_data)
-{
- LV_UNUSED(user_data);
-
- if(cached_data->src_type == LV_IMAGE_SRC_FILE) lv_free((void *)cached_data->src);
- lv_draw_buf_destroy((lv_draw_buf_t *)cached_data->decoded);
-}
-
#endif /*LV_USE_LODEPNG*/
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.c b/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.c
index e6d693237..08f44b342 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.c
@@ -6,7 +6,8 @@
/*********************
* INCLUDES
*********************/
-#include "lv_qrcode.h"
+#include "../../lvgl.h"
+
#if LV_USE_QRCODE
#include "qrcodegen.h"
@@ -14,7 +15,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_qrcode_class
+#define MY_CLASS (&lv_qrcode_class)
/**********************
* TYPEDEFS
@@ -66,7 +67,7 @@ void lv_qrcode_set_size(lv_obj_t * obj, int32_t size)
}
lv_canvas_set_draw_buf(obj, new_buf);
- LV_LOG_INFO("set canvas buffer: %p, size = %d", new_buf, (int)size);
+ LV_LOG_INFO("set canvas buffer: %p, size = %d", (void *)new_buf, (int)size);
/*Clear canvas buffer*/
lv_canvas_fill_bg(obj, lv_color_white(), LV_OPA_COVER);
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.h b/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.h
index 36de2b384..aed84fd7c 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/qrcode/lv_qrcode.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_QRCODE
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.c b/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.c
index f19660b8b..e715b7cc1 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.c
@@ -58,8 +58,12 @@ uint32_t lv_rle_decompress(const uint8_t * input,
return 0;
wr_len += bytes;
- if(wr_len > output_buff_len)
- return 0;
+ if(wr_len > output_buff_len) {
+ if(wr_len > output_buff_len + blk_size)
+ return 0; /* Error */
+ lv_memcpy(output, input, output_buff_len - (wr_len - bytes));
+ return output_buff_len;
+ }
lv_memcpy(output, input, bytes);
output += bytes;
@@ -71,8 +75,17 @@ uint32_t lv_rle_decompress(const uint8_t * input,
return 0;
wr_len += blk_size * ctrl_byte;
- if(wr_len > output_buff_len)
- return 0;
+ if(wr_len > output_buff_len) {
+ if(wr_len > output_buff_len + blk_size)
+ return 0; /* Error happened */
+
+ /* Skip the last pixel, which could overflow output buffer.*/
+ for(uint32_t i = 0; i < ctrl_byte - 1; i++) {
+ lv_memcpy(output, input, blk_size);
+ output += blk_size;
+ }
+ return output_buff_len;
+ }
if(blk_size == 1) {
/* optimize the most common case. */
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.h b/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.h
index a6298cbca..02ab6a349 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/rle/lv_rle.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_RLE
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.c b/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.c
index 33b671f1f..f595215f5 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.c
@@ -6,7 +6,7 @@
/*********************
* INCLUDES
*********************/
-#include "lv_rlottie.h"
+#include "../../lvgl.h"
#if LV_USE_RLOTTIE
#include
@@ -14,7 +14,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_rlottie_class
+#define MY_CLASS (&lv_rlottie_class)
#define LV_ARGB32 32
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.h b/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.h
index 652a1a9aa..f9ab93ff7 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/rlottie/lv_rlottie.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_RLOTTIE
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/thorvg/thorvg_capi.h b/lib/libesp32_lvgl/lvgl/src/libs/thorvg/thorvg_capi.h
index 1f31cb71d..c4db0cdfd 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/thorvg/thorvg_capi.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/thorvg/thorvg_capi.h
@@ -433,7 +433,7 @@ typedef enum {
*
* \return A new Tvg_Canvas object.
*/
-TVG_API Tvg_Canvas* tvg_swcanvas_create();
+TVG_API Tvg_Canvas* tvg_swcanvas_create(void);
/*!
@@ -1037,7 +1037,7 @@ TVG_API Tvg_Result tvg_paint_get_blend_method(const Tvg_Paint* paint, Tvg_Blend_
*
* \return A new shape object.
*/
-TVG_API Tvg_Paint* tvg_shape_new();
+TVG_API Tvg_Paint* tvg_shape_new(void);
/*!
@@ -1712,7 +1712,7 @@ TVG_API Tvg_Result tvg_shape_get_gradient(const Tvg_Paint* paint, Tvg_Gradient**
*
* \return A new linear gradient object.
*/
-TVG_API Tvg_Gradient* tvg_linear_gradient_new();
+TVG_API Tvg_Gradient* tvg_linear_gradient_new(void);
/*!
@@ -1734,7 +1734,7 @@ TVG_API Tvg_Gradient* tvg_linear_gradient_new();
*
* \return A new radial gradient object.
*/
-TVG_API Tvg_Gradient* tvg_radial_gradient_new();
+TVG_API Tvg_Gradient* tvg_radial_gradient_new(void);
/*!
@@ -1956,7 +1956,7 @@ TVG_API Tvg_Result tvg_gradient_del(Tvg_Gradient* grad);
*
* \return A new picture object.
*/
-TVG_API Tvg_Paint* tvg_picture_new();
+TVG_API Tvg_Paint* tvg_picture_new(void);
/*!
@@ -2063,7 +2063,7 @@ TVG_API Tvg_Result tvg_picture_get_size(const Tvg_Paint* paint, float* w, float*
*
* \return A new scene object.
*/
-TVG_API Tvg_Paint* tvg_scene_new();
+TVG_API Tvg_Paint* tvg_scene_new(void);
/*!
@@ -2141,7 +2141,7 @@ TVG_API Tvg_Result tvg_scene_clear(Tvg_Paint* scene, bool free);
*
* \return A new Tvg_Saver object.
*/
-TVG_API Tvg_Saver* tvg_saver_new();
+TVG_API Tvg_Saver* tvg_saver_new(void);
/*!
@@ -2223,7 +2223,7 @@ TVG_API Tvg_Result tvg_saver_del(Tvg_Saver* saver);
*
* \return Tvg_Animation A new Tvg_Animation object.
*/
-TVG_API Tvg_Animation* tvg_animation_new();
+TVG_API Tvg_Animation* tvg_animation_new(void);
/*!
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.c b/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.c
index 785220273..b185d3953 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.c
+++ b/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.c
@@ -6,7 +6,7 @@
/*********************
* INCLUDES
*********************/
-#include "lv_tiny_ttf.h"
+#include "../../lvgl.h"
#if LV_USE_TINY_TTF
@@ -194,7 +194,7 @@ static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * d
dsc_out->box_h = 0; /*height of the bitmap in [px]*/
dsc_out->ofs_x = 0; /*X offset of the bitmap in [pf]*/
dsc_out->ofs_y = 0; /*Y offset of the bitmap in [pf]*/
- dsc_out->bpp = 0;
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_NONE;
dsc_out->is_placeholder = false;
return true;
}
@@ -220,7 +220,7 @@ static bool ttf_get_glyph_dsc_cb(const lv_font_t * font, lv_font_glyph_dsc_t * d
dsc_out->box_h = (y2 - y1 + 1); /*height of the bitmap in [px]*/
dsc_out->ofs_x = x1; /*X offset of the bitmap in [pf]*/
dsc_out->ofs_y = -y2; /*Y offset of the bitmap measured from the as line*/
- dsc_out->bpp = 8; /*Bits per pixel: 1/2/4/8*/
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_A8;
dsc_out->is_placeholder = false;
return true; /*true: glyph found; false: glyph was not found*/
}
diff --git a/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h b/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h
index 3ad65219d..2966ade76 100644
--- a/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h
+++ b/lib/libesp32_lvgl/lvgl/src/libs/tiny_ttf/lv_tiny_ttf.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_TINY_TTF
diff --git a/lib/libesp32_lvgl/lvgl/src/lv_api_map.h b/lib/libesp32_lvgl/lvgl/src/lv_api_map_v8.h
similarity index 76%
rename from lib/libesp32_lvgl/lvgl/src/lv_api_map.h
rename to lib/libesp32_lvgl/lvgl/src/lv_api_map_v8.h
index b69504a4f..0b6da1ba1 100644
--- a/lib/libesp32_lvgl/lvgl/src/lv_api_map.h
+++ b/lib/libesp32_lvgl/lvgl/src/lv_api_map_v8.h
@@ -1,10 +1,10 @@
/**
- * @file lv_api_map.h
+ * @file lv_api_map_v8.h
*
*/
-#ifndef LV_API_MAP_H
-#define LV_API_MAP_H
+#ifndef LV_API_MAP_V8_H
+#define LV_API_MAP_V8_H
#ifdef __cplusplus
extern "C" {
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../lvgl.h"
+
+#include "misc/lv_types.h"
/*********************
* DEFINES
@@ -50,6 +51,8 @@ typedef lv_display_t lv_disp_t;
typedef lv_display_rotation_t lv_disp_rotation_t;
typedef lv_display_render_mode_t lv_disp_render_t;
typedef lv_anim_completed_cb_t lv_anim_ready_cb_t;
+typedef lv_screen_load_anim_t lv_scr_load_anim_t;
+typedef lv_buttonmatrix_ctrl_t lv_btnmatrix_ctrl_t;
/**********************
* GLOBAL PROTOTYPES
@@ -124,6 +127,8 @@ static inline void lv_obj_move_background(lv_obj_t * obj)
#define lv_disp_get_scr_act lv_display_get_screen_active
#define lv_disp_get_scr_prev lv_display_get_screen_prev
#define lv_disp_load_scr lv_screen_load
+#define lv_scr_load lv_screen_load
+#define lv_scr_load_anim lv_screen_load_anim
#define lv_disp_get_layer_top lv_display_get_layer_top
#define lv_disp_get_layer_sys lv_display_get_layer_sys
#define lv_disp_send_event lv_display_send_event
@@ -181,7 +186,7 @@ static inline void lv_obj_move_background(lv_obj_t * obj)
#define lv_btnmatrix_set_one_checked lv_buttonmatrix_set_one_checked
#define lv_btnmatrix_get_map lv_buttonmatrix_get_map
#define lv_btnmatrix_get_selected_btn lv_buttonmatrix_get_selected_button
-#define lv_btnmatrix_get_button_text lv_buttonmatrix_get_button_text
+#define lv_btnmatrix_get_btn_text lv_buttonmatrix_get_button_text
#define lv_btnmatrix_has_button_ctrl lv_buttonmatrix_has_button_ctrl
#define lv_btnmatrix_get_one_checked lv_buttonmatrix_get_one_checked
@@ -217,32 +222,41 @@ static inline void lv_obj_move_background(lv_obj_t * obj)
#define LV_STYLE_SHADOW_OFS_Y LV_STYLE_SHADOW_OFFSET_Y
#define LV_STYLE_TRANSFORM_ANGLE LV_STYLE_TRANSFORM_ROTATION
-#define lv_obj_get_style_anim_time lv_obj_get_style_anim_duration
-#define lv_obj_get_style_img_opa lv_obj_get_style_image_opa
-#define lv_obj_get_style_img_recolor lv_obj_get_style_image_recolor
-#define lv_obj_get_style_img_recolor_filtered lv_obj_get_style_image_recolor_filtered
-#define lv_obj_get_style_img_recolor_opa lv_obj_get_style_image_recolor_opa
-#define lv_obj_get_style_shadow_ofs_x lv_obj_get_style_shadow_offset_x
-#define lv_obj_get_style_shadow_ofs_y lv_obj_get_style_shadow_offset_y
-#define lv_obj_get_style_transform_angle lv_obj_get_style_transform_rotation
+#define lv_obj_get_style_anim_time lv_obj_get_style_anim_duration
+#define lv_obj_get_style_img_opa lv_obj_get_style_image_opa
+#define lv_obj_get_style_img_recolor lv_obj_get_style_image_recolor
+#define lv_obj_get_style_img_recolor_filtered lv_obj_get_style_image_recolor_filtered
+#define lv_obj_get_style_img_recolor_opa lv_obj_get_style_image_recolor_opa
+#define lv_obj_get_style_shadow_ofs_x lv_obj_get_style_shadow_offset_x
+#define lv_obj_get_style_shadow_ofs_y lv_obj_get_style_shadow_offset_y
+#define lv_obj_get_style_transform_angle lv_obj_get_style_transform_rotation
+#define lv_obj_get_style_bg_img_src lv_obj_get_style_bg_image_src
+#define lv_obj_get_style_bg_img_recolor lv_obj_get_style_bg_image_recolor
+#define lv_obj_get_style_bg_img_recolor_opa lv_obj_get_style_bg_image_recolor_opa
-#define lv_obj_set_style_anim_time lv_obj_set_style_anim_duration
-#define lv_obj_set_style_img_opa lv_obj_set_style_image_opa
-#define lv_obj_set_style_img_recolor lv_obj_set_style_image_recolor
-#define lv_obj_set_style_img_recolor_opa lv_obj_set_style_image_recolor_opa
-#define lv_obj_set_style_shadow_ofs_x lv_obj_set_style_shadow_offset_x
-#define lv_obj_set_style_shadow_ofs_y lv_obj_set_style_shadow_offset_y
-#define lv_obj_set_style_transform_zoom lv_obj_set_style_transform_scale
-#define lv_obj_set_style_transform_angle lv_obj_set_style_transform_rotation
+#define lv_obj_set_style_anim_time lv_obj_set_style_anim_duration
+#define lv_obj_set_style_img_opa lv_obj_set_style_image_opa
+#define lv_obj_set_style_img_recolor lv_obj_set_style_image_recolor
+#define lv_obj_set_style_img_recolor_opa lv_obj_set_style_image_recolor_opa
+#define lv_obj_set_style_shadow_ofs_x lv_obj_set_style_shadow_offset_x
+#define lv_obj_set_style_shadow_ofs_y lv_obj_set_style_shadow_offset_y
+#define lv_obj_set_style_transform_zoom lv_obj_set_style_transform_scale
+#define lv_obj_set_style_transform_angle lv_obj_set_style_transform_rotation
+#define lv_obj_set_style_bg_img_src lv_obj_set_style_bg_image_src
+#define lv_obj_set_style_bg_img_recolor lv_obj_set_style_bg_image_recolor
+#define lv_obj_set_style_bg_img_recolor_opa lv_obj_set_style_bg_image_recolor_opa
-#define lv_style_set_anim_time lv_style_set_anim_duration
-#define lv_style_set_img_opa lv_style_set_image_opa
-#define lv_style_set_img_recolor lv_style_set_image_recolor
-#define lv_style_set_img_recolor_opa lv_style_set_image_recolor_opa
-#define lv_style_set_shadow_ofs_x lv_style_set_shadow_offset_x
-#define lv_style_set_shadow_ofs_y lv_style_set_shadow_offset_y
-#define lv_style_set_transform_angle lv_style_set_transform_rotation
-#define lv_style_set_transform_zoom lv_style_set_transform_scale
+#define lv_style_set_anim_time lv_style_set_anim_duration
+#define lv_style_set_img_opa lv_style_set_image_opa
+#define lv_style_set_img_recolor lv_style_set_image_recolor
+#define lv_style_set_img_recolor_opa lv_style_set_image_recolor_opa
+#define lv_style_set_shadow_ofs_x lv_style_set_shadow_offset_x
+#define lv_style_set_shadow_ofs_y lv_style_set_shadow_offset_y
+#define lv_style_set_transform_angle lv_style_set_transform_rotation
+#define lv_style_set_transform_zoom lv_style_set_transform_scale
+#define lv_style_set_bg_img_src lv_style_set_bg_image_src
+#define lv_style_set_bg_img_recolor lv_style_set_bg_image_recolor
+#define lv_style_set_bg_img_recolor_opa lv_style_set_bg_image_recolor_opa
#define LV_ZOOM_NONE LV_SCALE_NONE
@@ -263,4 +277,4 @@ static inline void lv_obj_move_background(lv_obj_t * obj)
} /*extern "C"*/
#endif
-#endif /*LV_API_MAP_H*/
+#endif /*LV_API_MAP_V8_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/lv_api_map_v9_0.h b/lib/libesp32_lvgl/lvgl/src/lv_api_map_v9_0.h
new file mode 100644
index 000000000..3992844e9
--- /dev/null
+++ b/lib/libesp32_lvgl/lvgl/src/lv_api_map_v9_0.h
@@ -0,0 +1,52 @@
+/**
+ * @file lv_api_map_v9_0.h
+ *
+ */
+
+#ifndef LV_API_MAP_V9_0_H
+#define LV_API_MAP_V9_0_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*********************
+ * INCLUDES
+ *********************/
+#include "misc/lv_types.h"
+
+/*********************
+ * DEFINES
+ *********************/
+
+/**********************
+ * TYPEDEFS
+ **********************/
+
+/**********************
+ * GLOBAL PROTOTYPES
+ **********************/
+
+/**********************
+ * MACROS
+ **********************/
+#define lv_image_set_align lv_image_set_inner_align
+#define lv_image_get_align lv_image_get_inner_align
+
+#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE
+#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE
+#endif
+
+/**********************
+ * MACROS
+ **********************/
+
+/**********************
+ * DEPRECATED FUNCTIONS
+ **********************/
+
+#ifdef __cplusplus
+} /*extern "C"*/
+#endif
+
+#endif /*LV_API_MAP_V9_0_H*/
diff --git a/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h b/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h
index 2fff711cf..d6d7fd0d8 100644
--- a/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h
+++ b/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h
@@ -73,6 +73,11 @@
* Start parsing lv_conf_template.h
-----------------------------------*/
+/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */
+#if 0 && defined(__ASSEMBLY__)
+#include "my_include.h"
+#endif
+
/*====================
COLOR SETTINGS
*====================*/
@@ -164,7 +169,7 @@
#endif
#endif
#endif
-#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/
+#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/
/*====================
HAL SETTINGS
@@ -244,6 +249,20 @@
#endif
#endif
+/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
+ * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
+ * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
+ * and can't be drawn in chunks. */
+
+/*The target buffer size for simple layer chunks.*/
+#ifndef LV_DRAW_LAYER_SIMPLE_BUF_SIZE
+ #ifdef CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE
+ #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE
+ #else
+ #define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
+ #endif
+#endif
+
#ifndef LV_USE_DRAW_SW
#ifdef _LV_KCONFIG_PRESENT
#ifdef CONFIG_LV_USE_DRAW_SW
@@ -280,20 +299,15 @@
#endif
#endif
- /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
- * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
- * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
- * and can't be drawn in chunks. */
-
- /*The target buffer size for simple layer chunks.*/
- #ifndef LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE
- #ifdef CONFIG_LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE
- #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE CONFIG_LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE
+ /* Enable native helium assembly to be compiled */
+ #ifndef LV_USE_NATIVE_HELIUM_ASM
+ #ifdef CONFIG_LV_USE_NATIVE_HELIUM_ASM
+ #define LV_USE_NATIVE_HELIUM_ASM CONFIG_LV_USE_NATIVE_HELIUM_ASM
#else
- #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
+ #define LV_USE_NATIVE_HELIUM_ASM 0
#endif
#endif
-
+
/* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only
* 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */
#ifndef LV_DRAW_SW_COMPLEX
@@ -462,6 +476,37 @@
#endif
#endif
+/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */
+#ifndef LV_VG_LITE_FLUSH_MAX_COUNT
+ #ifdef CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT
+ #define LV_VG_LITE_FLUSH_MAX_COUNT CONFIG_LV_VG_LITE_FLUSH_MAX_COUNT
+ #else
+ #define LV_VG_LITE_FLUSH_MAX_COUNT 8
+ #endif
+#endif
+
+/* Enable border to simulate shadow
+ * NOTE: which usually improves performance,
+ * but does not guarantee the same rendering quality as the software. */
+#ifndef LV_VG_LITE_USE_BOX_SHADOW
+ #ifdef CONFIG_LV_VG_LITE_USE_BOX_SHADOW
+ #define LV_VG_LITE_USE_BOX_SHADOW CONFIG_LV_VG_LITE_USE_BOX_SHADOW
+ #else
+ #define LV_VG_LITE_USE_BOX_SHADOW 0
+ #endif
+#endif
+
+/* VG-Lite gradient image maximum cache number.
+ * NOTE: The memory usage of a single gradient image is 4K bytes.
+ */
+#ifndef LV_VG_LITE_GRAD_CACHE_SIZE
+ #ifdef CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE
+ #define LV_VG_LITE_GRAD_CACHE_SIZE CONFIG_LV_VG_LITE_GRAD_CACHE_SIZE
+ #else
+ #define LV_VG_LITE_GRAD_CACHE_SIZE 32
+ #endif
+#endif
+
#endif
/*=======================
@@ -880,6 +925,15 @@
#endif
#endif
+ /*Buffer address alignment*/
+ #ifndef LV_VG_LITE_THORVG_BUF_ADDR_ALIGN
+ #ifdef CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN
+ #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN CONFIG_LV_VG_LITE_THORVG_BUF_ADDR_ALIGN
+ #else
+ #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64
+ #endif
+ #endif
+
/*Enable multi-thread render*/
#ifndef LV_VG_LITE_THORVG_THREAD_RENDER
#ifdef CONFIG_LV_VG_LITE_THORVG_THREAD_RENDER
@@ -2097,6 +2151,24 @@
#endif
#endif
+/*API for LittleFs. */
+#ifndef LV_USE_FS_LITTLEFS
+ #ifdef CONFIG_LV_USE_FS_LITTLEFS
+ #define LV_USE_FS_LITTLEFS CONFIG_LV_USE_FS_LITTLEFS
+ #else
+ #define LV_USE_FS_LITTLEFS 0
+ #endif
+#endif
+#if LV_USE_FS_LITTLEFS
+ #ifndef LV_FS_LITTLEFS_LETTER
+ #ifdef CONFIG_LV_FS_LITTLEFS_LETTER
+ #define LV_FS_LITTLEFS_LETTER CONFIG_LV_FS_LITTLEFS_LETTER
+ #else
+ #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+ #endif
+ #endif
+#endif
+
/*LODEPNG decoder library*/
#ifndef LV_USE_LODEPNG
#ifdef CONFIG_LV_USE_LODEPNG
@@ -2209,15 +2281,6 @@
#endif
#endif
#if LV_USE_FREETYPE
- /*Memory used by FreeType to cache characters in kilobytes*/
- #ifndef LV_FREETYPE_CACHE_SIZE
- #ifdef CONFIG_LV_FREETYPE_CACHE_SIZE
- #define LV_FREETYPE_CACHE_SIZE CONFIG_LV_FREETYPE_CACHE_SIZE
- #else
- #define LV_FREETYPE_CACHE_SIZE 768
- #endif
- #endif
-
/*Let FreeType to use LVGL memory and file porting*/
#ifndef LV_FREETYPE_USE_LVGL_PORT
#ifdef CONFIG_LV_FREETYPE_USE_LVGL_PORT
@@ -2227,22 +2290,8 @@
#endif
#endif
- /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
- /* (0:use system defaults) */
- #ifndef LV_FREETYPE_CACHE_FT_FACES
- #ifdef CONFIG_LV_FREETYPE_CACHE_FT_FACES
- #define LV_FREETYPE_CACHE_FT_FACES CONFIG_LV_FREETYPE_CACHE_FT_FACES
- #else
- #define LV_FREETYPE_CACHE_FT_FACES 8
- #endif
- #endif
- #ifndef LV_FREETYPE_CACHE_FT_SIZES
- #ifdef CONFIG_LV_FREETYPE_CACHE_FT_SIZES
- #define LV_FREETYPE_CACHE_FT_SIZES CONFIG_LV_FREETYPE_CACHE_FT_SIZES
- #else
- #define LV_FREETYPE_CACHE_FT_SIZES 8
- #endif
- #endif
+ /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached.
+ *The higher the value, the more memory will be used.*/
#ifndef LV_FREETYPE_CACHE_FT_GLYPH_CNT
#ifdef CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT
#define LV_FREETYPE_CACHE_FT_GLYPH_CNT CONFIG_LV_FREETYPE_CACHE_FT_GLYPH_CNT
@@ -2307,15 +2356,6 @@
#endif
#endif
-/*Enable LZ4 compress/decompress lib*/
-#ifndef LV_USE_LZ4
- #ifdef CONFIG_LV_USE_LZ4
- #define LV_USE_LZ4 CONFIG_LV_USE_LZ4
- #else
- #define LV_USE_LZ4 0
- #endif
-#endif
-
/*Use lvgl built-in LZ4 lib*/
#ifndef LV_USE_LZ4_INTERNAL
#ifdef CONFIG_LV_USE_LZ4_INTERNAL
@@ -2414,7 +2454,7 @@
#endif
/*1: Show the used memory and the memory fragmentation
- * Requires `LV_USE_BUILTIN_MALLOC = 1`
+ * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN`
* Requires `LV_USE_SYSMON = 1`*/
#ifndef LV_USE_MEM_MONITOR
#ifdef CONFIG_LV_USE_MEM_MONITOR
@@ -2668,14 +2708,14 @@
#ifdef CONFIG_LV_SDL_INCLUDE_PATH
#define LV_SDL_INCLUDE_PATH CONFIG_LV_SDL_INCLUDE_PATH
#else
- #define LV_SDL_INCLUDE_PATH
+ #define LV_SDL_INCLUDE_PATH
#endif
#endif
#ifndef LV_SDL_RENDER_MODE
#ifdef CONFIG_LV_SDL_RENDER_MODE
#define LV_SDL_RENDER_MODE CONFIG_LV_SDL_RENDER_MODE
#else
- #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
+ #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
#endif
#endif
#ifndef LV_SDL_BUF_COUNT
@@ -2686,14 +2726,14 @@
#define LV_SDL_BUF_COUNT 0
#endif
#else
- #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
+ #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
#endif
#endif
#ifndef LV_SDL_FULLSCREEN
#ifdef CONFIG_LV_SDL_FULLSCREEN
#define LV_SDL_FULLSCREEN CONFIG_LV_SDL_FULLSCREEN
#else
- #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
+ #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
#endif
#endif
#ifndef LV_SDL_DIRECT_EXIT
@@ -2704,7 +2744,14 @@
#define LV_SDL_DIRECT_EXIT 0
#endif
#else
- #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #endif
+ #endif
+ #ifndef LV_SDL_MOUSEWHEEL_MODE
+ #ifdef CONFIG_LV_SDL_MOUSEWHEEL_MODE
+ #define LV_SDL_MOUSEWHEEL_MODE CONFIG_LV_SDL_MOUSEWHEEL_MODE
+ #else
+ #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/
#endif
#endif
#endif
@@ -2897,6 +2944,44 @@
#endif
#endif
+/*Driver for libinput input devices*/
+#ifndef LV_USE_LIBINPUT
+ #ifdef CONFIG_LV_USE_LIBINPUT
+ #define LV_USE_LIBINPUT CONFIG_LV_USE_LIBINPUT
+ #else
+ #define LV_USE_LIBINPUT 0
+ #endif
+#endif
+
+#if LV_USE_LIBINPUT
+ #ifndef LV_LIBINPUT_BSD
+ #ifdef CONFIG_LV_LIBINPUT_BSD
+ #define LV_LIBINPUT_BSD CONFIG_LV_LIBINPUT_BSD
+ #else
+ #define LV_LIBINPUT_BSD 0
+ #endif
+ #endif
+
+ /*Full keyboard support*/
+ #ifndef LV_LIBINPUT_XKB
+ #ifdef CONFIG_LV_LIBINPUT_XKB
+ #define LV_LIBINPUT_XKB CONFIG_LV_LIBINPUT_XKB
+ #else
+ #define LV_LIBINPUT_XKB 0
+ #endif
+ #endif
+ #if LV_LIBINPUT_XKB
+ /*"setxkbmap -query" can help find the right values for your keyboard*/
+ #ifndef LV_LIBINPUT_XKB_KEY_MAP
+ #ifdef CONFIG_LV_LIBINPUT_XKB_KEY_MAP
+ #define LV_LIBINPUT_XKB_KEY_MAP CONFIG_LV_LIBINPUT_XKB_KEY_MAP
+ #else
+ #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL }
+ #endif
+ #endif
+ #endif
+#endif
+
/*Drivers for LCD devices connected via SPI/parallel port*/
#ifndef LV_USE_ST7735
#ifdef CONFIG_LV_USE_ST7735
@@ -2973,15 +3058,6 @@
#define LV_USE_DEMO_WIDGETS 0
#endif
#endif
-#if LV_USE_DEMO_WIDGETS
- #ifndef LV_DEMO_WIDGETS_SLIDESHOW
- #ifdef CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
- #define LV_DEMO_WIDGETS_SLIDESHOW CONFIG_LV_DEMO_WIDGETS_SLIDESHOW
- #else
- #define LV_DEMO_WIDGETS_SLIDESHOW 0
- #endif
- #endif
-#endif
/*Demonstrate the usage of encoder and keyboard*/
#ifndef LV_USE_DEMO_KEYPAD_AND_ENCODER
@@ -3136,6 +3212,13 @@ LV_EXPORT_CONST_INT(LV_DRAW_BUF_ALIGN);
#define LV_LOG_TRACE_ANIM 0
#endif /*LV_USE_LOG*/
+#ifndef LV_USE_LZ4
+ #define LV_USE_LZ4 (LV_USE_LZ4_INTERNAL || LV_USE_LZ4_EXTERNAL)
+#endif
+
+#ifndef LV_USE_THORVG
+ #define LV_USE_THORVG (LV_USE_THORVG_INTERNAL || LV_USE_THORVG_EXTERNAL)
+#endif
/*If running without lv_conf.h add typedefs with default value*/
#ifdef LV_CONF_SKIP
diff --git a/lib/libesp32_lvgl/lvgl/src/lv_conf_kconfig.h b/lib/libesp32_lvgl/lvgl/src/lv_conf_kconfig.h
index c5c971d4d..7f7cbcb0c 100644
--- a/lib/libesp32_lvgl/lvgl/src/lv_conf_kconfig.h
+++ b/lib/libesp32_lvgl/lvgl/src/lv_conf_kconfig.h
@@ -223,6 +223,18 @@ extern "C" {
# define CONFIG_LV_BIDI_BASE_DIR_DEF LV_BASE_DIR_AUTO
#endif
+/*------------------
+ * SDL
+ *-----------------*/
+
+#ifdef CONFIG_LV_SDL_RENDER_MODE_PARTIAL
+# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_PARTIAL
+#elif defined(CONFIG_LV_SDL_RENDER_MODE_DIRECT)
+# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT
+#elif defined(CONFIG_LV_SDL_RENDER_MODE_FULL)
+# define CONFIG_LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_FULL
+#endif
+
/*------------------
* LINUX FBDEV
*-----------------*/
diff --git a/lib/libesp32_lvgl/lvgl/src/lv_init.c b/lib/libesp32_lvgl/lvgl/src/lv_init.c
index eb36021f1..cb4f23c85 100644
--- a/lib/libesp32_lvgl/lvgl/src/lv_init.c
+++ b/lib/libesp32_lvgl/lvgl/src/lv_init.c
@@ -93,7 +93,6 @@ static inline void lv_global_init(lv_global_t * global)
global->style_refresh = true;
global->layout_count = _LV_LAYOUT_LAST;
global->style_last_custom_prop_id = (uint32_t)_LV_STYLE_LAST_BUILT_IN_PROP;
- global->area_trans_cache.angle_prev = INT32_MIN;
global->event_last_register_id = _LV_EVENT_LAST;
lv_rand_set_seed(0x1234ABCD);
@@ -265,6 +264,10 @@ void lv_init(void)
lv_fs_memfs_init();
#endif
+#if LV_USE_FS_LITTLEFS
+ lv_fs_littlefs_init();
+#endif
+
#if LV_USE_LODEPNG
lv_lodepng_init();
#endif
@@ -291,14 +294,10 @@ void lv_init(void)
lv_ffmpeg_init();
#endif
-// #if LV_USE_FREETYPE
-// /*Init freetype library*/
-// # if LV_FREETYPE_CACHE_SIZE >= 0
-// lv_freetype_init(LV_FREETYPE_CACHE_FT_FACES, LV_FREETYPE_CACHE_FT_SIZES, LV_FREETYPE_CACHE_SIZE);
-// # else
-// lv_freetype_init(0, 0, 0);
-// # endif
-// #endif
+#if LV_USE_FREETYPE
+ /*Init freetype library*/
+ lv_freetype_init(LV_FREETYPE_CACHE_FT_GLYPH_CNT);
+#endif
#if LV_USE_TINY_TTF
lv_tiny_ttf_init();
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/_lv_cache_lru_rb.c b/lib/libesp32_lvgl/lvgl/src/misc/cache/_lv_cache_lru_rb.c
index 18fcc5cc4..097f764f0 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/_lv_cache_lru_rb.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/_lv_cache_lru_rb.c
@@ -3,6 +3,43 @@
*
*/
+/***************************************************************************\
+* *
+* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┓ *
+* ┏ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ┌ ─ ─ ─ ┐ *
+* ┌ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ Cache insert ┃ *
+* ┃ RB Tree │ │Hitting│ head *
+* └ ─ ─ ─ ─ ─ ─ ─ ┃ ┃ ─ ─ ─ ─ ┃ *
+* ┃ ┌─┬─┬─┬─┐ ┌─────┐ *
+* ┌──│◄│B│►│ │─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┃─ ─ ╋ ─ ─▶│ B │ ┃ *
+* ┃ │ └─┴─┴─┴─┘ └──▲──┘ *
+* │ │ ┃ ┃ │ ┃ *
+* ┃ │ │ ┌──┴──┐ *
+* │ └──────┐ ┌ ─┃─ ─ ╋ ─ ─▶│ E │ ┃ *
+* ┃ ▼ ┌ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ └──▲──┘ *
+* ┌─┬─┬─┬─┐ ▼ │ ┃ ┃ │ ┃ *
+* ┃│◄│A│►│ │─ ─ ┘ ┌─┬─┬─┬─┐ │ ┌──┴──┐ *
+* └─┴─┴─┴─┘ ┌───│◄│D│►│ │─ ─ ─ ─ ─ ─│─ ╋ ┐ ┃ ─ ▶│ A │ ┌ ─ ─ ─ ─ ─ ┐ ┃ *
+* ┃ │ └─┴─┴─┴─┘ └──▲──┘ LRU *
+* │ │ │ ┃ │ ┃ │ │ Cache │ ┃ *
+* ┃ ▼ └──────┐ ┌──┴──┐ ─ ─ ─ ─ ─ ─ *
+* ┌─┬─┬─┬─┐ ▼ │ ┃ └ ─┃─ ─ ▶│ D │ ┃ *
+* ┃ │◄│C│►│ │─ ─ ┌─┬─┬─┬─┐ └──▲──┘ *
+* └─┴─┴─┴─┘ │ │◄│E│►│ │─ ┘ ┃ ┃ │ ┃ *
+* ┃ └─┴─┴─┴─┘ ┌──┴──┐ *
+* │ │ ─ ╋ ─ ─┃─ ─ ▶│ C │ ┃ *
+* ┃ ─ ─ ─ ─ ┼ ─ ─ ┘ └──▲──┘ *
+* ▼ ┃ ┃ ┌ ─ ─│─ ─ ┐ ┃ *
+* ┃ ┌─┬─┬─┬─┐ ┌──┴──┐ *
+* │◄│F│►│ │─ ─┃─ ─ ╋ ─ ┼▶│ F │ │ ┃ *
+* ┃ └─┴─┴─┴─┘ └─────┘ *
+* ┃ ┃ └ ─ ─ ─ ─ ┘ ┃ *
+* ┃ remove *
+* ┃ ┃ tail ┃ *
+* ┗ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ ━ *
+* *
+\***************************************************************************/
+
/*********************
* INCLUDES
*********************/
@@ -44,6 +81,9 @@ static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * us
static void remove_cb(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data);
static void drop_cb(lv_cache_t * cache, const void * key, void * user_data);
static void drop_all_cb(lv_cache_t * cache, void * user_data);
+static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data);
+static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size,
+ void * user_data);
static void * alloc_new_node(lv_lru_rb_t_ * lru, void * key, void * user_data);
inline static void ** get_lru_node(lv_lru_rb_t_ * lru, lv_rb_node_t * node);
@@ -63,7 +103,9 @@ const lv_cache_class_t lv_cache_class_lru_rb_count = {
.add_cb = add_cb,
.remove_cb = remove_cb,
.drop_cb = drop_cb,
- .drop_all_cb = drop_all_cb
+ .drop_all_cb = drop_all_cb,
+ .get_victim_cb = get_victim_cb,
+ .reserve_cond_cb = reserve_cond_cb
};
const lv_cache_class_t lv_cache_class_lru_rb_size = {
@@ -75,7 +117,9 @@ const lv_cache_class_t lv_cache_class_lru_rb_size = {
.add_cb = add_cb,
.remove_cb = remove_cb,
.drop_cb = drop_cb,
- .drop_all_cb = drop_all_cb
+ .drop_all_cb = drop_all_cb,
+ .get_victim_cb = get_victim_cb,
+ .reserve_cond_cb = reserve_cond_cb
};
/**********************
* STATIC VARIABLES
@@ -161,13 +205,13 @@ static bool init_cnt_cb(lv_cache_t * cache)
/*add void* to store the ll node pointer*/
if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) {
- return NULL;
+ return false;
}
_lv_ll_init(&lru->ll, sizeof(void *));
lru->get_data_size_cb = cnt_get_data_size_cb;
- return lru;
+ return true;
}
static bool init_size_cb(lv_cache_t * cache)
@@ -185,13 +229,13 @@ static bool init_size_cb(lv_cache_t * cache)
/*add void* to store the ll node pointer*/
if(!lv_rb_init(&lru->rb, lru->cache.ops.compare_cb, lv_cache_entry_get_size(lru->cache.node_size) + sizeof(void *))) {
- return NULL;
+ return false;
}
_lv_ll_init(&lru->ll, sizeof(void *));
lru->get_data_size_cb = size_get_data_size_cb;
- return lru;
+ return true;
}
static void destroy_cb(lv_cache_t * cache, void * user_data)
@@ -259,34 +303,6 @@ static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * us
return NULL;
}
- uint32_t data_size = lru->get_data_size_cb(key);
- if(data_size > lru->cache.max_size) {
- LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size,
- (uint32_t)lru->cache.max_size);
- return NULL;
- }
-
- void * tail = _lv_ll_get_tail(&lru->ll);
- void * curr = tail;
- while(cache->size + data_size > lru->cache.max_size) {
- if(curr == NULL) {
- LV_LOG_ERROR("failed to drop cache");
- return NULL;
- }
-
- lv_rb_node_t * tail_node = *(lv_rb_node_t **)curr;
- void * search_key = tail_node->data;
- lv_cache_entry_t * entry = lv_cache_entry_get_entry(search_key, cache->node_size);
- if(lv_cache_entry_get_ref(entry) == 0) {
- cache->clz->drop_cb(cache, search_key, user_data);
- curr = _lv_ll_get_tail(&lru->ll);
- continue;
- }
-
- curr = _lv_ll_get_prev(&lru->ll, curr);
- }
-
- /*cache miss*/
lv_rb_node_t * new_node = alloc_new_node(lru, (void *)key, user_data);
if(new_node == NULL) {
return NULL;
@@ -294,7 +310,7 @@ static lv_cache_entry_t * add_cb(lv_cache_t * cache, const void * key, void * us
lv_cache_entry_t * entry = lv_cache_entry_get_entry(new_node->data, cache->node_size);
- cache->size += data_size;
+ cache->size += lru->get_data_size_cb(key);
return entry;
}
@@ -377,7 +393,7 @@ static void drop_all_cb(lv_cache_t * cache, void * user_data)
lru->cache.ops.free_cb(search_key, user_data);
}
else {
- LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", entry, lv_cache_entry_get_ref(entry));
+ LV_LOG_WARN("entry (%p) is still referenced (%" LV_PRId32 ")", (void *)entry, lv_cache_entry_get_ref(entry));
used_cnt++;
}
}
@@ -391,6 +407,50 @@ static void drop_all_cb(lv_cache_t * cache, void * user_data)
cache->size = 0;
}
+static lv_cache_entry_t * get_victim_cb(lv_cache_t * cache, void * user_data)
+{
+ LV_UNUSED(user_data);
+
+ lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache;
+
+ LV_ASSERT_NULL(lru);
+
+ lv_rb_node_t ** tail;
+ _LV_LL_READ_BACK(&lru->ll, tail) {
+ lv_rb_node_t * tail_node = *tail;
+ lv_cache_entry_t * entry = lv_cache_entry_get_entry(tail_node->data, cache->node_size);
+ if(lv_cache_entry_get_ref(entry) == 0) {
+ return entry;
+ }
+ }
+
+ return NULL;
+}
+
+static lv_cache_reserve_cond_res_t reserve_cond_cb(lv_cache_t * cache, const void * key, size_t reserved_size,
+ void * user_data)
+{
+ LV_UNUSED(user_data);
+
+ lv_lru_rb_t_ * lru = (lv_lru_rb_t_ *)cache;
+
+ LV_ASSERT_NULL(lru);
+
+ if(lru == NULL) {
+ return LV_CACHE_RESERVE_COND_ERROR;
+ }
+
+ uint32_t data_size = key ? lru->get_data_size_cb(key) : 0;
+ if(data_size > lru->cache.max_size) {
+ LV_LOG_ERROR("data size (%" LV_PRIu32 ") is larger than max size (%" LV_PRIu32 ")", data_size, lru->cache.max_size);
+ return LV_CACHE_RESERVE_COND_TOO_LARGE;
+ }
+
+ return cache->size + reserved_size + data_size > lru->cache.max_size
+ ? LV_CACHE_RESERVE_COND_NEED_VICTIM
+ : LV_CACHE_RESERVE_COND_OK;
+}
+
static uint32_t cnt_get_data_size_cb(const void * data)
{
LV_UNUSED(data);
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.c b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.c
index 46abe430c..e22cd9e42 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.c
@@ -23,6 +23,8 @@
* STATIC PROTOTYPES
**********************/
static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data);
+static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data);
+static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data);
/**********************
* GLOBAL VARIABLES
**********************/
@@ -106,11 +108,12 @@ lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * use
LV_ASSERT_NULL(key);
lv_mutex_lock(&cache->lock);
- lv_cache_entry_t * entry = cache->clz->add_cb(cache, key, user_data);
+ lv_cache_entry_t * entry = cache_add_internal_no_lock(cache, key, user_data);
if(entry != NULL) {
lv_cache_entry_acquire_data(entry);
}
lv_mutex_unlock(&cache->lock);
+
return entry;
}
lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data)
@@ -125,7 +128,7 @@ lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * k
lv_mutex_unlock(&cache->lock);
return entry;
}
- entry = cache->clz->add_cb(cache, key, user_data);
+ entry = cache_add_internal_no_lock(cache, key, user_data);
if(entry == NULL) {
lv_mutex_unlock(&cache->lock);
return NULL;
@@ -142,6 +145,16 @@ lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * k
lv_mutex_unlock(&cache->lock);
return entry;
}
+void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data)
+{
+ LV_ASSERT_NULL(cache);
+
+ for(lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data);
+ reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM;
+ reserve_cond_res = cache->clz->reserve_cond_cb(cache, NULL, reserved_size, user_data))
+ cache_evict_one_internal_no_lock(cache, user_data);
+
+}
void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data)
{
LV_ASSERT_NULL(cache);
@@ -151,6 +164,16 @@ void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data)
cache_drop_internal_no_lock(cache, key, user_data);
lv_mutex_unlock(&cache->lock);
}
+bool lv_cache_evict_one(lv_cache_t * cache, void * user_data)
+{
+ LV_ASSERT_NULL(cache);
+
+ lv_mutex_lock(&cache->lock);
+ bool res = cache_evict_one_internal_no_lock(cache, user_data);
+ lv_mutex_unlock(&cache->lock);
+
+ return res;
+}
void lv_cache_drop_all(lv_cache_t * cache, void * user_data)
{
LV_ASSERT_NULL(cache);
@@ -195,9 +218,11 @@ void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void *
LV_UNUSED(user_data);
cache->ops.free_cb = free_cb;
}
+
/**********************
* STATIC FUNCTIONS
**********************/
+
static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data)
{
lv_cache_entry_t * entry = cache->clz->get_cb(cache, key, user_data);
@@ -215,3 +240,36 @@ static void cache_drop_internal_no_lock(lv_cache_t * cache, const void * key, vo
cache->clz->remove_cb(cache, entry, user_data);
}
}
+
+static bool cache_evict_one_internal_no_lock(lv_cache_t * cache, void * user_data)
+{
+ lv_cache_entry_t * victim = cache->clz->get_victim_cb(cache, user_data);
+
+ if(victim == NULL) {
+ LV_LOG_ERROR("No victim found");
+ return false;
+ }
+
+ cache->clz->remove_cb(cache, victim, user_data);
+ cache->ops.free_cb(lv_cache_entry_get_data(victim), user_data);
+ lv_cache_entry_delete(victim);
+ return true;
+}
+
+static lv_cache_entry_t * cache_add_internal_no_lock(lv_cache_t * cache, const void * key, void * user_data)
+{
+ lv_cache_reserve_cond_res_t reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data);
+ if(reserve_cond_res == LV_CACHE_RESERVE_COND_TOO_LARGE) {
+ LV_LOG_ERROR("data %p is too large that exceeds max size (%" LV_PRIu32 ")", key, cache->max_size);
+ return NULL;
+ }
+
+ for(; reserve_cond_res == LV_CACHE_RESERVE_COND_NEED_VICTIM;
+ reserve_cond_res = cache->clz->reserve_cond_cb(cache, key, 0, user_data))
+ if(cache_evict_one_internal_no_lock(cache, user_data) == false)
+ return NULL;
+
+ lv_cache_entry_t * entry = cache->clz->add_cb(cache, key, user_data);
+
+ return entry;
+}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.h b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.h
index c79a00e76..25db6fce4 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache.h
@@ -32,25 +32,164 @@ extern "C" {
/**********************
* GLOBAL PROTOTYPES
**********************/
+
+/**
+ * Create a cache object with the given parameters.
+ * @param cache_class The class of the cache. Currently only support one two builtin classes:
+ * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy.
+ * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy.
+ * @param node_size The node size is the size of the data stored in the cache..
+ * @param max_size The max size is the maximum amount of memory or count that the cache can hold.
+ * @lv_cache_class_lru_rb_count: max_size is the maximum count of nodes in the cache.
+ * @lv_cache_class_lru_rb_size: max_size is the maximum size of the cache in bytes.
+ * @param ops A set of operations that can be performed on the cache. See @lv_cache_ops_t for details.
+ * @return Returns a pointer to the created cache object on success, @NULL on error.
+ */
lv_cache_t * lv_cache_create(const lv_cache_class_t * cache_class,
size_t node_size, size_t max_size,
lv_cache_ops_t ops);
+
+/**
+ * Destroy a cache object.
+ * @param cache The cache object pointer to destroy.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
void lv_cache_destroy(lv_cache_t * cache, void * user_data);
+/**
+ * Acquire a cache entry with the given key. If the entry is not in the cache, it will return @NULL as it is not found.
+ * If the entry is found, it's priority will be changed by the cache's policy. And the @lv_entry_t::ref count will be incremented.
+ * @param cache The cache object pointer to acquire the entry.
+ * @param key The key of the entry to acquire.
+ * @param user_data A user data pointer that will be passed to the create callback.
+ * @return Returns a pointer to the acquired cache entry on success with @lv_entry_t::ref count incremented, @NULL on error.
+ */
lv_cache_entry_t * lv_cache_acquire(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * Acquire a cache entry with the given key. If the entry is not in the cache, it will create a new entry with the given key.
+ * If the entry is found, it's priority will be changed by the cache's policy. And the @lv_entry_t::ref count will be incremented.
+ * If you want to use this API to simplify the code, you should provide a @lv_cache_ops_t::create_cb that creates a new entry with the given key.
+ * This API is a combination of @lv_cache_acquire and @lv_cache_add. The effect is the same as calling @lv_cache_acquire and @lv_cache_add separately.
+ * And the internal impact on cache is also consistent with these two APIs.
+ * @param cache The cache object pointer to acquire the entry.
+ * @param key The key of the entry to acquire or create.
+ * @param user_data A user data pointer that will be passed to the create callback.
+ * @return Returns a pointer to the acquired or created cache entry on success with @lv_entry_t::ref count incremented, @NULL on error.
+ */
lv_cache_entry_t * lv_cache_acquire_or_create(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * Add a new cache entry with the given key and data. If the cache is full, the cache's policy will be used to evict an entry.
+ * @param cache The cache object pointer to add the entry.
+ * @param key The key of the entry to add.
+ * @param user_data A user data pointer that will be passed to the create callback.
+ * @return Returns a pointer to the added cache entry on success with @lv_entry_t::ref count incremented, @NULL on error.
+ */
lv_cache_entry_t * lv_cache_add(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * Release a cache entry. The @lv_entry_t::ref count will be decremented. If the @lv_entry_t::ref count is zero, it will issue an error.
+ * If the entry passed to this function is the last reference to the data and the entry is marked as invalid, the cache's policy will be used to evict the entry.
+ * @param cache The cache object pointer to release the entry.
+ * @param entry The cache entry pointer to release.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
void lv_cache_release(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data);
+
+/**
+ * Reserve a certain amount of memory/count in the cache. This function is useful when you want to reserve a certain amount of memory/count in advance,
+ * for example, when you know that you will need it later.
+ * When the current cache size is max than the reserved size, the function will evict entries until the reserved size is reached.
+ * @param cache The cache object pointer to reserve.
+ * @param reserved_size The amount of memory/count to reserve.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
+void lv_cache_reserve(lv_cache_t * cache, uint32_t reserved_size, void * user_data);
+
+/**
+ * Drop a cache entry with the given key. If the entry is not in the cache, nothing will happen to it.
+ * If the entry is found, it will be removed from the cache and its data will be freed when the last reference to it is released.
+ * @note The data will not be freed immediately but when the last reference to it is released. But this entry will not be found by @lv_cache_acquire.
+ * If you want cache a same key again, you should use @lv_cache_add or @lv_cache_acquire_or_create.
+ * @param cache The cache object pointer to drop the entry.
+ * @param key The key of the entry to drop.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
void lv_cache_drop(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * Drop all cache entries. All entries will be removed from the cache and their data will be freed when the last reference to them is released.
+ * @note If some entries are still referenced by other objects, it will issue an error. And this case shouldn't happen in normal cases..
+ * @param cache The cache object pointer to drop all entries.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
void lv_cache_drop_all(lv_cache_t * cache, void * user_data);
-void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data);
+/**
+ * Evict one entry from the cache. The eviction policy will be used to select the entry to evict.
+ * @param cache The cache object pointer to evict an entry.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ * @return Returns true if an entry is evicted, false if no entry is evicted.
+ */
+bool lv_cache_evict_one(lv_cache_t * cache, void * user_data);
+
+/**
+ * Set the maximum size of the cache.
+ * If the current cache size is greater than the new maximum size, the cache's policy will be used to evict entries until the new maximum size is reached.
+ * @note But this behavior will happen only new entries are added to the cache.
+ * @param cache The cache object pointer to set the maximum size.
+ * @param max_size The new maximum size of the cache.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ */
+void lv_cache_set_max_size(lv_cache_t * cache, size_t max_size, void * user_data);
+
+/**
+ * Get the maximum size of the cache.
+ * @param cache The cache object pointer to get the maximum size.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ * @return Returns the maximum size of the cache.
+ */
size_t lv_cache_get_max_size(lv_cache_t * cache, void * user_data);
+
+/**
+ * Get the current size of the cache.
+ * @param cache The cache object pointer to get the current size.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ * @return Returns the current size of the cache.
+ */
size_t lv_cache_get_size(lv_cache_t * cache, void * user_data);
+
+/**
+ * Get the free size of the cache.
+ * @param cache The cache object pointer to get the free size.
+ * @param user_data A user data pointer that will be passed to the free callback.
+ * @return Returns the free size of the cache.
+ */
size_t lv_cache_get_free_size(lv_cache_t * cache, void * user_data);
+/**
+ * Set the compare callback of the cache.
+ * @param cache The cache object pointer to set the compare callback.
+ * @param compare_cb The compare callback to set.
+ * @param user_data A user data pointer.
+ */
void lv_cache_set_compare_cb(lv_cache_t * cache, lv_cache_compare_cb_t compare_cb, void * user_data);
+
+/**
+ * Set the create callback of the cache.
+ * @param cache The cache object pointer to set the create callback.
+ * @param alloc_cb The create callback to set.
+ * @param user_data A user data pointer.
+ */
void lv_cache_set_create_cb(lv_cache_t * cache, lv_cache_create_cb_t alloc_cb, void * user_data);
+
+/**
+ * Set the free callback of the cache.
+ * @param cache The cache object pointer to set the free callback.
+ * @param free_cb The free callback to set.
+ * @param user_data A user data pointer.
+ */
void lv_cache_set_free_cb(lv_cache_t * cache, lv_cache_free_cb_t free_cb, void * user_data);
/*************************
* GLOBAL VARIABLES
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_entry.h b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_entry.h
index c2f8585ea..0cd2fb2e1 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_entry.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_entry.h
@@ -29,16 +29,77 @@ extern "C" {
/**********************
* GLOBAL PROTOTYPES
**********************/
+
+/**
+ * Get the size of a cache entry.
+ * @param node_size The size of the node in the cache.
+ * @return The size of the cache entry.
+ */
uint32_t lv_cache_entry_get_size(const uint32_t node_size);
+
+/**
+ * Get the reference count of a cache entry.
+ * @param entry The cache entry to get the reference count of.
+ * @return The reference count of the cache entry.
+ */
int32_t lv_cache_entry_get_ref(lv_cache_entry_t * entry);
+
+/**
+ * Get the node size of a cache entry. Which is the same size with @lv_cache_entry_get_size's node_size parameter.
+ * @param entry The cache entry to get the node size of.
+ * @return The node size of the cache entry.
+ */
uint32_t lv_cache_entry_get_node_size(lv_cache_entry_t * entry);
+
+/**
+ * Check if a cache entry is invalid.
+ * @param entry The cache entry to check.
+ * @return True: the cache entry is invalid. False: the cache entry is valid.
+ */
bool lv_cache_entry_is_invalid(lv_cache_entry_t * entry);
+
+/**
+ * Get the data of a cache entry.
+ * @param entry The cache entry to get the data of.
+ * @return The pointer to the data of the cache entry.
+ */
void * lv_cache_entry_get_data(lv_cache_entry_t * entry);
+
+/**
+ * Get the cache instance of a cache entry.
+ * @param entry The cache entry to get the cache instance of.
+ * @return The pointer to the cache instance of the cache entry.
+ */
const lv_cache_t * lv_cache_entry_get_cache(const lv_cache_entry_t * entry);
+
+/**
+ * Get the cache entry of a data. The data should be allocated by the cache instance.
+ * @param data The data to get the cache entry of.
+ * @param node_size The size of the node in the cache.
+ * @return The pointer to the cache entry of the data.
+ */
lv_cache_entry_t * lv_cache_entry_get_entry(void * data, const uint32_t node_size);
+/**
+ * Allocate a cache entry.
+ * @param node_size The size of the node in the cache.
+ * @param cache The cache instance to allocate the cache entry from.
+ * @return The pointer to the allocated cache entry.
+ */
lv_cache_entry_t * lv_cache_entry_alloc(const uint32_t node_size, const lv_cache_t * cache);
+
+/**
+ * Initialize a cache entry.
+ * @param entry The cache entry to initialize.
+ * @param cache The cache instance to allocate the cache entry from.
+ * @param node_size The size of the node in the cache.
+ */
void lv_cache_entry_init(lv_cache_entry_t * entry, const lv_cache_t * cache, const uint32_t node_size);
+
+/**
+ * Deallocate a cache entry. And the data of the cache entry will be freed.
+ * @param entry The cache entry to deallocate.
+ */
void lv_cache_entry_delete(lv_cache_entry_t * entry);
/*************************
* GLOBAL VARIABLES
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_private.h b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_private.h
index 7a83e04d0..4dbafd17e 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_private.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_cache_private.h
@@ -26,9 +26,16 @@ extern "C" {
* TYPEDEFS
**********************/
-/*-----------------
- * Cache entry slot
- *----------------*/
+/**
+ * The result of the cache reserve condition callback
+ */
+typedef enum {
+ LV_CACHE_RESERVE_COND_OK, /**< The condition is met and no entries need to be evicted */
+ LV_CACHE_RESERVE_COND_TOO_LARGE, /**< The condition is not met and the reserve size is too large */
+ LV_CACHE_RESERVE_COND_NEED_VICTIM, /**< The condition is not met and a victim is needed to be evicted */
+ LV_CACHE_RESERVE_COND_ERROR /**< An error occurred while checking the condition */
+} lv_cache_reserve_cond_res_t;
+
struct _lv_cache_ops_t;
struct _lv_cache_t;
struct _lv_cache_class_t;
@@ -44,44 +51,108 @@ typedef bool (*lv_cache_create_cb_t)(void * node, void * user_data);
typedef void (*lv_cache_free_cb_t)(void * node, void * user_data);
typedef lv_cache_compare_res_t (*lv_cache_compare_cb_t)(const void * a, const void * b);
+/**
+ * The cache instance allocation function, used by the cache class to allocate memory for cache instances.
+ * @return It should return a pointer to the allocated instance.
+ */
typedef void * (*lv_cache_alloc_cb_t)(void);
+
+/**
+ * The cache instance initialization function, used by the cache class to initialize the cache instance.
+ * @return It should return true if the initialization is successful, false otherwise.
+ */
typedef bool (*lv_cache_init_cb_t)(lv_cache_t * cache);
+
+/**
+ * The cache instance destruction function, used by the cache class to destroy the cache instance.
+ */
typedef void (*lv_cache_destroy_cb_t)(lv_cache_t * cache, void * user_data);
+
+/**
+ * The cache get function, used by the cache class to get a cache entry by its key.
+ * @return @NULL if the key is not found.
+ */
typedef lv_cache_entry_t * (*lv_cache_get_cb_t)(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * The cache add function, used by the cache class to add a cache entry with a given key.
+ * This function only cares about how to add the entry, it doesn't check if the entry already exists and doesn't care about is it a victim or not.
+ * @return the added cache entry, or NULL if the entry is not added.
+ */
typedef lv_cache_entry_t * (*lv_cache_add_cb_t)(lv_cache_t * cache, const void * key, void * user_data);
+
+/**
+ * The cache remove function, used by the cache class to remove a cache entry from the cache but doesn't free the memory..
+ * This function only cares about how to remove the entry, it doesn't care about is it a victim or not.
+ */
typedef void (*lv_cache_remove_cb_t)(lv_cache_t * cache, lv_cache_entry_t * entry, void * user_data);
+
+/**
+ * The cache drop function, used by the cache class to remove a cache entry from the cache and free the memory.
+ */
typedef void (*lv_cache_drop_cb_t)(lv_cache_t * cache, const void * key, void * user_data);
-typedef void (*lv_cache_clear_cb_t)(lv_cache_t * cache, void * user_data);
+/**
+ * The cache drop all function, used by the cache class to remove all cache entries from the cache and free the memory.
+ */
+typedef void (*lv_cache_drop_all_cb_t)(lv_cache_t * cache, void * user_data);
+
+/**
+ * The cache get victim function, used by the cache class to get a victim entry to be evicted.
+ */
+typedef lv_cache_entry_t * (*lv_cache_get_victim_cb)(lv_cache_t * cache, void * user_data);
+
+/**
+ * The cache reserve condition function, used by the cache class to check if a new entry can be added to the cache without exceeding its maximum size.
+ * See @lv_cache_reserve_cond_res_t for the possible results.
+ */
+typedef lv_cache_reserve_cond_res_t (*lv_cache_reserve_cond_cb)(lv_cache_t * cache, const void * key, size_t size,
+ void * user_data);
+
+/**
+ * The cache operations struct
+ */
struct _lv_cache_ops_t {
- lv_cache_compare_cb_t compare_cb;
- lv_cache_create_cb_t create_cb;
- lv_cache_free_cb_t free_cb;
+ lv_cache_compare_cb_t compare_cb; /**< Compare function for keys */
+ lv_cache_create_cb_t create_cb; /**< Create function for nodes */
+ lv_cache_free_cb_t free_cb; /**< Free function for nodes */
};
+/**
+ * The cache entry struct
+ */
struct _lv_cache_t {
- const lv_cache_class_t * clz;
+ const lv_cache_class_t * clz; /**< The cache class. There are two built-in classes:
+ * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy.
+ * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy. */
- size_t node_size;
+ uint32_t node_size; /**< The size of a node */
- size_t max_size;
- size_t size;
+ uint32_t max_size; /**< The maximum size of the cache */
+ uint32_t size; /**< The current size of the cache */
- lv_cache_ops_t ops;
+ lv_cache_ops_t ops; /**< The cache operations struct @lv_cache_ops_t */
- lv_mutex_t lock;
+ lv_mutex_t lock; /**< The cache lock used to protect the cache in multithreading environments */
};
+/**
+ * The cache class struct for building custom cache classes, and there are two built-in classes for examples:
+ * @lv_cache_class_lru_rb_count for LRU-based cache with count-based eviction policy.
+ * @lv_cache_class_lru_rb_size for LRU-based cache with size-based eviction policy.
+ */
struct _lv_cache_class_t {
- lv_cache_alloc_cb_t alloc_cb;
- lv_cache_init_cb_t init_cb;
- lv_cache_destroy_cb_t destroy_cb;
+ lv_cache_alloc_cb_t alloc_cb; /**< The allocation function for cache entries */
+ lv_cache_init_cb_t init_cb; /**< The initialization function for cache entries */
+ lv_cache_destroy_cb_t destroy_cb; /**< The destruction function for cache entries */
- lv_cache_get_cb_t get_cb;
- lv_cache_add_cb_t add_cb;
- lv_cache_remove_cb_t remove_cb;
- lv_cache_drop_cb_t drop_cb;
- lv_cache_clear_cb_t drop_all_cb;
+ lv_cache_get_cb_t get_cb; /**< The get function for cache entries */
+ lv_cache_add_cb_t add_cb; /**< The add function for cache entries */
+ lv_cache_remove_cb_t remove_cb; /**< The remove function for cache entries */
+ lv_cache_drop_cb_t drop_cb; /**< The drop function for cache entries */
+ lv_cache_drop_all_cb_t drop_all_cb; /**< The drop all function for cache entries */
+ lv_cache_get_victim_cb get_victim_cb; /**< The get victim function for cache entries */
+ lv_cache_reserve_cond_cb reserve_cond_cb; /**< The reserve condition function for cache entries */
};
/*-----------------
@@ -92,6 +163,11 @@ struct _lv_cache_slot_size_t;
typedef struct _lv_cache_slot_size_t lv_cache_slot_size_t;
+/**
+ * The cache entry slot struct
+ * To add new fields to the cache entry, add them to a new struct and add it to the first field of the cache data struct.
+ * And this one is a size slot for the cache entry.
+ */
struct _lv_cache_slot_size_t {
size_t size;
};
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.c b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.c
index 728224669..28f0aec75 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.c
@@ -13,6 +13,7 @@
* DEFINES
*********************/
#define img_cache_p (LV_GLOBAL_DEFAULT()->img_cache)
+#define img_header_cache_p (LV_GLOBAL_DEFAULT()->img_header_cache)
/**********************
* TYPEDEFS
**********************/
@@ -38,6 +39,9 @@
**********************/
void lv_image_cache_drop(const void * src)
{
+ /*If user invalidate image, the header cache should be invalidated too.*/
+ lv_image_header_cache_drop(src);
+
#if LV_CACHE_DEF_SIZE > 0
if(src == NULL) {
lv_cache_drop_all(img_cache_p, NULL);
@@ -54,6 +58,52 @@ void lv_image_cache_drop(const void * src)
LV_UNUSED(src);
#endif
}
+
+void lv_image_cache_resize(uint32_t new_size, bool evict_now)
+{
+#if LV_CACHE_DEF_SIZE > 0
+ lv_cache_set_max_size(img_cache_p, new_size, NULL);
+ if(evict_now) {
+ lv_cache_reserve(img_cache_p, new_size, NULL);
+ }
+#else
+ LV_UNUSED(new_size);
+ LV_UNUSED(evict_now);
+#endif
+}
+
+void lv_image_header_cache_drop(const void * src)
+{
+#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
+ if(src == NULL) {
+ lv_cache_drop_all(img_header_cache_p, NULL);
+ return;
+ }
+
+ lv_image_header_cache_data_t search_key = {
+ .src = src,
+ .src_type = lv_image_src_get_type(src),
+ };
+
+ lv_cache_drop(img_header_cache_p, &search_key, NULL);
+#else
+ LV_UNUSED(src);
+#endif
+}
+
+void lv_image_header_cache_resize(uint32_t new_size, bool evict_now)
+{
+#if LV_IMAGE_HEADER_CACHE_DEF_CNT > 0
+ lv_cache_set_max_size(img_header_cache_p, new_size, NULL);
+ if(evict_now) {
+ lv_cache_reserve(img_header_cache_p, new_size, NULL);
+ }
+#else
+ LV_UNUSED(new_size);
+ LV_UNUSED(evict_now);
+#endif
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.h b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.h
index 3b23b3dfb..f8a590349 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/cache/lv_image_cache.h
@@ -26,7 +26,34 @@ extern "C" {
/**********************
* GLOBAL PROTOTYPES
**********************/
+
+/**
+ * Invalidate image cache. Use NULL to invalidate all images.
+ * @param src pointer to an image source.
+ */
void lv_image_cache_drop(const void * src);
+
+/**
+ * Resize image cache.
+ * @param new_size new size of the cache in bytes.
+ * @param evict_now true: evict the images should be removed by the eviction policy, false: wait for the next cache cleanup.
+ */
+void lv_image_cache_resize(uint32_t new_size, bool evict_now);
+
+/**
+ * Invalidate image header cache. Use NULL to invalidate all image headers.
+ * It's also automatically called when an image is invalidated.
+ * @param src pointer to an image source.
+ */
+void lv_image_header_cache_drop(const void * src);
+
+/**
+ * Resize image header cache.
+ * @param new_size new size of the cache in count of image headers.
+ * @param evict_now true: evict the image headers should be removed by the eviction policy, false: wait for the next cache cleanup.
+ */
+void lv_image_header_cache_resize(uint32_t new_size, bool evict_now);
+
/*************************
* GLOBAL VARIABLES
*************************/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_anim.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_anim.c
index 8d88372a2..b33c5993c 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_anim.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_anim.c
@@ -39,7 +39,6 @@ static int32_t lv_anim_path_cubic_bezier(const lv_anim_t * a, int32_t x1,
static uint32_t convert_speed_to_time(uint32_t speed, int32_t start, int32_t end);
static void resolve_time(lv_anim_t * a);
static bool remove_concurrent_anims(lv_anim_t * a_current);
-static bool delete_core(void * var, void * cb, bool custom_exec_cb);
/**********************
* STATIC VARIABLES
@@ -144,7 +143,27 @@ uint32_t lv_anim_get_playtime(const lv_anim_t * a)
bool lv_anim_delete(void * var, lv_anim_exec_xcb_t exec_cb)
{
- return delete_core(var, exec_cb, false);
+ lv_anim_t * a;
+ bool del_any = false;
+ a = _lv_ll_get_head(anim_ll_p);
+ while(a != NULL) {
+ bool del = false;
+ if((a->var == var || var == NULL) && (a->exec_cb == exec_cb || exec_cb == NULL)) {
+ _lv_ll_remove(anim_ll_p, a);
+ if(a->deleted_cb != NULL) a->deleted_cb(a);
+ lv_free(a);
+ anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in
+ the linked list*/
+ del_any = true;
+ del = true;
+ }
+
+ /*Always start from the head on delete, because we don't know
+ *how `anim_ll_p` was changes in `a->deleted_cb` */
+ a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a);
+ }
+
+ return del_any;
}
void lv_anim_delete_all(void)
@@ -534,29 +553,3 @@ static bool remove_concurrent_anims(lv_anim_t * a_current)
return del_any;
}
-
-static bool delete_core(void * var, void * cb, bool custom_exec_cb)
-{
- lv_anim_t * a;
- bool del_any = false;
- a = _lv_ll_get_head(anim_ll_p);
- while(a != NULL) {
- bool del = false;
- void * a_cb = custom_exec_cb ? (void *)a->custom_exec_cb : (void *)a->exec_cb;
- if((a->var == var || var == NULL) && (a_cb == cb || cb == NULL)) {
- _lv_ll_remove(anim_ll_p, a);
- if(a->deleted_cb != NULL) a->deleted_cb(a);
- lv_free(a);
- anim_mark_list_change(); /*Read by `anim_timer`. It need to know if a delete occurred in
- the linked list*/
- del_any = true;
- del = true;
- }
-
- /*Always start from the head on delete, because we don't know
- *how `anim_ll_p` was changes in `a->deleted_cb` */
- a = del ? _lv_ll_get_head(anim_ll_p) : _lv_ll_get_next(anim_ll_p, a);
- }
-
- return del_any;
-}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_area.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_area.c
index bfda7b347..3cfd12144 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_area.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_area.c
@@ -15,7 +15,6 @@
/*********************
* DEFINES
*********************/
-#define trans_cache LV_GLOBAL_DEFAULT()->area_trans_cache
/**********************
* TYPEDEFS
@@ -440,61 +439,73 @@ void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t alig
}
#define _LV_TRANSFORM_TRIGO_SHIFT 10
-void lv_point_transform(lv_point_t * p, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot,
+
+void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot,
bool zoom_first)
+{
+ lv_point_array_transform(point, 1, angle, scale_x, scale_y, pivot, zoom_first);
+}
+
+void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y,
+ const lv_point_t * pivot,
+ bool zoom_first)
{
if(angle == 0 && scale_x == 256 && scale_y == 256) {
return;
}
+ uint32_t i;
+ for(i = 0; i < count; i++) {
+ points[i].x -= pivot->x;
+ points[i].y -= pivot->y;
- p->x -= pivot->x;
- p->y -= pivot->y;
+ }
if(angle == 0) {
- p->x = (((int32_t)(p->x) * scale_x) >> 8) + pivot->x;
- p->y = (((int32_t)(p->y) * scale_y) >> 8) + pivot->y;
+ for(i = 0; i < count; i++) {
+ points[i].x = (((int32_t)(points[i].x) * scale_x) >> 8) + pivot->x;
+ points[i].y = (((int32_t)(points[i].y) * scale_y) >> 8) + pivot->y;
+ }
return;
}
- lv_area_transform_cache_t * cache = &trans_cache;
- if(cache->angle_prev != angle) {
- int32_t angle_limited = angle;
- if(angle_limited > 3600) angle_limited -= 3600;
- if(angle_limited < 0) angle_limited += 3600;
- int32_t angle_low = angle_limited / 10;
- int32_t angle_high = angle_low + 1;
- int32_t angle_rem = angle_limited - (angle_low * 10);
+ int32_t angle_limited = angle;
+ if(angle_limited > 3600) angle_limited -= 3600;
+ if(angle_limited < 0) angle_limited += 3600;
- int32_t s1 = lv_trigo_sin(angle_low);
- int32_t s2 = lv_trigo_sin(angle_high);
+ int32_t angle_low = angle_limited / 10;
+ int32_t angle_high = angle_low + 1;
+ int32_t angle_rem = angle_limited - (angle_low * 10);
- int32_t c1 = lv_trigo_sin(angle_low + 90);
- int32_t c2 = lv_trigo_sin(angle_high + 90);
+ int32_t s1 = lv_trigo_sin(angle_low);
+ int32_t s2 = lv_trigo_sin(angle_high);
- cache->sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
- cache->cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
- cache->sinma = cache->sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
- cache->cosma = cache->cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
- cache->angle_prev = angle;
- }
- int32_t x = p->x;
- int32_t y = p->y;
- if(scale_x == 256 && scale_y == 256) {
- p->x = ((cache->cosma * x - cache->sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
- p->y = ((cache->sinma * x + cache->cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
- }
- else {
- if(zoom_first) {
- x *= scale_x;
- y *= scale_y;
- p->x = (((cache->cosma * x - cache->sinma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
- p->y = (((cache->sinma * x + cache->cosma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
+ int32_t c1 = lv_trigo_sin(angle_low + 90);
+ int32_t c2 = lv_trigo_sin(angle_high + 90);
+
+ int32_t sinma = (s1 * (10 - angle_rem) + s2 * angle_rem) / 10;
+ sinma = sinma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
+ int32_t cosma = (c1 * (10 - angle_rem) + c2 * angle_rem) / 10;
+ cosma = cosma >> (LV_TRIGO_SHIFT - _LV_TRANSFORM_TRIGO_SHIFT);
+
+ for(i = 0; i < count; i++) {
+ int32_t x = points[i].x;
+ int32_t y = points[i].y;
+ if(scale_x == 256 && scale_y == 256) {
+ points[i].x = ((cosma * x - sinma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->x;
+ points[i].y = ((sinma * x + cosma * y) >> _LV_TRANSFORM_TRIGO_SHIFT) + pivot->y;
}
else {
- p->x = (((cache->cosma * x - cache->sinma * y) * scale_x) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
- p->y = (((cache->sinma * x + cache->cosma * y) * scale_y) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
+ if(zoom_first) {
+ x *= scale_x;
+ y *= scale_y;
+ points[i].x = (((cosma * x - sinma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
+ points[i].y = (((sinma * x + cosma * y)) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
+ }
+ else {
+ points[i].x = (((cosma * x - sinma * y) * scale_x) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->x;
+ points[i].y = (((sinma * x + cosma * y) * scale_y) >> (_LV_TRANSFORM_TRIGO_SHIFT + 8)) + pivot->y;
+ }
}
-
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_area.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_area.h
index 8916efd92..376ab9f6e 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_area.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_area.h
@@ -17,6 +17,7 @@ extern "C" {
#include "lv_types.h"
#include
#include
+#include
/*********************
* DEFINES
@@ -98,12 +99,6 @@ typedef _lv_dir_t lv_dir_t;
typedef uint8_t lv_dir_t;
#endif /*DOXYGEN*/
-typedef struct {
- int32_t angle_prev;
- int32_t sinma;
- int32_t cosma;
-} lv_area_transform_cache_t;
-
/**********************
* GLOBAL PROTOTYPES
**********************/
@@ -262,9 +257,32 @@ bool _lv_area_is_equal(const lv_area_t * a, const lv_area_t * b);
*/
void lv_area_align(const lv_area_t * base, lv_area_t * to_align, lv_align_t align, int32_t ofs_x, int32_t ofs_y);
-void lv_point_transform(lv_point_t * p, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot,
+/**
+ * Transform a point
+ * @param point pointer to a point
+ * @param angle angle with 0.1 resolutions (123 means 12.3°)
+ * @param scale_x horizontal zoom, 256 means 100%
+ * @param scale_y vertical zoom, 256 means 100%
+ * @param pivot pointer to the pivot point of the transformation
+ * @param zoom_first true: zoom first and rotate after that; else: opssoite order
+ */
+void lv_point_transform(lv_point_t * point, int32_t angle, int32_t scale_x, int32_t scale_y, const lv_point_t * pivot,
bool zoom_first);
+/**
+ * Transform an array of points
+ * @param points pointer to an array of points
+ * @param count number of points in the array
+ * @param angle angle with 0.1 resolutions (123 means 12.3°)
+ * @param scale_x horizontal zoom, 256 means 100%
+ * @param scale_y vertical zoom, 256 means 100%
+ * @param pivot pointer to the pivot point of the transformation
+ * @param zoom_first true: zoom first and rotate after that; else: opssoite order
+ */
+void lv_point_array_transform(lv_point_t * points, size_t count, int32_t angle, int32_t scale_x, int32_t scale_y,
+ const lv_point_t * pivot,
+ bool zoom_first);
+
static inline lv_point_t lv_point_from_precise(const lv_point_precise_t * p)
{
lv_point_t point = {
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_array.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_array.c
index 4d07949d5..cb9620503 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_array.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_array.c
@@ -82,7 +82,7 @@ lv_result_t lv_array_remove(lv_array_t * array, uint32_t index)
uint8_t * start = lv_array_at(array, index);
uint8_t * remaining = start + array->element_size;
uint32_t remaining_size = (array->size - index - 1) * array->element_size;
- lv_memcpy(start, remaining, remaining_size);
+ lv_memmove(start, remaining, remaining_size);
lv_array_resize(array, array->size - 1);
return LV_RESULT_OK;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_assert.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_assert.h
index 1b1b3b174..c9dc849c7 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_assert.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_assert.h
@@ -42,10 +42,18 @@ extern "C" {
} \
} while(0)
-#define LV_ASSERT_MSG(expr, format, ...) \
+#define LV_ASSERT_MSG(expr, msg) \
+ do { \
+ if(!(expr)) { \
+ LV_LOG_ERROR("Asserted at expression: %s (%s)", #expr, msg); \
+ LV_ASSERT_HANDLER \
+ } \
+ } while(0)
+
+#define LV_ASSERT_FORMAT_MSG(expr, format, ...) \
do { \
if(!(expr)) { \
- LV_LOG_ERROR("Asserted at expression: %s " format , #expr, ##__VA_ARGS__); \
+ LV_LOG_ERROR("Asserted at expression: %s " format , #expr, __VA_ARGS__); \
LV_ASSERT_HANDLER \
} \
} while(0)
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.c
index 942b75427..74b964f30 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.c
@@ -57,10 +57,12 @@ uint8_t lv_color_format_get_bpp(lv_color_format_t cf)
case LV_COLOR_FORMAT_A8:
case LV_COLOR_FORMAT_I8:
return 8;
+
+ case LV_COLOR_FORMAT_RGB565A8:
case LV_COLOR_FORMAT_RGB565:
return 16;
- case LV_COLOR_FORMAT_RGB565A8:
+ case LV_COLOR_FORMAT_ARGB8565:
case LV_COLOR_FORMAT_RGB888:
return 24;
case LV_COLOR_FORMAT_ARGB8888:
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h
index 5170e4696..943234490 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_color.h
@@ -75,7 +75,8 @@ typedef uint8_t lv_opa_t;
(cf) == LV_COLOR_FORMAT_A8 ? 8 : \
(cf) == LV_COLOR_FORMAT_I8 ? 8 : \
(cf) == LV_COLOR_FORMAT_RGB565 ? 16 : \
- (cf) == LV_COLOR_FORMAT_RGB565A8 ? 24 : \
+ (cf) == LV_COLOR_FORMAT_RGB565A8 ? 16 : \
+ (cf) == LV_COLOR_FORMAT_ARGB8565 ? 24 : \
(cf) == LV_COLOR_FORMAT_RGB888 ? 24 : \
(cf) == LV_COLOR_FORMAT_ARGB8888 ? 32 : \
(cf) == LV_COLOR_FORMAT_XRGB8888 ? 32 : \
@@ -127,6 +128,7 @@ enum _lv_color_format_t {
/*2 byte (+alpha) formats*/
LV_COLOR_FORMAT_RGB565 = 0x12,
+ LV_COLOR_FORMAT_ARGB8565 = 0x13, /**< Not supported by sw renderer yet. */
LV_COLOR_FORMAT_RGB565A8 = 0x14 /**< Color array followed by Alpha array*/,
/*3 byte (+alpha) formats*/
@@ -344,7 +346,7 @@ uint32_t lv_color_to_u32(lv_color_t color);
* mix == 255: c1
* mix == 128: 0.5 x c1 + 0.5 x c2
*/
-LV_ATTRIBUTE_FAST_MEM static inline uint16_t lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix)
+static inline uint16_t LV_ATTRIBUTE_FAST_MEM lv_color_16_16_mix(uint16_t c1, uint16_t c2, uint8_t mix)
{
if(mix == 255) return c1;
if(mix == 0) return c2;
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_color_op.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_color_op.h
index efcde364f..1109c9c2c 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_color_op.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_color_op.h
@@ -46,7 +46,7 @@ typedef struct _lv_color_filter_dsc_t {
* @param mix The ratio of the colors. 0: full `c2`, 255: full `c1`, 127: half `c1` and half`c2`
* @return the mixed color
*/
-LV_ATTRIBUTE_FAST_MEM static inline lv_color_t lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix)
+static inline lv_color_t LV_ATTRIBUTE_FAST_MEM lv_color_mix(lv_color_t c1, lv_color_t c2, uint8_t mix)
{
lv_color_t ret;
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_event.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_event.c
index 7fbd94510..e991ec0fa 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_event.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_event.c
@@ -65,15 +65,16 @@ lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preproces
if(list == NULL) return LV_RESULT_OK;
uint32_t i = 0;
- lv_event_dsc_t * dsc = lv_array_at(list, 0);
- for(i = 0; i < lv_array_size(list); i++) {
- if(dsc[i].cb == NULL) continue;
- bool is_preprocessed = (dsc[i].filter & LV_EVENT_PREPROCESS) != 0;
+ lv_event_dsc_t ** dsc = lv_array_front(list);
+ uint32_t size = lv_array_size(list);
+ for(i = 0; i < size; i++) {
+ if(dsc[i]->cb == NULL) continue;
+ bool is_preprocessed = (dsc[i]->filter & LV_EVENT_PREPROCESS) != 0;
if(is_preprocessed != preprocess) continue;
- lv_event_code_t filter = dsc[i].filter & ~LV_EVENT_PREPROCESS;
+ lv_event_code_t filter = dsc[i]->filter & ~LV_EVENT_PREPROCESS;
if(filter == LV_EVENT_ALL || filter == e->code) {
- e->user_data = dsc[i].user_data;
- dsc[i].cb(e);
+ e->user_data = dsc[i]->user_data;
+ dsc[i]->cb(e);
if(e->stop_processing) return LV_RESULT_OK;
/*Stop if the object is deleted*/
@@ -84,20 +85,41 @@ lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preproces
return LV_RESULT_OK;
}
-void lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter,
- void * user_data)
+lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter,
+ void * user_data)
{
- lv_event_dsc_t dsc = { 0 };
- dsc.cb = cb;
- dsc.filter = filter;
- dsc.user_data = user_data;
+ lv_event_dsc_t * dsc = lv_malloc(sizeof(lv_event_dsc_t));
+ LV_ASSERT_NULL(dsc);
+
+ dsc->cb = cb;
+ dsc->filter = filter;
+ dsc->user_data = user_data;
if(lv_array_size(list) == 0) {
/*event list hasn't been initialized.*/
- lv_array_init(list, 1, sizeof(lv_event_dsc_t));
+ lv_array_init(list, 1, sizeof(lv_event_dsc_t *));
}
lv_array_push_back(list, &dsc);
+ return dsc;
+}
+
+bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc)
+{
+ LV_ASSERT_NULL(list);
+ LV_ASSERT_NULL(dsc);
+
+ int size = lv_array_size(list);
+ lv_event_dsc_t ** events = lv_array_front(list);
+ for(int i = 0; i < size; i++) {
+ if(events[i] == dsc) {
+ lv_free(dsc);
+ lv_array_remove(list, i);
+ return true;
+ }
+ }
+
+ return false;
}
uint32_t lv_event_get_count(lv_event_list_t * list)
@@ -109,7 +131,9 @@ uint32_t lv_event_get_count(lv_event_list_t * list)
lv_event_dsc_t * lv_event_get_dsc(lv_event_list_t * list, uint32_t index)
{
LV_ASSERT_NULL(list);
- return lv_array_at(list, index);
+ lv_event_dsc_t ** dsc;
+ dsc = lv_array_at(list, index);
+ return dsc ? *dsc : NULL;
}
lv_event_cb_t lv_event_dsc_get_cb(lv_event_dsc_t * dsc)
@@ -128,12 +152,19 @@ void * lv_event_dsc_get_user_data(lv_event_dsc_t * dsc)
bool lv_event_remove(lv_event_list_t * list, uint32_t index)
{
LV_ASSERT_NULL(list);
+ lv_event_dsc_t * dsc = lv_event_get_dsc(list, index);
+ lv_free(dsc);
return lv_array_remove(list, index);
}
void lv_event_remove_all(lv_event_list_t * list)
{
LV_ASSERT_NULL(list);
+ int size = lv_array_size(list);
+ lv_event_dsc_t ** dsc = lv_array_front(list);
+ for(int i = 0; i < size; i++) {
+ lv_free(dsc[i]);
+ }
lv_array_deinit(list);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_event.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_event.h
index d5926dd1b..2eeb5cdf5 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_event.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_event.h
@@ -57,6 +57,7 @@ typedef enum {
LV_EVENT_SCROLL, /**< Scrolling*/
LV_EVENT_GESTURE, /**< A gesture is detected. Get the gesture with `lv_indev_get_gesture_dir(lv_indev_active());` */
LV_EVENT_KEY, /**< A key is sent to the object. Get the key with `lv_indev_get_key(lv_indev_active());`*/
+ LV_EVENT_ROTARY, /**< An encoder or wheel was rotated. Get the rotation count with `lv_event_get_rotary_diff(e);`*/
LV_EVENT_FOCUSED, /**< The object is focused*/
LV_EVENT_DEFOCUSED, /**< The object is defocused*/
LV_EVENT_LEAVE, /**< The object is defocused but still selected*/
@@ -107,6 +108,8 @@ typedef enum {
LV_EVENT_RENDER_READY,
LV_EVENT_FLUSH_START,
LV_EVENT_FLUSH_FINISH,
+ LV_EVENT_FLUSH_WAIT_START,
+ LV_EVENT_FLUSH_WAIT_FINISH,
LV_EVENT_VSYNC,
@@ -146,7 +149,8 @@ void _lv_event_pop(lv_event_t * e);
lv_result_t lv_event_send(lv_event_list_t * list, lv_event_t * e, bool preprocess);
-void lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data);
+lv_event_dsc_t * lv_event_add(lv_event_list_t * list, lv_event_cb_t cb, lv_event_code_t filter, void * user_data);
+bool lv_event_remove_dsc(lv_event_list_t * list, lv_event_dsc_t * dsc);
uint32_t lv_event_get_count(lv_event_list_t * list);
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_math.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_math.c
index 11f3f50ad..59e946062 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_math.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_math.c
@@ -49,7 +49,7 @@ static const uint16_t sin0_90_table[] = {
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM int32_t lv_trigo_sin(int16_t angle)
+int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_sin(int16_t angle)
{
int32_t ret = 0;
while(angle < 0) angle += 360;
@@ -205,7 +205,7 @@ found:
#endif
}
-LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask)
+void LV_ATTRIBUTE_FAST_MEM lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask)
{
x = x << 8; /*To get 4 bit precision. (sqrt(256) = 16 = 4 bit)*/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_math.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_math.h
index 904b44718..d1a543d3d 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_math.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_math.h
@@ -49,9 +49,9 @@ typedef struct {
* @param angle
* @return sinus of 'angle'. sin(-90) = -32767, sin(90) = 32767
*/
-LV_ATTRIBUTE_FAST_MEM int32_t lv_trigo_sin(int16_t angle);
+int32_t /* LV_ATTRIBUTE_FAST_MEM */ lv_trigo_sin(int16_t angle);
-static inline LV_ATTRIBUTE_FAST_MEM int32_t lv_trigo_cos(int16_t angle)
+static inline int32_t LV_ATTRIBUTE_FAST_MEM lv_trigo_cos(int16_t angle)
{
return lv_trigo_sin(angle + 90);
}
@@ -105,7 +105,7 @@ uint16_t lv_atan2(int x, int y);
* If root < 256: mask = 0x800
* Else: mask = 0x8000
*/
-LV_ATTRIBUTE_FAST_MEM void lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask);
+void /* LV_ATTRIBUTE_FAST_MEM */ lv_sqrt(uint32_t x, lv_sqrt_res_t * q, uint32_t mask);
//! @endcond
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.c
index ca6d2f2cc..ba278ae94 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.c
@@ -22,15 +22,57 @@
#define LV_PROFILER_STR_MAX_LEN 128
#define LV_PROFILER_TICK_PER_SEC_MAX 1000000
+#if LV_USE_OS
+ #define LV_PROFILER_MULTEX_INIT lv_mutex_init(&profiler_ctx->mutex)
+ #define LV_PROFILER_MULTEX_DEINIT lv_mutex_delete(&profiler_ctx->mutex)
+ #define LV_PROFILER_MULTEX_LOCK lv_mutex_lock(&profiler_ctx->mutex)
+ #define LV_PROFILER_MULTEX_UNLOCK lv_mutex_unlock(&profiler_ctx->mutex)
+#else
+ #define LV_PROFILER_MULTEX_INIT
+ #define LV_PROFILER_MULTEX_DEINIT
+ #define LV_PROFILER_MULTEX_LOCK
+ #define LV_PROFILER_MULTEX_UNLOCK
+#endif
+
/**********************
* TYPEDEFS
**********************/
+/**
+ * @brief Structure representing a built-in profiler item in LVGL
+ */
+typedef struct {
+ char tag; /**< The tag of the profiler item */
+ uint32_t tick; /**< The tick value of the profiler item */
+ const char * func; /**< A pointer to the function associated with the profiler item */
+#if LV_USE_OS
+ int tid; /**< The thread ID of the profiler item */
+ int cpu; /**< The CPU ID of the profiler item */
+#endif
+} lv_profiler_builtin_item_t;
+
+/**
+ * @brief Structure representing a context for the LVGL built-in profiler
+ */
+typedef struct _lv_profiler_builtin_ctx_t {
+ lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */
+ uint32_t item_num; /**< Number of profiler items in the array */
+ uint32_t cur_index; /**< Index of the current profiler item */
+ lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */
+ bool enable; /**< Whether the built-in profiler is enabled */
+#if LV_USE_OS
+ lv_mutex_t mutex; /**< Mutex to protect the built-in profiler */
+#endif
+} lv_profiler_builtin_ctx_t;
+
/**********************
* STATIC PROTOTYPES
**********************/
static void default_flush_cb(const char * buf);
+static int default_tid_get_cb(void);
+static int default_cpu_get_cb(void);
+static void flush_no_lock(void);
/**********************
* STATIC VARIABLES
@@ -52,6 +94,8 @@ void lv_profiler_builtin_config_init(lv_profiler_builtin_config_t * config)
config->tick_per_sec = 1000;
config->tick_get_cb = lv_tick_get;
config->flush_cb = default_flush_cb;
+ config->tid_get_cb = default_tid_get_cb;
+ config->cpu_get_cb = default_cpu_get_cb;
}
void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config)
@@ -71,26 +115,30 @@ void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config)
}
/*Free the old item_arr memory*/
- if(profiler_ctx.item_arr != NULL) {
+ if(profiler_ctx) {
lv_profiler_builtin_uninit();
}
- lv_memzero(&profiler_ctx, sizeof(profiler_ctx));
- profiler_ctx.item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t));
- LV_ASSERT_MALLOC(profiler_ctx.item_arr);
+ profiler_ctx = lv_malloc_zeroed(sizeof(lv_profiler_builtin_ctx_t));
+ LV_ASSERT_MALLOC(profiler_ctx);
- if(profiler_ctx.item_arr == NULL) {
+ profiler_ctx->item_arr = lv_malloc(num * sizeof(lv_profiler_builtin_item_t));
+ LV_ASSERT_MALLOC(profiler_ctx->item_arr);
+ if(profiler_ctx->item_arr == NULL) {
+ lv_free(profiler_ctx);
+ profiler_ctx = NULL;
LV_LOG_ERROR("malloc failed for item_arr");
return;
}
- profiler_ctx.item_num = num;
- profiler_ctx.config = *config;
+ LV_PROFILER_MULTEX_INIT;
+ profiler_ctx->item_num = num;
+ profiler_ctx->config = *config;
- if(profiler_ctx.config.flush_cb) {
+ if(profiler_ctx->config.flush_cb) {
/* add profiler header for perfetto */
- profiler_ctx.config.flush_cb("# tracer: nop\n");
- profiler_ctx.config.flush_cb("#\n");
+ profiler_ctx->config.flush_cb("# tracer: nop\n");
+ profiler_ctx->config.flush_cb("#\n");
}
lv_profiler_builtin_set_enable(true);
@@ -100,60 +148,60 @@ void lv_profiler_builtin_init(const lv_profiler_builtin_config_t * config)
void lv_profiler_builtin_uninit(void)
{
- LV_ASSERT_NULL(profiler_ctx.item_arr);
- lv_free(profiler_ctx.item_arr);
- lv_memzero(&profiler_ctx, sizeof(profiler_ctx));
+ LV_ASSERT_NULL(profiler_ctx);
+ LV_PROFILER_MULTEX_DEINIT;
+ lv_free(profiler_ctx->item_arr);
+ lv_free(profiler_ctx);
+ profiler_ctx = NULL;
}
void lv_profiler_builtin_set_enable(bool enable)
{
- profiler_ctx.enable = enable;
+ if(!profiler_ctx) {
+ return;
+ }
+
+ profiler_ctx->enable = enable;
}
void lv_profiler_builtin_flush(void)
{
- LV_ASSERT_NULL(profiler_ctx.item_arr);
- if(!profiler_ctx.config.flush_cb) {
- LV_LOG_WARN("flush_cb is not registered");
- return;
- }
+ LV_ASSERT_NULL(profiler_ctx);
- uint32_t cur = 0;
- char buf[LV_PROFILER_STR_MAX_LEN];
- uint32_t tick_per_sec = profiler_ctx.config.tick_per_sec;
- while(cur < profiler_ctx.cur_index) {
- lv_profiler_builtin_item_t * item = &profiler_ctx.item_arr[cur++];
- uint32_t sec = item->tick / tick_per_sec;
- uint32_t usec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec);
- lv_snprintf(buf, sizeof(buf),
- " LVGL-1 [0] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n",
- sec,
- usec,
- item->tag,
- item->func);
- profiler_ctx.config.flush_cb(buf);
- }
+ LV_PROFILER_MULTEX_LOCK;
+ flush_no_lock();
+ LV_PROFILER_MULTEX_UNLOCK;
}
void lv_profiler_builtin_write(const char * func, char tag)
{
- LV_ASSERT_NULL(profiler_ctx.item_arr);
+ LV_ASSERT_NULL(profiler_ctx);
LV_ASSERT_NULL(func);
- if(!profiler_ctx.enable) {
+ if(!profiler_ctx->enable) {
return;
}
- if(profiler_ctx.cur_index >= profiler_ctx.item_num) {
- lv_profiler_builtin_flush();
- profiler_ctx.cur_index = 0;
+ LV_PROFILER_MULTEX_LOCK;
+
+ if(profiler_ctx->cur_index >= profiler_ctx->item_num) {
+ flush_no_lock();
+ profiler_ctx->cur_index = 0;
}
- lv_profiler_builtin_item_t * item = &profiler_ctx.item_arr[profiler_ctx.cur_index];
+ lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[profiler_ctx->cur_index];
item->func = func;
item->tag = tag;
- item->tick = profiler_ctx.config.tick_get_cb();
- profiler_ctx.cur_index++;
+ item->tick = profiler_ctx->config.tick_get_cb();
+
+#if LV_USE_OS
+ item->tid = profiler_ctx->config.tid_get_cb();
+ item->cpu = profiler_ctx->config.cpu_get_cb();
+#endif
+
+ profiler_ctx->cur_index++;
+
+ LV_PROFILER_MULTEX_UNLOCK;
}
/**********************
@@ -165,4 +213,50 @@ static void default_flush_cb(const char * buf)
LV_LOG("%s", buf);
}
+static int default_tid_get_cb(void)
+{
+ return 1;
+}
+
+static int default_cpu_get_cb(void)
+{
+ return 0;
+}
+
+static void flush_no_lock(void)
+{
+ if(!profiler_ctx->config.flush_cb) {
+ LV_LOG_WARN("flush_cb is not registered");
+ return;
+ }
+
+ uint32_t cur = 0;
+ char buf[LV_PROFILER_STR_MAX_LEN];
+ uint32_t tick_per_sec = profiler_ctx->config.tick_per_sec;
+ while(cur < profiler_ctx->cur_index) {
+ lv_profiler_builtin_item_t * item = &profiler_ctx->item_arr[cur++];
+ uint32_t sec = item->tick / tick_per_sec;
+ uint32_t usec = (item->tick % tick_per_sec) * (LV_PROFILER_TICK_PER_SEC_MAX / tick_per_sec);
+
+#if LV_USE_OS
+ lv_snprintf(buf, sizeof(buf),
+ " LVGL-%d [%d] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n",
+ item->tid,
+ item->cpu,
+ sec,
+ usec,
+ item->tag,
+ item->func);
+#else
+ lv_snprintf(buf, sizeof(buf),
+ " LVGL-1 [0] %" LV_PRIu32 ".%06" LV_PRIu32 ": tracing_mark_write: %c|1|%s\n",
+ sec,
+ usec,
+ item->tag,
+ item->func);
+#endif
+ profiler_ctx->config.flush_cb(buf);
+ }
+}
+
#endif /*LV_USE_PROFILER_BUILTIN*/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.h
index ac41377e0..ac79f8e6f 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_profiler_builtin.h
@@ -43,28 +43,10 @@ typedef struct {
uint32_t tick_per_sec; /**< The number of ticks per second */
uint32_t (*tick_get_cb)(void); /**< Callback function to get the current tick count */
void (*flush_cb)(const char * buf); /**< Callback function to flush the profiling data */
+ int (*tid_get_cb)(void); /**< Callback function to get the current thread ID */
+ int (*cpu_get_cb)(void); /**< Callback function to get the current CPU */
} lv_profiler_builtin_config_t;
-/**
- * @brief Structure representing a built-in profiler item in LVGL
- */
-typedef struct {
- char tag; /**< The tag of the profiler item */
- uint32_t tick; /**< The tick value of the profiler item */
- const char * func; /**< A pointer to the function associated with the profiler item */
-} lv_profiler_builtin_item_t;
-
-/**
- * @brief Structure representing a context for the LVGL built-in profiler
- */
-typedef struct {
- lv_profiler_builtin_item_t * item_arr; /**< Pointer to an array of profiler items */
- uint32_t item_num; /**< Number of profiler items in the array */
- uint32_t cur_index; /**< Index of the current profiler item */
- lv_profiler_builtin_config_t config; /**< Configuration for the built-in profiler */
- bool enable; /**< Whether the built-in profiler is enabled */
-} lv_profiler_builtin_ctx_t;
-
/**********************
* GLOBAL PROTOTYPES
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_rb.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_rb.c
index b53ee6ae2..8a564599b 100755
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_rb.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_rb.c
@@ -243,7 +243,7 @@ bool lv_rb_drop(lv_rb_t * tree, const void * key)
{
LV_ASSERT_NULL(tree);
if(tree == NULL) {
- return NULL;
+ return false;
}
void * data = lv_rb_remove(tree, key);
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_style.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_style.c
index 276746160..e7278434e 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_style.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_style.c
@@ -136,6 +136,7 @@ const uint8_t _lv_style_builtin_prop_flag_lookup_table[_LV_STYLE_NUM_BUILT_IN_PR
[LV_STYLE_BLEND_MODE] = LV_STYLE_PROP_FLAG_LAYER_UPDATE,
[LV_STYLE_LAYOUT] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
[LV_STYLE_BASE_DIR] = LV_STYLE_PROP_FLAG_INHERITABLE | LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
+ [LV_STYLE_BITMAP_MASK_SRC] = LV_STYLE_PROP_FLAG_LAYER_UPDATE,
#if LV_USE_FLEX
[LV_STYLE_FLEX_FLOW] = LV_STYLE_PROP_FLAG_LAYOUT_UPDATE,
@@ -405,9 +406,13 @@ lv_style_value_t lv_style_prop_get_default(lv_style_prop_t prop)
return (lv_style_value_t) {
.num = LV_COORD_MAX
};
+ case LV_STYLE_ROTARY_SENSITIVITY:
+ return (lv_style_value_t) {
+ .num = 256
+ };
default:
return (lv_style_value_t) {
- .ptr = 0
+ .ptr = NULL
};
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_style.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_style.h
index 7e5ed75be..5c69e5989 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_style.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_style.h
@@ -298,29 +298,31 @@ enum _lv_style_prop_t {
LV_STYLE_TRANSFORM_PIVOT_Y = 112,
LV_STYLE_TRANSFORM_SKEW_X = 113,
LV_STYLE_TRANSFORM_SKEW_Y = 114,
+ LV_STYLE_BITMAP_MASK_SRC = 115,
+ LV_STYLE_ROTARY_SENSITIVITY = 116,
#if LV_USE_FLEX
- LV_STYLE_FLEX_FLOW = 115,
- LV_STYLE_FLEX_MAIN_PLACE = 116,
- LV_STYLE_FLEX_CROSS_PLACE = 117,
- LV_STYLE_FLEX_TRACK_PLACE = 118,
- LV_STYLE_FLEX_GROW = 119,
+ LV_STYLE_FLEX_FLOW = 125,
+ LV_STYLE_FLEX_MAIN_PLACE = 126,
+ LV_STYLE_FLEX_CROSS_PLACE = 127,
+ LV_STYLE_FLEX_TRACK_PLACE = 128,
+ LV_STYLE_FLEX_GROW = 129,
#endif
#if LV_USE_GRID
- LV_STYLE_GRID_COLUMN_ALIGN = 120,
- LV_STYLE_GRID_ROW_ALIGN = 121,
- LV_STYLE_GRID_ROW_DSC_ARRAY = 122,
- LV_STYLE_GRID_COLUMN_DSC_ARRAY = 123,
- LV_STYLE_GRID_CELL_COLUMN_POS = 124,
- LV_STYLE_GRID_CELL_COLUMN_SPAN = 125,
- LV_STYLE_GRID_CELL_X_ALIGN = 126,
- LV_STYLE_GRID_CELL_ROW_POS = 127,
- LV_STYLE_GRID_CELL_ROW_SPAN = 128,
- LV_STYLE_GRID_CELL_Y_ALIGN = 129,
+ LV_STYLE_GRID_COLUMN_ALIGN = 130,
+ LV_STYLE_GRID_ROW_ALIGN = 131,
+ LV_STYLE_GRID_ROW_DSC_ARRAY = 132,
+ LV_STYLE_GRID_COLUMN_DSC_ARRAY = 133,
+ LV_STYLE_GRID_CELL_COLUMN_POS = 134,
+ LV_STYLE_GRID_CELL_COLUMN_SPAN = 135,
+ LV_STYLE_GRID_CELL_X_ALIGN = 136,
+ LV_STYLE_GRID_CELL_ROW_POS = 137,
+ LV_STYLE_GRID_CELL_ROW_SPAN = 138,
+ LV_STYLE_GRID_CELL_Y_ALIGN = 139,
#endif
- _LV_STYLE_LAST_BUILT_IN_PROP = 130,
+ _LV_STYLE_LAST_BUILT_IN_PROP = 140,
_LV_STYLE_NUM_BUILT_IN_PROPS = _LV_STYLE_LAST_BUILT_IN_PROP + 1,
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.c
index c0aacab0b..297087534 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.c
@@ -6,8 +6,10 @@
**********************************************************************
*/
+
#include "lv_style.h"
+
void lv_style_set_width(lv_style_t * style, int32_t value)
{
lv_style_value_t v = {
@@ -937,6 +939,26 @@ void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value)
}
const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR = LV_STYLE_BASE_DIR;
+
+void lv_style_set_bitmap_mask_src(lv_style_t * style, const lv_image_dsc_t * value)
+{
+ lv_style_value_t v = {
+ .ptr = value
+ };
+ lv_style_set_prop(style, LV_STYLE_BITMAP_MASK_SRC, v);
+}
+
+const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC = LV_STYLE_BITMAP_MASK_SRC;
+
+void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value)
+{
+ lv_style_value_t v = {
+ .num = (int32_t)value
+ };
+ lv_style_set_prop(style, LV_STYLE_ROTARY_SENSITIVITY, v);
+}
+
+const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY = LV_STYLE_ROTARY_SENSITIVITY;
#if LV_USE_FLEX
void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value)
@@ -1092,3 +1114,4 @@ void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value)
const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN = LV_STYLE_GRID_CELL_ROW_SPAN;
#endif /*LV_USE_GRID*/
+
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.h
index f02553f87..7aed6b7e9 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_style_gen.h
@@ -6,9 +6,14 @@
**********************************************************************
*/
+
#ifndef LV_STYLE_GEN_H
#define LV_STYLE_GEN_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
void lv_style_set_width(lv_style_t * style, int32_t value);
LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_WIDTH;
void lv_style_set_min_width(lv_style_t * style, int32_t value);
@@ -195,44 +200,47 @@ void lv_style_set_layout(lv_style_t * style, uint16_t value);
LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_LAYOUT;
void lv_style_set_base_dir(lv_style_t * style, lv_base_dir_t value);
LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BASE_DIR;
+void lv_style_set_bitmap_mask_src(lv_style_t * style, const lv_image_dsc_t * value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BITMAP_MASK_SRC;
+void lv_style_set_rotary_sensitivity(lv_style_t * style, uint32_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_ROTARY_SENSITIVITY;
#if LV_USE_FLEX
-
- void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW;
- void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE;
- void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE;
- void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE;
- void lv_style_set_flex_grow(lv_style_t * style, uint8_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW;
+void lv_style_set_flex_flow(lv_style_t * style, lv_flex_flow_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_FLOW;
+void lv_style_set_flex_main_place(lv_style_t * style, lv_flex_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_MAIN_PLACE;
+void lv_style_set_flex_cross_place(lv_style_t * style, lv_flex_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_CROSS_PLACE;
+void lv_style_set_flex_track_place(lv_style_t * style, lv_flex_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_TRACK_PLACE;
+void lv_style_set_flex_grow(lv_style_t * style, uint8_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_FLEX_GROW;
#endif /*LV_USE_FLEX*/
#if LV_USE_GRID
-
- void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY;
- void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN;
- void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY;
- void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN;
- void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS;
- void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN;
- void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN;
- void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS;
- void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN;
- void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value);
- LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN;
+void lv_style_set_grid_column_dsc_array(lv_style_t * style, const int32_t * value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_DSC_ARRAY;
+void lv_style_set_grid_column_align(lv_style_t * style, lv_grid_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_COLUMN_ALIGN;
+void lv_style_set_grid_row_dsc_array(lv_style_t * style, const int32_t * value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_DSC_ARRAY;
+void lv_style_set_grid_row_align(lv_style_t * style, lv_grid_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_ROW_ALIGN;
+void lv_style_set_grid_cell_column_pos(lv_style_t * style, int32_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_POS;
+void lv_style_set_grid_cell_x_align(lv_style_t * style, lv_grid_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_X_ALIGN;
+void lv_style_set_grid_cell_column_span(lv_style_t * style, int32_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_COLUMN_SPAN;
+void lv_style_set_grid_cell_row_pos(lv_style_t * style, int32_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_POS;
+void lv_style_set_grid_cell_y_align(lv_style_t * style, lv_grid_align_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_Y_ALIGN;
+void lv_style_set_grid_cell_row_span(lv_style_t * style, int32_t value);
+LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_GRID_CELL_ROW_SPAN;
#endif /*LV_USE_GRID*/
+
#define LV_STYLE_CONST_WIDTH(val) \
{ \
.prop_ptr = &_lv_style_const_prop_id_WIDTH, .value = { .num = (int32_t)val } \
@@ -697,6 +705,16 @@ LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BA
{ \
.prop_ptr = &_lv_style_const_prop_id_BASE_DIR, .value = { .num = (int32_t)val } \
}
+
+#define LV_STYLE_CONST_BITMAP_MASK_SRC(val) \
+ { \
+ .prop_ptr = &_lv_style_const_prop_id_BITMAP_MASK_SRC, .value = { .ptr = val } \
+ }
+
+#define LV_STYLE_CONST_ROTARY_SENSITIVITY(val) \
+ { \
+ .prop_ptr = &_lv_style_const_prop_id_ROTARY_SENSITIVITY, .value = { .num = (int32_t)val } \
+ }
#if LV_USE_FLEX
#define LV_STYLE_CONST_FLEX_FLOW(val) \
@@ -778,4 +796,9 @@ LV_ATTRIBUTE_EXTERN_DATA extern const lv_style_prop_t _lv_style_const_prop_id_BA
}
#endif /*LV_USE_GRID*/
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
#endif /* LV_STYLE_GEN_H */
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.c
index 7738770bc..2eb02afc7 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.c
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.c
@@ -9,6 +9,8 @@
#include
#include "lv_utils.h"
+#include "lv_fs.h"
+#include "cache/lv_image_cache.h"
/*********************
* DEFINES
@@ -57,6 +59,38 @@ void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32
return NULL;
}
+lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path)
+{
+ lv_fs_file_t file;
+ lv_fs_res_t res = lv_fs_open(&file, path, LV_FS_MODE_WR);
+ if(res != LV_FS_RES_OK) {
+ LV_LOG_ERROR("create file %s failed", path);
+ return LV_RESULT_INVALID;
+ }
+
+ /*Image content modified, invalidate image cache.*/
+ lv_image_cache_drop(path);
+
+ uint32_t bw;
+ res = lv_fs_write(&file, &draw_buf->header, sizeof(draw_buf->header), &bw);
+ if(res != LV_FS_RES_OK || bw != sizeof(draw_buf->header)) {
+ LV_LOG_ERROR("write draw_buf->header failed");
+ lv_fs_close(&file);
+ return LV_RESULT_INVALID;
+ }
+
+ res = lv_fs_write(&file, draw_buf->data, draw_buf->data_size, &bw);
+ if(res != LV_FS_RES_OK || bw != draw_buf->data_size) {
+ LV_LOG_ERROR("write draw_buf->data failed");
+ lv_fs_close(&file);
+ return LV_RESULT_INVALID;
+ }
+
+ lv_fs_close(&file);
+ LV_LOG_TRACE("saved draw_buf to %s", path);
+ return LV_RESULT_OK;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.h b/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.h
index 84d2bb95b..8422cf8d7 100644
--- a/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.h
+++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_utils.h
@@ -13,6 +13,10 @@ extern "C" {
/*********************
* INCLUDES
*********************/
+
+#include "lv_types.h"
+#include "../draw/lv_draw_buf.h"
+
#include
/*********************
@@ -47,6 +51,14 @@ extern "C" {
void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size,
int32_t (*cmp)(const void * pRef, const void * pElement));
+/**
+ * Save a draw buf to a file
+ * @param draw_buf pointer to a draw buffer
+ * @param path path to the file to save
+ * @return LV_RES_OK: success; LV_RES_INV: error
+ */
+lv_result_t lv_draw_buf_save_to_file(const lv_draw_buf_t * draw_buf, const char * path);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.c b/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.c
index bc3f7d9d8..0f7f678bc 100644
--- a/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.c
+++ b/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.c
@@ -16,9 +16,13 @@
#if LV_USE_OS == LV_OS_FREERTOS
-#include "atomic.h"
-#include "../misc/lv_log.h"
+#if (ESP_PLATFORM)
+ #include "freertos/atomic.h"
+#else
+ #include "atomic.h"
+#endif
+#include "../misc/lv_log.h"
/*********************
* DEFINES
*********************/
@@ -55,10 +59,22 @@ static void prvTestAndDecrement(lv_thread_sync_t * pxCond,
* STATIC VARIABLES
**********************/
+#if (ESP_PLATFORM)
+ static portMUX_TYPE critSectionMux = portMUX_INITIALIZER_UNLOCKED;
+#endif
+
/**********************
* MACROS
**********************/
+#if (ESP_PLATFORM)
+ #define _enter_critical() taskENTER_CRITICAL(&critSectionMux);
+ #define _exit_critical() taskEXIT_CRITICAL(&critSectionMux);
+#else
+ #define _enter_critical() taskENTER_CRITICAL();
+ #define _exit_critical() taskEXIT_CRITICAL();
+#endif
+
/**********************
* GLOBAL FUNCTIONS
**********************/
@@ -73,7 +89,7 @@ lv_result_t lv_thread_init(lv_thread_t * pxThread, lv_thread_prio_t xSchedPriori
BaseType_t xTaskCreateStatus = xTaskCreate(
prvRunThread,
pcTASK_NAME,
- (uint16_t)usStackSize,
+ (configSTACK_DEPTH_TYPE)(usStackSize / sizeof(StackType_t)),
(void *)pxThread,
tskIDLE_PRIORITY + xSchedPriority,
&pxThread->xTaskHandle);
@@ -336,7 +352,7 @@ static void prvCheckMutexInit(lv_mutex_t * pxMutex)
if(pxMutex->xIsInitialized == pdFALSE) {
/* Mutex initialization must be in a critical section to prevent two threads
* from initializing it at the same time. */
- taskENTER_CRITICAL();
+ _enter_critical();
/* Check again that the mutex is still uninitialized, i.e. it wasn't
* initialized while this function was waiting to enter the critical
@@ -346,7 +362,7 @@ static void prvCheckMutexInit(lv_mutex_t * pxMutex)
}
/* Exit the critical section. */
- taskEXIT_CRITICAL();
+ _exit_critical();
}
}
@@ -385,7 +401,7 @@ static void prvCheckCondInit(lv_thread_sync_t * pxCond)
if(pxCond->xIsInitialized == pdFALSE) {
/* Cond initialization must be in a critical section to prevent two
* threads from initializing it at the same time. */
- taskENTER_CRITICAL();
+ _enter_critical();
/* Check again that the condition is still uninitialized, i.e. it wasn't
* initialized while this function was waiting to enter the critical
@@ -395,7 +411,7 @@ static void prvCheckCondInit(lv_thread_sync_t * pxCond)
}
/* Exit the critical section. */
- taskEXIT_CRITICAL();
+ _exit_critical();
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.h b/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.h
index 06f98f39a..093500611 100644
--- a/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.h
+++ b/lib/libesp32_lvgl/lvgl/src/osal/lv_freertos.h
@@ -23,9 +23,15 @@ extern "C" {
#if LV_USE_OS == LV_OS_FREERTOS
+#if (ESP_PLATFORM)
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "freertos/semphr.h"
+#else
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
+#endif
/*********************
* DEFINES
diff --git a/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.c b/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.c
index acc73f004..40a7a383c 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.c
@@ -9,12 +9,13 @@
#include "lv_file_explorer.h"
#if LV_USE_FILE_EXPLORER != 0
+#include "../../lvgl.h"
#include "../../core/lv_global.h"
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_file_explorer_class
+#define MY_CLASS (&lv_file_explorer_class)
#define FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH (22)
#define FILE_EXPLORER_BROWSER_AREA_WIDTH (100 - FILE_EXPLORER_QUICK_ACCESS_AREA_WIDTH)
@@ -174,15 +175,6 @@ lv_obj_t * lv_file_explorer_get_header(lv_obj_t * obj)
return explorer->head_area;
}
-lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj)
-{
- LV_ASSERT_OBJ(obj, MY_CLASS);
-
- lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj;
-
- return explorer->quick_access_area;
-}
-
lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -193,6 +185,15 @@ lv_obj_t * lv_file_explorer_get_path_label(lv_obj_t * obj)
}
#if LV_FILE_EXPLORER_QUICK_ACCESS
+lv_obj_t * lv_file_explorer_get_quick_access_area(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_file_explorer_t * explorer = (lv_file_explorer_t *)obj;
+
+ return explorer->quick_access_area;
+}
+
lv_obj_t * lv_file_explorer_get_places_list(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
@@ -563,7 +564,8 @@ static void show_dir(lv_obj_t * obj, const char * path)
lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_IMAGE " %s", fn);
lv_table_set_cell_value(explorer->file_table, index, 1, "1");
}
- else if((is_end_with(fn, ".mp3") == true) || (is_end_with(fn, ".MP3") == true)) {
+ else if((is_end_with(fn, ".mp3") == true) || (is_end_with(fn, ".MP3") == true) || \
+ (is_end_with(fn, ".wav") == true) || (is_end_with(fn, ".WAV") == true)) {
lv_table_set_cell_value_fmt(explorer->file_table, index, 0, LV_SYMBOL_AUDIO " %s", fn);
lv_table_set_cell_value(explorer->file_table, index, 1, "2");
}
diff --git a/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.h b/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.h
index cdebe7a49..9d1c3cc8a 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/file_explorer/lv_file_explorer.h
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../core/lv_obj.h"
#if LV_USE_FILE_EXPLORER != 0
diff --git a/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.c b/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.c
index 4a358baed..1cb6a5e54 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.c
@@ -10,12 +10,12 @@
#if LV_USE_IME_PINYIN != 0
#include
-#include "../../core/lv_global.h"
+#include "../../lvgl.h"
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_ime_pinyin_class
+#define MY_CLASS (&lv_ime_pinyin_class)
#define cand_len LV_GLOBAL_DEFAULT()->ime_cand_len
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.h b/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.h
index a7dee9612..a342d2c72 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/ime/lv_ime_pinyin.h
@@ -12,7 +12,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../core/lv_obj.h"
#if LV_USE_IME_PINYIN != 0
diff --git a/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.c b/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.c
index 5a617ad80..1a7768852 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.c
@@ -6,7 +6,7 @@
/*********************
* INCLUDES
*********************/
-#include "lv_imgfont.h"
+#include "../../lvgl.h"
#if LV_USE_IMGFONT
@@ -112,12 +112,12 @@ static bool imgfont_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t *
}
dsc_out->is_placeholder = 0;
- dsc_out->adv_w = header.w;
- dsc_out->box_w = header.w;
- dsc_out->box_h = header.h;
- dsc_out->bpp = LV_IMGFONT_BPP; /* is image identifier */
- dsc_out->ofs_x = 0;
- dsc_out->ofs_y = offset_y;
+ dsc_out->adv_w = header.w;
+ dsc_out->box_w = header.w;
+ dsc_out->box_h = header.h;
+ dsc_out->ofs_x = 0;
+ dsc_out->ofs_y = offset_y;
+ dsc_out->format = LV_FONT_GLYPH_FORMAT_IMAGE; /* is image identifier */
return true;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.h b/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.h
index 247ce8d39..68c317a6d 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/imgfont/lv_imgfont.h
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../font/lv_font.h"
#if LV_USE_IMGFONT
diff --git a/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.c b/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.c
index 1259a9d3c..9f970919d 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.c
@@ -10,6 +10,11 @@
#if LV_USE_MONKEY != 0
+#include "../../misc/lv_math.h"
+#include "../../misc/lv_assert.h"
+#include "../../stdlib/lv_mem.h"
+#include "../../display/lv_display.h"
+
/*********************
* DEFINES
*********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.h b/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.h
index 92b024d09..3791abc85 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/monkey/lv_monkey.h
@@ -12,7 +12,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../indev/lv_indev.h"
#if LV_USE_MONKEY != 0
diff --git a/lib/libesp32_lvgl/lvgl/src/others/observer/lv_observer.c b/lib/libesp32_lvgl/lvgl/src/others/observer/lv_observer.c
index 6298c8d52..10b3186d2 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/observer/lv_observer.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/observer/lv_observer.c
@@ -358,16 +358,24 @@ void lv_subject_remove_all_obj(lv_subject_t * subject, lv_obj_t * obj)
LV_LOG_WARN("Subject not initialized yet");
return;
}
+
while(lv_obj_remove_event_cb(obj, unsubscribe_on_delete_cb));
+
+#if LV_USE_BUTTON
while(lv_obj_remove_event_cb(obj, btn_value_changed_event_cb));
+#endif /*LV_USE_BUTTON*/
+
+#if LV_USE_ARC
while(lv_obj_remove_event_cb(obj, arc_value_changed_event_cb));
+#endif /*LV_USE_ARC*/
+
#if LV_USE_ROLLER
while(lv_obj_remove_event_cb(obj, roller_value_changed_event_cb));
-#endif
+#endif /*LV_USE_ROLLER*/
#if LV_USE_DROPDOWN
while(lv_obj_remove_event_cb(obj, dropdown_value_changed_event_cb));
-#endif
+#endif /*LV_USE_DROPDOWN*/
lv_observer_t * observer = _lv_ll_get_head(&subject->subs_ll);
while(observer) {
diff --git a/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.c b/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.c
index 0238448e8..021467bea 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.c
@@ -39,38 +39,41 @@
* GLOBAL FUNCTIONS
**********************/
-uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_color_format_t cf)
+/**
+ * Create a draw buffer for object to store the snapshot image.
+ */
+lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf)
{
- LV_ASSERT_NULL(obj);
- switch(cf) {
- case LV_COLOR_FORMAT_RGB565:
- case LV_COLOR_FORMAT_RGB888:
- case LV_COLOR_FORMAT_XRGB8888:
- case LV_COLOR_FORMAT_ARGB8888:
- break;
- default:
- LV_LOG_WARN("Not supported color format");
- return 0;
- }
-
lv_obj_update_layout(obj);
-
- /*Width and height determine snapshot image size.*/
int32_t w = lv_obj_get_width(obj);
int32_t h = lv_obj_get_height(obj);
int32_t ext_size = _lv_obj_get_ext_draw_size(obj);
w += ext_size * 2;
h += ext_size * 2;
+ if(w == 0 || h == 0) return NULL;
- return lv_draw_buf_width_to_stride(w, cf) * h;
+ return lv_draw_buf_create(w, h, cf, LV_STRIDE_AUTO);
}
-lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf,
- uint32_t buf_size)
+lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf)
+{
+ lv_obj_update_layout(obj);
+ int32_t w = lv_obj_get_width(obj);
+ int32_t h = lv_obj_get_height(obj);
+ int32_t ext_size = _lv_obj_get_ext_draw_size(obj);
+ w += ext_size * 2;
+ h += ext_size * 2;
+ if(w == 0 || h == 0) return LV_RESULT_INVALID;
+
+ draw_buf = lv_draw_buf_reshape(draw_buf, LV_COLOR_FORMAT_UNKNOWN, w, h, LV_STRIDE_AUTO);
+ return draw_buf == NULL ? LV_RESULT_INVALID : LV_RESULT_OK;
+}
+
+lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf)
{
LV_ASSERT_NULL(obj);
- LV_ASSERT_NULL(dsc);
- LV_ASSERT_NULL(buf);
+ LV_ASSERT_NULL(draw_buf);
+ lv_result_t res;
switch(cf) {
case LV_COLOR_FORMAT_RGB565:
@@ -83,38 +86,23 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima
return LV_RESULT_INVALID;
}
- uint32_t buf_size_needed = lv_snapshot_buf_size_needed(obj, cf);
- if(buf_size_needed == 0 || buf_size < buf_size_needed) return LV_RESULT_INVALID;
+ res = lv_snapshot_reshape_draw_buf(obj, draw_buf);
+ if(res != LV_RESULT_OK) return res;
- LV_ASSERT_MSG(buf == lv_draw_buf_align(buf, cf), "Buffer is not aligned");
-
- /*Width and height determine snapshot image size.*/
- int32_t w = lv_obj_get_width(obj);
- int32_t h = lv_obj_get_height(obj);
- int32_t ext_size = _lv_obj_get_ext_draw_size(obj);
- w += ext_size * 2;
- h += ext_size * 2;
+ /* clear draw buffer*/
+ lv_draw_buf_clear(draw_buf, NULL);
lv_area_t snapshot_area;
+ int32_t w = draw_buf->header.w;
+ int32_t h = draw_buf->header.h;
+ int32_t ext_size = _lv_obj_get_ext_draw_size(obj);
lv_obj_get_coords(obj, &snapshot_area);
lv_area_increase(&snapshot_area, ext_size, ext_size);
- lv_memzero(buf, buf_size);
- dsc->data = buf;
- dsc->data_size = buf_size_needed;
- /*Keep header flags unchanged, because we don't know if it's allocated or not.*/
- dsc->header.w = w;
- dsc->header.h = h;
- dsc->header.cf = cf;
- dsc->header.magic = LV_IMAGE_HEADER_MAGIC;
-
lv_layer_t layer;
lv_memzero(&layer, sizeof(layer));
- lv_draw_buf_t draw_buf;
- lv_draw_buf_from_image(&draw_buf, dsc);
-
- layer.draw_buf = &draw_buf;
+ layer.draw_buf = draw_buf;
layer.buf_area.x1 = snapshot_area.x1;
layer.buf_area.y1 = snapshot_area.y1;
layer.buf_area.x2 = snapshot_area.x1 + w - 1;
@@ -141,33 +129,18 @@ lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_ima
return LV_RESULT_OK;
}
-lv_image_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf)
+lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf)
{
LV_ASSERT_NULL(obj);
- int32_t w = lv_obj_get_width(obj);
- int32_t h = lv_obj_get_height(obj);
- int32_t ext_size = _lv_obj_get_ext_draw_size(obj);
- w += ext_size * 2;
- h += ext_size * 2;
- if(w == 0 || h == 0) return NULL;
-
- lv_draw_buf_t * draw_buf = lv_draw_buf_create(w, h, cf, LV_STRIDE_AUTO);
+ lv_draw_buf_t * draw_buf = lv_snapshot_create_draw_buf(obj, cf);
if(draw_buf == NULL) return NULL;
- if(lv_snapshot_take_to_buf(obj, cf, (lv_image_dsc_t *)draw_buf, draw_buf->data, draw_buf->data_size) != LV_RESULT_OK) {
+ if(lv_snapshot_take_to_draw_buf(obj, cf, draw_buf) != LV_RESULT_OK) {
lv_draw_buf_destroy(draw_buf);
return NULL;
}
- return (lv_image_dsc_t *)draw_buf;
-}
-
-void lv_snapshot_free(lv_image_dsc_t * dsc)
-{
- if(!dsc)
- return;
-
- lv_draw_buf_destroy((lv_draw_buf_t *)dsc);
+ return draw_buf;
}
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.h b/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.h
index d1823501a..f8cd0cae2 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/snapshot/lv_snapshot.h
@@ -32,27 +32,51 @@ extern "C" {
**********************/
/**
- * Take snapshot for object with its children, alloc the memory needed.
+ * Take snapshot for object with its children, create the draw buffer as needed.
* @param obj the object to generate snapshot.
* @param cf color format for generated image.
- * @return a pointer to an image descriptor, or NULL if failed.
+ * @return a pointer to an draw buffer containing snapshot image, or NULL if failed.
*/
-lv_image_dsc_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf);
+lv_draw_buf_t * lv_snapshot_take(lv_obj_t * obj, lv_color_format_t cf);
/**
+ * Create a draw buffer to store the snapshot image for object.
+ * @param obj the object to generate snapshot.
+ * @param cf color format for generated image.
+ * @return a pointer to an draw buffer ready for taking snapshot, or NULL if failed.
+ */
+lv_draw_buf_t * lv_snapshot_create_draw_buf(lv_obj_t * obj, lv_color_format_t cf);
+
+/**
+ * Reshape the draw buffer to prepare for taking snapshot for obj.
+ * This is usually used to check if the existing draw buffer is enough for
+ * obj snapshot. If return LV_RESULT_INVALID, you should create a new one.
+ * @param draw_buf the draw buffer to reshape.
+ * @param obj the object to generate snapshot.
+ */
+lv_result_t lv_snapshot_reshape_draw_buf(lv_obj_t * obj, lv_draw_buf_t * draw_buf);
+
+/**
+ * Take snapshot for object with its children, save image info to provided buffer.
+ * @param obj the object to generate snapshot.
+ * @param cf color format for new snapshot image.
+ * It could differ with cf of `draw_buf` as long as the new cf will fit in.
+ * @param draw_buf the draw buffer to store the image result. It's reshaped automatically.
+ * @return LV_RESULT_OK on success, LV_RESULT_INVALID on error.
+ */
+lv_result_t lv_snapshot_take_to_draw_buf(lv_obj_t * obj, lv_color_format_t cf, lv_draw_buf_t * draw_buf);
+
+/**
+ * @deprecated Use `lv_draw_buf_destroy` instead.
+ *
* Free the snapshot image returned by @ref lv_snapshot_take
- * It will firstly free the data image takes, then the image descriptor.
* @param dsc the image descriptor generated by lv_snapshot_take.
*/
-void lv_snapshot_free(lv_image_dsc_t * dsc);
-
-/**
- * Get the buffer needed for object snapshot image.
- * @param obj the object to generate snapshot.
- * @param cf color format for generated image.
- * @return the buffer size needed in bytes
- */
-uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_color_format_t cf);
+static inline void lv_snapshot_free(lv_image_dsc_t * dsc)
+{
+ LV_LOG_WARN("Deprecated API, use lv_draw_buf_destroy directly.");
+ lv_draw_buf_destroy((lv_draw_buf_t *)dsc);
+}
/**
* Take snapshot for object with its children, save image info to provided buffer.
@@ -62,9 +86,21 @@ uint32_t lv_snapshot_buf_size_needed(lv_obj_t * obj, lv_color_format_t cf);
* @param buf the buffer to store image data. It must meet align requirement.
* @param buf_size provided buffer size in bytes.
* @return LV_RESULT_OK on success, LV_RESULT_INVALID on error.
+ * @deprecated Use lv_snapshot_take_to_draw_buf instead.
*/
-lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc, void * buf,
- uint32_t buf_size);
+static inline lv_result_t lv_snapshot_take_to_buf(lv_obj_t * obj, lv_color_format_t cf, lv_image_dsc_t * dsc,
+ void * buf,
+ uint32_t buf_size)
+{
+ lv_draw_buf_t draw_buf;
+ LV_LOG_WARN("Deprecated API, use lv_snapshot_take_to_draw_buf instead.");
+ lv_draw_buf_init(&draw_buf, 1, 1, cf, buf_size, buf, buf_size);
+ lv_result_t res = lv_snapshot_take_to_draw_buf(obj, cf, &draw_buf);
+ if(res == LV_RESULT_OK) {
+ lv_memcpy((void *)dsc, &draw_buf, sizeof(lv_image_dsc_t));
+ }
+ return res;
+}
/**********************
* MACROS
diff --git a/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.c b/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.c
index 50bb83d66..a9f311fbc 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.c
@@ -19,7 +19,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_sysmon_class
+#define MY_CLASS (&lv_sysmon_class)
#define SYSMON_REFR_PERIOD_DEF 300 /* ms */
@@ -45,8 +45,6 @@
* STATIC PROTOTYPES
**********************/
-static void sysmon_backend_init_async_cb(void * user_data);
-
#if _USE_PERF_MONITOR
static void perf_update_timer_cb(lv_timer_t * t);
static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject);
@@ -82,16 +80,17 @@ void _lv_sysmon_builtin_init(void)
lv_subject_init_pointer(&sysmon_mem.subject, &mem_info);
sysmon_mem.timer = lv_timer_create(mem_update_timer_cb, SYSMON_REFR_PERIOD_DEF, &mem_info);
#endif
-
- lv_async_call(sysmon_backend_init_async_cb, NULL);
}
void _lv_sysmon_builtin_deinit(void)
{
- lv_async_call_cancel(sysmon_backend_init_async_cb, NULL);
#if _USE_PERF_MONITOR
lv_timer_delete(sysmon_perf.timer);
#endif
+
+#if _USE_MEM_MONITOR
+ lv_timer_delete(sysmon_mem.timer);
+#endif
}
lv_obj_t * lv_sysmon_create(lv_obj_t * parent)
@@ -127,42 +126,77 @@ static void perf_monitor_disp_event_cb(lv_event_t * e)
info->measured.refr_cnt++;
break;
case LV_EVENT_RENDER_START:
+ info->measured.render_in_progress = 1;
info->measured.render_start = lv_tick_get();
break;
case LV_EVENT_RENDER_READY:
+ info->measured.render_in_progress = 0;
info->measured.render_elaps_sum += lv_tick_elaps(info->measured.render_start);
info->measured.render_cnt++;
break;
case LV_EVENT_FLUSH_START:
- info->measured.flush_start = lv_tick_get();
+ case LV_EVENT_FLUSH_WAIT_START:
+ if(info->measured.render_in_progress) {
+ info->measured.flush_in_render_start = lv_tick_get();
+ }
+ else {
+ info->measured.flush_not_in_render_start = lv_tick_get();
+ }
break;
case LV_EVENT_FLUSH_FINISH:
- info->measured.flush_elaps_sum += lv_tick_elaps(info->measured.flush_start);
- info->measured.flush_cnt++;
+ case LV_EVENT_FLUSH_WAIT_FINISH:
+ if(info->measured.render_in_progress) {
+ info->measured.flush_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_in_render_start);
+ }
+ else {
+ info->measured.flush_not_in_render_elaps_sum += lv_tick_elaps(info->measured.flush_not_in_render_start);
+ }
break;
default:
break;
}
}
-uint32_t lv_os_get_idle_percent(void);
static void perf_update_timer_cb(lv_timer_t * t)
{
+ /*Wait for a display*/
+ if(!sysmon_perf.inited && lv_display_get_default()) {
+ lv_display_add_event_cb(lv_display_get_default(), perf_monitor_disp_event_cb, LV_EVENT_ALL, NULL);
+
+ lv_obj_t * obj1 = lv_sysmon_create(lv_layer_sys());
+ lv_obj_align(obj1, LV_USE_PERF_MONITOR_POS, 0, 0);
+ lv_subject_add_observer_obj(&sysmon_perf.subject, perf_observer_cb, obj1, NULL);
+#if LV_USE_PERF_MONITOR_LOG_MODE
+ lv_obj_add_flag(obj1, LV_OBJ_FLAG_HIDDEN);
+#endif
+ sysmon_perf.inited = true;
+ }
+
+ if(!sysmon_perf.inited) return;
+
uint32_t LV_SYSMON_GET_IDLE(void);
lv_sysmon_perf_info_t * info = lv_timer_get_user_data(t);
info->calculated.run_cnt++;
- info->calculated.fps = info->measured.refr_interval_sum ? (1000 * info->measured.refr_cnt /
- info->measured.refr_interval_sum) : 0;
+ uint32_t time_since_last_report = lv_tick_elaps(info->measured.last_report_timestamp);
+ lv_timer_t * disp_refr_timer = lv_display_get_refr_timer(NULL);
+ uint32_t disp_refr_period = disp_refr_timer->period;
+
+ info->calculated.fps = info->measured.refr_interval_sum ? (1000 * info->measured.refr_cnt / time_since_last_report) : 0;
+ info->calculated.fps = LV_MIN(info->calculated.fps,
+ 1000 / disp_refr_period); /*Limit due to possible off-by-one error*/
+
info->calculated.cpu = 100 - LV_SYSMON_GET_IDLE();
info->calculated.refr_avg_time = info->measured.refr_cnt ? (info->measured.refr_elaps_sum / info->measured.refr_cnt) :
0;
- info->calculated.flush_avg_time = info->measured.flush_cnt ? (info->measured.flush_elaps_sum / info->measured.flush_cnt)
- : 0;
+
+ info->calculated.flush_avg_time = info->measured.render_cnt ?
+ ((info->measured.flush_in_render_elaps_sum + info->measured.flush_not_in_render_elaps_sum)
+ / info->measured.render_cnt) : 0;
/*Flush time was measured in rendering time so subtract it*/
info->calculated.render_avg_time = info->measured.render_cnt ? ((info->measured.render_elaps_sum -
- info->measured.flush_elaps_sum) /
+ info->measured.flush_in_render_elaps_sum) /
info->measured.render_cnt) : 0;
info->calculated.cpu_avg_total = ((info->calculated.cpu_avg_total * (info->calculated.run_cnt - 1)) +
@@ -178,6 +212,8 @@ static void perf_update_timer_cb(lv_timer_t * t)
info->calculated.cpu_avg_total = prev_info.calculated.cpu_avg_total;
info->calculated.fps_avg_total = prev_info.calculated.fps_avg_total;
info->calculated.run_cnt = prev_info.calculated.run_cnt;
+
+ info->measured.last_report_timestamp = lv_tick_get();
}
static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
@@ -188,11 +224,11 @@ static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
#if LV_USE_PERF_MONITOR_LOG_MODE
LV_UNUSED(label);
LV_LOG("sysmon: "
- "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32 " | flush_cnt: %" LV_PRIu32 "), "
+ "%" LV_PRIu32 " FPS (refr_cnt: %" LV_PRIu32 " | redraw_cnt: %" LV_PRIu32"), "
"refr %" LV_PRIu32 "ms (render %" LV_PRIu32 "ms | flush %" LV_PRIu32 "ms), "
"CPU %" LV_PRIu32 "%%\n",
- perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt, perf->measured.flush_cnt,
- perf->calculated.refr_avg_time, perf->calculated.render_real_avg_time, perf->calculated.flush_avg_time,
+ perf->calculated.fps, perf->measured.refr_cnt, perf->measured.render_cnt,
+ perf->calculated.refr_avg_time, perf->calculated.render_avg_time, perf->calculated.flush_avg_time,
perf->calculated.cpu);
#else
lv_label_set_text_fmt(
@@ -212,6 +248,16 @@ static void perf_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
static void mem_update_timer_cb(lv_timer_t * t)
{
+ /*Wait for a display*/
+ if(!sysmon_mem.inited && lv_display_get_default()) {
+ lv_obj_t * obj2 = lv_sysmon_create(lv_layer_sys());
+ lv_obj_align(obj2, LV_USE_MEM_MONITOR_POS, 0, 0);
+ lv_subject_add_observer_obj(&sysmon_mem.subject, mem_observer_cb, obj2, NULL);
+ sysmon_mem.inited = true;
+ }
+
+ if(!sysmon_mem.inited) return;
+
lv_mem_monitor_t * mem_mon = lv_timer_get_user_data(t);
lv_mem_monitor(mem_mon);
lv_subject_set_pointer(&sysmon_mem.subject, mem_mon);
@@ -222,39 +268,19 @@ static void mem_observer_cb(lv_observer_t * observer, lv_subject_t * subject)
lv_obj_t * label = lv_observer_get_target(observer);
const lv_mem_monitor_t * mon = lv_subject_get_pointer(subject);
- uint32_t used_size = mon->total_size - mon->free_size;;
- uint32_t used_kb = used_size / 1024;
- uint32_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
+ size_t used_size = mon->total_size - mon->free_size;;
+ size_t used_kb = used_size / 1024;
+ size_t used_kb_tenth = (used_size - (used_kb * 1024)) / 102;
+ size_t max_used_kb = mon->max_used / 1024;
+ size_t max_used_kb_tenth = (mon->max_used - (max_used_kb * 1024)) / 102;
lv_label_set_text_fmt(label,
- "%"LV_PRIu32 ".%"LV_PRIu32 " kB, %d%%\n"
- "%d%% frag.",
+ "%zu.%zu kB (%d%%)\n"
+ "%zu.%zu kB max, %d%% frag.",
used_kb, used_kb_tenth, mon->used_pct,
+ max_used_kb, max_used_kb_tenth,
mon->frag_pct);
}
#endif
-static void sysmon_backend_init_async_cb(void * user_data)
-{
- LV_UNUSED(user_data);
-
-#if _USE_PERF_MONITOR
- lv_display_add_event_cb(lv_display_get_default(), perf_monitor_disp_event_cb, LV_EVENT_ALL, NULL);
-
- lv_obj_t * obj1 = lv_sysmon_create(lv_layer_sys());
- lv_obj_align(obj1, LV_USE_PERF_MONITOR_POS, 0, 0);
- lv_subject_add_observer_obj(&sysmon_perf.subject, perf_observer_cb, obj1, NULL);
-#if LV_USE_PERF_MONITOR_LOG_MODE
- lv_obj_add_flag(obj1, LV_OBJ_FLAG_HIDDEN);
-#endif
-
-#endif
-
-#if _USE_MEM_MONITOR
- lv_obj_t * obj2 = lv_sysmon_create(lv_layer_sys());
- lv_obj_align(obj2, LV_USE_MEM_MONITOR_POS, 0, 0);
- lv_subject_add_observer_obj(&sysmon_mem.subject, mem_observer_cb, obj2, NULL);
-#endif
-}
-
#endif /*LV_USE_SYSMON*/
diff --git a/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.h b/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.h
index 132a132d6..849e4d86d 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/sysmon/lv_sysmon.h
@@ -38,11 +38,13 @@ extern "C" {
typedef struct {
lv_subject_t subject;
lv_timer_t * timer;
+ bool inited;
} lv_sysmon_backend_data_t;
#if LV_USE_PERF_MONITOR
typedef struct {
struct {
+ bool inited;
uint32_t refr_start;
uint32_t refr_interval_sum;
uint32_t refr_elaps_sum;
@@ -50,9 +52,12 @@ typedef struct {
uint32_t render_start;
uint32_t render_elaps_sum; /*Contains the flush time too*/
uint32_t render_cnt;
- uint32_t flush_start;
- uint32_t flush_elaps_sum;
- uint32_t flush_cnt;
+ uint32_t flush_in_render_start;
+ uint32_t flush_in_render_elaps_sum;
+ uint32_t flush_not_in_render_start;
+ uint32_t flush_not_in_render_elaps_sum;
+ uint32_t last_report_timestamp;
+ uint32_t render_in_progress : 1;
} measured;
struct {
diff --git a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite.h b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite.h
index f7a613700..2f970fbca 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite.h
+++ b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite.h
@@ -589,6 +589,7 @@ typedef unsigned int vg_lite_color_t;
typedef enum vg_lite_param_type
{
VG_LITE_SCISSOR_RECT, /*! count must be 4n for x, y, right, bottom */
+ VG_LITE_GPU_IDLE_STATE, /*! 0: busy, 1: idle */
} vg_lite_param_type_t;
/* VGLite API Structures ******************************************************************************************************************/
diff --git a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c
index a152fca9e..a6e57d104 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c
+++ b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_matrix.c
@@ -159,4 +159,4 @@ vg_lite_error_t vg_lite_rotate(vg_lite_float_t degrees, vg_lite_matrix_t * matri
* STATIC FUNCTIONS
**********************/
-#endif /*LV_USE_VG_LITE_THORVG*/
\ No newline at end of file
+#endif /*LV_USE_VG_LITE_THORVG*/
diff --git a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp
index 0daa28fa1..97c63d71d 100644
--- a/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp
+++ b/lib/libesp32_lvgl/lvgl/src/others/vg_lite_tvg/vg_lite_tvg.cpp
@@ -27,10 +27,6 @@
* DEFINES
*********************/
-#ifndef LV_VG_LITE_THORVG_BUF_ADDR_ALIGN
- #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64
-#endif
-
#define TVG_CANVAS_ENGINE CanvasEngine::Sw
#define TVG_COLOR(COLOR) B(COLOR), G(COLOR), R(COLOR), A(COLOR)
#define TVG_IS_VG_FMT_SUPPORT(fmt) ((fmt) == VG_LITE_BGRA8888 || (fmt) == VG_LITE_BGRX8888)
@@ -123,6 +119,11 @@ typedef struct {
uint8_t alpha;
} vg_color32_t;
+typedef struct {
+ vg_lite_float_t x;
+ vg_lite_float_t y;
+} vg_lite_fpoint_t;
+
#pragma pack()
class vg_lite_ctx
@@ -156,11 +157,6 @@ class vg_lite_ctx
{
vg_lite_uint32_t px_size = w * h;
if(px_size > dest_buffer.size()) {
-
- /* During resize, the first address of the vector may change
- * to ensure that there is no unfinished drawing.
- */
- LV_ASSERT(target_buffer == nullptr);
dest_buffer.resize(w * h);
}
return dest_buffer.data();
@@ -273,6 +269,8 @@ static vg_lite_error_t vg_lite_error_conv(Result result);
static Matrix matrix_conv(const vg_lite_matrix_t * matrix);
static FillRule fill_rule_conv(vg_lite_fill_t fill);
static BlendMethod blend_method_conv(vg_lite_blend_t blend);
+static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap);
+static StrokeJoin stroke_join_conv(vg_lite_join_style_t join);
static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix);
static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_buffer_t * target,
const vg_lite_rectangle_t * rect);
@@ -297,6 +295,10 @@ static void get_format_bytes(vg_lite_buffer_format_t format,
vg_lite_uint32_t * div,
vg_lite_uint32_t * bytes_align);
+static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point);
+static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix);
+static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult);
+
/**********************
* STATIC VARIABLES
**********************/
@@ -623,6 +625,17 @@ extern "C" {
}
}
+ static void picture_bgra8888_to_bgr888(vg_color24_t * dest, const vg_color32_t * src, vg_lite_uint32_t px_size)
+ {
+ while(px_size--) {
+ dest->red = src->red;
+ dest->green = src->green;
+ dest->blue = src->blue;
+ src++;
+ dest++;
+ }
+ }
+
vg_lite_error_t vg_lite_finish(void)
{
vg_lite_ctx * ctx = vg_lite_ctx::get_instance();
@@ -634,32 +647,43 @@ extern "C" {
TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->sync());
TVG_CHECK_RETURN_VG_ERROR(ctx->canvas->clear(true));
- /* If target_buffer is not in a format supported by thorvg, software conversion is required. */
- if(ctx->target_buffer) {
- switch(ctx->target_format) {
- case VG_LITE_BGR565:
- picture_bgra8888_to_bgr565(
- (vg_color16_t *)ctx->target_buffer,
- (const vg_color32_t *)ctx->get_temp_target_buffer(),
- ctx->target_px_size);
- break;
- case VG_LITE_BGRA5658:
- picture_bgra8888_to_bgra5658(
- (vg_color16_alpha_t *)ctx->target_buffer,
- (const vg_color32_t *)ctx->get_temp_target_buffer(),
- ctx->target_px_size);
- break;
- default:
- LV_LOG_ERROR("unsupported format: %d", ctx->target_format);
- LV_ASSERT(false);
- break;
- }
+ /* make sure target buffer is valid */
+ LV_ASSERT_NULL(ctx->target_buffer);
- /* finish convert, clean target buffer info */
- ctx->target_buffer = nullptr;
- ctx->target_px_size = 0;
+ /* If target_buffer is not in a format supported by thorvg, software conversion is required. */
+ switch(ctx->target_format) {
+ case VG_LITE_BGR565:
+ picture_bgra8888_to_bgr565(
+ (vg_color16_t *)ctx->target_buffer,
+ (const vg_color32_t *)ctx->get_temp_target_buffer(),
+ ctx->target_px_size);
+ break;
+ case VG_LITE_BGRA5658:
+ picture_bgra8888_to_bgra5658(
+ (vg_color16_alpha_t *)ctx->target_buffer,
+ (const vg_color32_t *)ctx->get_temp_target_buffer(),
+ ctx->target_px_size);
+ break;
+ case VG_LITE_BGR888:
+ picture_bgra8888_to_bgr888(
+ (vg_color24_t *)ctx->target_buffer,
+ (const vg_color32_t *)ctx->get_temp_target_buffer(),
+ ctx->target_px_size);
+ break;
+ case VG_LITE_BGRA8888:
+ case VG_LITE_BGRX8888:
+ /* No conversion required. */
+ break;
+ default:
+ LV_LOG_ERROR("unsupported format: %d", ctx->target_format);
+ LV_ASSERT(false);
+ break;
}
+ /* finish convert, clean target buffer info */
+ ctx->target_buffer = nullptr;
+ ctx->target_px_size = 0;
+
return VG_LITE_SUCCESS;
}
@@ -689,6 +713,65 @@ extern "C" {
return VG_LITE_SUCCESS;
}
+ vg_lite_error_t vg_lite_set_stroke(vg_lite_path_t * path,
+ vg_lite_cap_style_t cap_style,
+ vg_lite_join_style_t join_style,
+ vg_lite_float_t line_width,
+ vg_lite_float_t miter_limit,
+ vg_lite_float_t * dash_pattern,
+ vg_lite_uint32_t pattern_count,
+ vg_lite_float_t dash_phase,
+ vg_lite_color_t color)
+ {
+ if(!path || line_width <= 0) {
+ return VG_LITE_INVALID_ARGUMENT;
+ }
+
+ if(miter_limit < 1.0f) {
+ miter_limit = 1.0f;
+ }
+
+ if(!path->stroke) {
+ path->stroke = (vg_lite_stroke_t *)lv_malloc_zeroed(sizeof(vg_lite_stroke_t));
+
+ if(!path->stroke) {
+ return VG_LITE_OUT_OF_RESOURCES;
+ }
+ }
+
+ path->stroke->cap_style = cap_style;
+ path->stroke->join_style = join_style;
+ path->stroke->line_width = line_width;
+ path->stroke->miter_limit = miter_limit;
+ path->stroke->half_width = line_width / 2.0f;
+ path->stroke->miter_square = path->stroke->miter_limit * path->stroke->miter_limit;
+ path->stroke->dash_pattern = dash_pattern;
+ path->stroke->pattern_count = pattern_count;
+ path->stroke->dash_phase = dash_phase;
+ path->stroke_color = color;
+ return VG_LITE_SUCCESS;
+ }
+
+ vg_lite_error_t vg_lite_update_stroke(vg_lite_path_t * path)
+ {
+ LV_UNUSED(path);
+ return VG_LITE_SUCCESS;
+ }
+
+ vg_lite_error_t vg_lite_set_path_type(vg_lite_path_t * path, vg_lite_path_type_t path_type)
+ {
+ if(!path ||
+ (path_type != VG_LITE_DRAW_FILL_PATH &&
+ path_type != VG_LITE_DRAW_STROKE_PATH &&
+ path_type != VG_LITE_DRAW_FILL_STROKE_PATH)
+ )
+ return VG_LITE_INVALID_ARGUMENT;
+
+ path->path_type = path_type;
+
+ return VG_LITE_SUCCESS;
+ }
+
vg_lite_error_t vg_lite_get_register(vg_lite_uint32_t address, vg_lite_uint32_t * result)
{
LV_UNUSED(address);
@@ -717,7 +800,6 @@ extern "C" {
{
switch(feature) {
case gcFEATURE_BIT_VG_IM_INDEX_FORMAT:
- case gcFEATURE_BIT_VG_SCISSOR:
case gcFEATURE_BIT_VG_BORDER_CULLING:
case gcFEATURE_BIT_VG_RGBA2_FORMAT:
case gcFEATURE_BIT_VG_IM_FASTCLAER:
@@ -799,8 +881,14 @@ extern "C" {
vg_lite_error_t vg_lite_clear_path(vg_lite_path_t * path)
{
- LV_UNUSED(path);
- return VG_LITE_NOT_SUPPORT;
+ LV_ASSERT_NULL(path);
+
+ if(path->stroke) {
+ lv_free(path->stroke);
+ path->stroke = NULL;
+ }
+
+ return VG_LITE_SUCCESS;
}
vg_lite_uint32_t vg_lite_get_path_length(vg_lite_uint8_t * opcode,
@@ -1596,24 +1684,32 @@ Empty_sequence_handler:
TVG_CHECK_RETURN_VG_ERROR(shape->fill(fill_rule_conv(fill_rule)););
TVG_CHECK_RETURN_VG_ERROR(shape->blend(blend_method_conv(blend)));
- float x_min = path->bounding_box[0];
- float y_min = path->bounding_box[1];
- float x_max = path->bounding_box[2];
- float y_max = path->bounding_box[3];
+ vg_lite_matrix_t grad_matrix;
+ vg_lite_identity(&grad_matrix);
+ vg_lite_matrix_inverse(&grad_matrix, matrix);
+ vg_lite_matrix_multiply(&grad_matrix, &grad->matrix);
+ vg_lite_fpoint_t p1 = {0.0f, 0.0f};
+ vg_lite_fpoint_t p2 = {1.0f, 0};
+
+ vg_lite_fpoint_t p1_trans = p1;
+ vg_lite_fpoint_t p2_trans = p2;
+
+ p1_trans = matrix_transform_point(&grad_matrix, &p1);
+ p2_trans = matrix_transform_point(&grad_matrix, &p2);
+ float dx = (p2_trans.x - p1_trans.x);
+ float dy = (p2_trans.y - p1_trans.y);
+ float scale = sqrtf(dx * dx + dy * dy);
+ float angle = (float)(atan2f(dy, dx));
+ float dlen = 256 * scale;
+ float x_min = grad_matrix.m[0][2];
+ float y_min = grad_matrix.m[1][2];
+ float x_max = x_min + dlen * cosf(angle);
+ float y_max = y_min + dlen * sinf(angle);
+ LV_LOG_TRACE("linear gradient {%.2f, %.2f} ~ {%.2f, %.2f}", x_min, y_min, x_max, y_max);
auto linearGrad = LinearGradient::gen();
-
- if(matrix->m[0][1] != 0) {
- /* vertical */
- linearGrad->linear(x_min, y_min, x_min, y_max);
- }
- else {
- /* horizontal */
- linearGrad->linear(x_min, y_min, x_max, y_min);
- }
-
- linearGrad->transform(matrix_conv(&grad->matrix));
- linearGrad->spread(FillSpread::Reflect);
+ linearGrad->linear(x_min, y_min, x_max, y_max);
+ linearGrad->spread(FillSpread::Pad);
tvg::Fill::ColorStop colorStops[VLC_MAX_GRADIENT_STOPS];
for(vg_lite_uint32_t i = 0; i < grad->count; i++) {
@@ -1758,6 +1854,26 @@ Empty_sequence_handler:
LV_UNUSED(size);
return VG_LITE_NOT_SUPPORT;
}
+
+ vg_lite_error_t vg_lite_get_parameter(vg_lite_param_type_t type,
+ vg_lite_int32_t count,
+ vg_lite_float_t * params)
+ {
+ switch(type) {
+ case VG_LITE_GPU_IDLE_STATE:
+ if(count != 1 || params == NULL) {
+ return VG_LITE_INVALID_ARGUMENT;
+ }
+
+ *(vg_lite_uint32_t *)params = 1;
+ return VG_LITE_SUCCESS;
+
+ default:
+ break;
+ }
+
+ return VG_LITE_NOT_SUPPORT;
+ }
} /* extern "C" */
/**********************
@@ -1831,6 +1947,38 @@ static BlendMethod blend_method_conv(vg_lite_blend_t blend)
return BlendMethod::Normal;
}
+static StrokeCap stroke_cap_conv(vg_lite_cap_style_t cap)
+{
+ switch(cap) {
+ case VG_LITE_CAP_SQUARE:
+ return StrokeCap::Square;
+ case VG_LITE_CAP_ROUND:
+ return StrokeCap::Round;
+ case VG_LITE_CAP_BUTT:
+ return StrokeCap::Butt;
+ default:
+ break;
+ }
+
+ return StrokeCap::Square;
+}
+
+static StrokeJoin stroke_join_conv(vg_lite_join_style_t join)
+{
+ switch(join) {
+ case VG_LITE_JOIN_BEVEL:
+ return StrokeJoin::Bevel;
+ case VG_LITE_JOIN_ROUND:
+ return StrokeJoin::Round;
+ case VG_LITE_JOIN_MITER:
+ return StrokeJoin::Miter;
+ default:
+ break;
+ }
+
+ return StrokeJoin::Bevel;
+}
+
static float vlc_get_arg(const void * data, vg_lite_format_t format)
{
switch(format) {
@@ -1904,6 +2052,29 @@ static uint8_t vlc_op_arg_len(uint8_t vlc_op)
return 0;
}
+static Result shape_set_stroke(std::unique_ptr & shape, const vg_lite_path_t * path)
+{
+ /* if path is not a stroke, return */
+ if(path->path_type == VG_LITE_DRAW_ZERO
+ || path->path_type == VG_LITE_DRAW_FILL_PATH) {
+ return Result::Success;
+ }
+
+ LV_ASSERT_NULL(path->stroke);
+ TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->line_width));
+ TVG_CHECK_RETURN_RESULT(shape->strokeMiterlimit(path->stroke->miter_limit));
+ TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_cap_conv(path->stroke->cap_style)));
+ TVG_CHECK_RETURN_RESULT(shape->stroke(stroke_join_conv(path->stroke->join_style)));
+ TVG_CHECK_RETURN_RESULT(shape->stroke(TVG_COLOR(path->stroke_color)));
+
+ if(path->stroke->pattern_count) {
+ LV_ASSERT_NULL(path->stroke->dash_pattern);
+ TVG_CHECK_RETURN_RESULT(shape->stroke(path->stroke->dash_pattern, path->stroke->pattern_count));
+ }
+
+ return Result::Success;
+}
+
static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t * path, vg_lite_matrix_t * matrix)
{
uint8_t fmt_len = vlc_format_len(path->format);
@@ -1965,9 +2136,7 @@ static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t *
break;
case VLC_OP_CLOSE:
- case VLC_OP_END: {
- TVG_CHECK_RETURN_RESULT(shape->close());
- }
+ TVG_CHECK_RETURN_RESULT(shape->close());
break;
default:
@@ -1987,6 +2156,8 @@ static Result shape_append_path(std::unique_ptr & shape, vg_lite_path_t *
return Result::Success;
}
+ TVG_CHECK_RETURN_RESULT(shape_set_stroke(shape, path));
+
auto cilp = Shape::gen();
TVG_CHECK_RETURN_RESULT(cilp->appendRect(x_min, y_min, x_max - x_min, y_max - y_min, 0, 0));
TVG_CHECK_RETURN_RESULT(cilp->transform(matrix_conv(matrix)));
@@ -2013,30 +2184,28 @@ static Result shape_append_rect(std::unique_ptr & shape, const vg_lite_bu
static Result canvas_set_target(vg_lite_ctx * ctx, vg_lite_buffer_t * target)
{
- vg_lite_uint32_t * target_buffer = nullptr;
+ void * tvg_target_buffer = nullptr;
/* if target_buffer needs to be changed, finish current drawing */
if(ctx->target_buffer && ctx->target_buffer != target->memory) {
vg_lite_finish();
}
+ ctx->target_buffer = target->memory;
ctx->target_format = target->format;
+ ctx->target_px_size = target->width * target->height;
if(TVG_IS_VG_FMT_SUPPORT(target->format)) {
/* if target format is supported by VG, use target buffer directly */
- target_buffer = (vg_lite_uint32_t *)target->memory;
- ctx->target_buffer = nullptr;
- ctx->target_px_size = 0;
+ tvg_target_buffer = target->memory;
}
else {
/* if target format is not supported by VG, use internal buffer */
- target_buffer = ctx->get_temp_target_buffer(target->width, target->height);
- ctx->target_buffer = target->memory;
- ctx->target_px_size = target->width * target->height;
+ tvg_target_buffer = ctx->get_temp_target_buffer(target->width, target->height);
}
Result res = ctx->canvas->target(
- (uint32_t *)target_buffer,
+ (uint32_t *)tvg_target_buffer,
target->width,
target->width,
target->height,
@@ -2404,4 +2573,86 @@ static void get_format_bytes(vg_lite_buffer_format_t format,
break;
}
}
+
+static vg_lite_fpoint_t matrix_transform_point(const vg_lite_matrix_t * matrix, const vg_lite_fpoint_t * point)
+{
+ vg_lite_fpoint_t p;
+ p.x = (vg_lite_float_t)(point->x * matrix->m[0][0] + point->y * matrix->m[0][1] + matrix->m[0][2]);
+ p.y = (vg_lite_float_t)(point->x * matrix->m[1][0] + point->y * matrix->m[1][1] + matrix->m[1][2]);
+ return p;
+}
+
+static bool vg_lite_matrix_inverse(vg_lite_matrix_t * result, const vg_lite_matrix_t * matrix)
+{
+ vg_lite_float_t det00, det01, det02;
+ vg_lite_float_t d;
+ bool is_affine;
+
+ /* Test for identity matrix. */
+ if(matrix == NULL) {
+ result->m[0][0] = 1.0f;
+ result->m[0][1] = 0.0f;
+ result->m[0][2] = 0.0f;
+ result->m[1][0] = 0.0f;
+ result->m[1][1] = 1.0f;
+ result->m[1][2] = 0.0f;
+ result->m[2][0] = 0.0f;
+ result->m[2][1] = 0.0f;
+ result->m[2][2] = 1.0f;
+
+ /* Success. */
+ return true;
+ }
+
+ det00 = (matrix->m[1][1] * matrix->m[2][2]) - (matrix->m[2][1] * matrix->m[1][2]);
+ det01 = (matrix->m[2][0] * matrix->m[1][2]) - (matrix->m[1][0] * matrix->m[2][2]);
+ det02 = (matrix->m[1][0] * matrix->m[2][1]) - (matrix->m[2][0] * matrix->m[1][1]);
+
+ /* Compute determinant. */
+ d = (matrix->m[0][0] * det00) + (matrix->m[0][1] * det01) + (matrix->m[0][2] * det02);
+
+ /* Return 0 if there is no inverse matrix. */
+ if(d == 0.0f)
+ return false;
+
+ /* Compute reciprocal. */
+ d = 1.0f / d;
+
+ /* Determine if the matrix is affine. */
+ is_affine = (matrix->m[2][0] == 0.0f) && (matrix->m[2][1] == 0.0f) && (matrix->m[2][2] == 1.0f);
+
+ result->m[0][0] = d * det00;
+ result->m[0][1] = d * ((matrix->m[2][1] * matrix->m[0][2]) - (matrix->m[0][1] * matrix->m[2][2]));
+ result->m[0][2] = d * ((matrix->m[0][1] * matrix->m[1][2]) - (matrix->m[1][1] * matrix->m[0][2]));
+ result->m[1][0] = d * det01;
+ result->m[1][1] = d * ((matrix->m[0][0] * matrix->m[2][2]) - (matrix->m[2][0] * matrix->m[0][2]));
+ result->m[1][2] = d * ((matrix->m[1][0] * matrix->m[0][2]) - (matrix->m[0][0] * matrix->m[1][2]));
+ result->m[2][0] = is_affine ? 0.0f : d * det02;
+ result->m[2][1] = is_affine ? 0.0f : d * ((matrix->m[2][0] * matrix->m[0][1]) - (matrix->m[0][0] * matrix->m[2][1]));
+ result->m[2][2] = is_affine ? 1.0f : d * ((matrix->m[0][0] * matrix->m[1][1]) - (matrix->m[1][0] * matrix->m[0][1]));
+
+ /* Success. */
+ return true;
+}
+
+static void vg_lite_matrix_multiply(vg_lite_matrix_t * matrix, const vg_lite_matrix_t * mult)
+{
+ vg_lite_matrix_t temp;
+ int row, column;
+
+ /* Process all rows. */
+ for(row = 0; row < 3; row++) {
+ /* Process all columns. */
+ for(column = 0; column < 3; column++) {
+ /* Compute matrix entry. */
+ temp.m[row][column] = (matrix->m[row][0] * mult->m[0][column])
+ + (matrix->m[row][1] * mult->m[1][column])
+ + (matrix->m[row][2] * mult->m[2][column]);
+ }
+ }
+
+ /* Copy temporary matrix into result. */
+ lv_memcpy(matrix->m, &temp.m, sizeof(temp.m));
+}
+
#endif
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c
index c8f3233e3..b7b707de3 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_mem_core_builtin.c
@@ -141,10 +141,13 @@ void * lv_malloc_core(size_t size)
#if LV_USE_OS
lv_mutex_lock(&state.mutex);
#endif
- state.cur_used += size;
- state.max_used = LV_MAX(state.cur_used, state.max_used);
void * p = lv_tlsf_malloc(state.tlsf, size);
+ if(p) {
+ state.cur_used += lv_tlsf_block_size(p);
+ state.max_used = LV_MAX(state.cur_used, state.max_used);
+ }
+
#if LV_USE_OS
lv_mutex_unlock(&state.mutex);
#endif
@@ -157,8 +160,14 @@ void * lv_realloc_core(void * p, size_t new_size)
lv_mutex_lock(&state.mutex);
#endif
+ size_t old_size = lv_tlsf_block_size(p);
void * p_new = lv_tlsf_realloc(state.tlsf, p, new_size);
+ if(p_new) {
+ state.cur_used -= old_size;
+ state.cur_used += lv_tlsf_block_size(p_new);
+ state.max_used = LV_MAX(state.cur_used, state.max_used);
+ }
#if LV_USE_OS
lv_mutex_unlock(&state.mutex);
#endif
@@ -175,7 +184,8 @@ void lv_free_core(void * p)
#if LV_MEM_ADD_JUNK
lv_memset(p, 0xbb, lv_tlsf_block_size(data));
#endif
- size_t size = lv_tlsf_free(state.tlsf, p);
+ size_t size = lv_tlsf_block_size(p);
+ lv_tlsf_free(state.tlsf, p);
if(state.cur_used > size) state.cur_used -= size;
else state.cur_used = 0;
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_string_builtin.c b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_string_builtin.c
index 1e8ba46ab..a033a78b9 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_string_builtin.c
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_string_builtin.c
@@ -53,7 +53,7 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len)
{
uint8_t * d8 = dst;
const uint8_t * s8 = src;
@@ -115,7 +115,7 @@ LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
return dst;
}
-LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len)
{
uint8_t * d8 = (uint8_t *)dst;
uintptr_t d_align = (lv_uintptr_t) d8 & ALIGN_MASK;
@@ -145,7 +145,7 @@ LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
}
}
-LV_ATTRIBUTE_FAST_MEM void * lv_memmove(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len)
{
if(dst < src || (char *)dst > ((char *)src + len)) {
return lv_memcpy(dst, src, len);
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_tlsf.h b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_tlsf.h
index 0fa6decbe..98126636a 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_tlsf.h
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/builtin/lv_tlsf.h
@@ -1,4 +1,4 @@
-#include "../../lv_conf_internal.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN
#ifndef LV_TLSF_H
@@ -60,8 +60,8 @@ typedef struct {
lv_mutex_t mutex;
#endif
lv_tlsf_t tlsf;
- uint32_t cur_used;
- uint32_t max_used;
+ size_t cur_used;
+ size_t max_used;
lv_ll_t pool_ll;
} lv_tlsf_state_t;
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/clib/lv_string_clib.c b/lib/libesp32_lvgl/lvgl/src/stdlib/clib/lv_string_clib.c
index 7bb35ea93..359b2e039 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/clib/lv_string_clib.c
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/clib/lv_string_clib.c
@@ -35,17 +35,17 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len)
{
return memcpy(dst, src, len);
}
-LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len)
{
memset(dst, v, len);
}
-LV_ATTRIBUTE_FAST_MEM void * lv_memmove(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len)
{
return memmove(dst, src, len);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.c b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.c
index 95c1fcb17..c1ab647e3 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.c
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.c
@@ -74,9 +74,9 @@ void * lv_malloc(size_t size)
#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
- LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d",
- (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct,
- (int)mon.free_biggest_size);
+ LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu",
+ mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct,
+ mon.free_biggest_size);
#endif
return NULL;
}
@@ -103,9 +103,9 @@ void * lv_malloc_zeroed(size_t size)
#if LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO
lv_mem_monitor_t mon;
lv_mem_monitor(&mon);
- LV_LOG_INFO("used: %6d (%3d %%), frag: %3d %%, biggest free: %6d",
- (int)(mon.total_size - mon.free_size), mon.used_pct, mon.frag_pct,
- (int)mon.free_biggest_size);
+ LV_LOG_INFO("used: %zu (%3d %%), frag: %3d %%, biggest free: %zu",
+ mon.total_size - mon.free_size, mon.used_pct, mon.frag_pct,
+ mon.free_biggest_size);
#endif
return NULL;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.h b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.h
index 48a176379..f66f3d6f0 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.h
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_mem.h
@@ -1,4 +1,4 @@
-/**
+/**
* @file lv_mem.h
*
*/
@@ -35,12 +35,12 @@ typedef void * lv_mem_pool_t;
* Heap information structure.
*/
typedef struct {
- uint32_t total_size; /**< Total heap size*/
- uint32_t free_cnt;
- uint32_t free_size; /**< Size of available memory*/
- uint32_t free_biggest_size;
- uint32_t used_cnt;
- uint32_t max_used; /**< Max size of Heap memory used*/
+ size_t total_size; /**< Total heap size*/
+ size_t free_cnt;
+ size_t free_size; /**< Size of available memory*/
+ size_t free_biggest_size;
+ size_t used_cnt;
+ size_t max_used; /**< Max size of Heap memory used*/
uint8_t used_pct; /**< Percentage used*/
uint8_t frag_pct; /**< Amount of fragmentation*/
} lv_mem_monitor_t;
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_string.h b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_string.h
index 20cda4ecf..745cd49e5 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/lv_string.h
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/lv_string.h
@@ -107,13 +107,6 @@ int32_t lv_strcmp(const char * s1, const char * s2);
*/
char * lv_strdup(const char * src);
-/**
- * @brief Duplicate a string by allocating a new one and copying the content.
- * @param src Pointer to the source of data to be copied.
- * @return A pointer to the new allocated string. NULL if failed.
- */
-char * lv_strdup(const char * src);
-
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/stdlib/rtthread/lv_string_rtthread.c b/lib/libesp32_lvgl/lvgl/src/stdlib/rtthread/lv_string_rtthread.c
index 02480c74a..86949814c 100644
--- a/lib/libesp32_lvgl/lvgl/src/stdlib/rtthread/lv_string_rtthread.c
+++ b/lib/libesp32_lvgl/lvgl/src/stdlib/rtthread/lv_string_rtthread.c
@@ -35,17 +35,17 @@
* GLOBAL FUNCTIONS
**********************/
-LV_ATTRIBUTE_FAST_MEM void * lv_memcpy(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memcpy(void * dst, const void * src, size_t len)
{
return rt_memcpy(dst, src, len);
}
-LV_ATTRIBUTE_FAST_MEM void lv_memset(void * dst, uint8_t v, size_t len)
+void LV_ATTRIBUTE_FAST_MEM lv_memset(void * dst, uint8_t v, size_t len)
{
rt_memset(dst, v, len);
}
-LV_ATTRIBUTE_FAST_MEM void * lv_memmove(void * dst, const void * src, size_t len)
+void * LV_ATTRIBUTE_FAST_MEM lv_memmove(void * dst, const void * src, size_t len)
{
return rt_memmove(dst, src, len);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/themes/default/lv_theme_default.c b/lib/libesp32_lvgl/lvgl/src/themes/default/lv_theme_default.c
index a6a5eb242..66494ba92 100644
--- a/lib/libesp32_lvgl/lvgl/src/themes/default/lv_theme_default.c
+++ b/lib/libesp32_lvgl/lvgl/src/themes/default/lv_theme_default.c
@@ -75,6 +75,7 @@ typedef struct {
lv_style_t circle;
lv_style_t no_radius;
lv_style_t clip_corner;
+ lv_style_t rotary_scroll;
#if LV_THEME_DEFAULT_GROW
lv_style_t grow;
#endif
@@ -263,6 +264,7 @@ static void style_init(my_theme_t * theme)
lv_style_set_text_font(&theme->styles.scr, theme->base.font_normal);
lv_style_set_pad_row(&theme->styles.scr, PAD_SMALL);
lv_style_set_pad_column(&theme->styles.scr, PAD_SMALL);
+ lv_style_set_rotary_sensitivity(&theme->styles.scr, theme->disp_dpi / 4 * 256);
style_init_reset(&theme->styles.card);
lv_style_set_radius(&theme->styles.card, RADIUS_DEFAULT);
@@ -386,6 +388,9 @@ static void style_init(my_theme_t * theme)
style_init_reset(&theme->styles.no_radius);
lv_style_set_radius(&theme->styles.no_radius, 0);
+ style_init_reset(&theme->styles.rotary_scroll);
+ lv_style_set_rotary_sensitivity(&theme->styles.rotary_scroll, theme->disp_dpi / 4 * 256);
+
#if LV_THEME_DEFAULT_GROW
style_init_reset(&theme->styles.grow);
lv_style_set_transform_width(&theme->styles.grow, _LV_DPX_CALC(theme->disp_dpi, 3));
@@ -747,6 +752,7 @@ static void theme_apply(lv_theme_t * th, lv_obj_t * obj)
/*Tabview pages*/
else if(parent && lv_obj_check_type(lv_obj_get_parent(parent), &lv_tabview_class)) {
lv_obj_add_style(obj, &theme->styles.pad_normal, 0);
+ lv_obj_add_style(obj, &theme->styles.rotary_scroll, 0);
lv_obj_add_style(obj, &theme->styles.scrollbar, LV_PART_SCROLLBAR);
lv_obj_add_style(obj, &theme->styles.scrollbar_scrolled, LV_PART_SCROLLBAR | LV_STATE_SCROLLED);
return;
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/animimage/lv_animimage.c b/lib/libesp32_lvgl/lvgl/src/widgets/animimage/lv_animimage.c
index a0ebdca38..d26a848d7 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/animimage/lv_animimage.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/animimage/lv_animimage.c
@@ -27,7 +27,7 @@
*********************/
#define LV_OBJX_NAME "lv_animimg"
-#define MY_CLASS &lv_animimg_class
+#define MY_CLASS (&lv_animimg_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/arc/lv_arc.c b/lib/libesp32_lvgl/lvgl/src/widgets/arc/lv_arc.c
index 4465a0b40..6d4383971 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/arc/lv_arc.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/arc/lv_arc.c
@@ -18,7 +18,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_arc_class
+#define MY_CLASS (&lv_arc_class)
#define VALUE_UNSET INT16_MIN
#define CLICK_OUTSIDE_BG_ANGLES ((uint32_t) 0x00U)
@@ -469,11 +469,10 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e)
if(arc->dragging == false) {
int32_t indic_width = lv_obj_get_style_arc_width(obj, LV_PART_INDICATOR);
r -= indic_width;
- /*Add some more sensitive area if there is no advanced git testing.
+ /*Add some more sensitive area if there is no advanced hit testing.
* (Advanced hit testing is more precise)*/
if(lv_obj_has_flag(obj, LV_OBJ_FLAG_ADV_HITTEST)) {
r -= indic_width;
-
}
else {
r -= LV_MAX(r / 4, indic_width);
@@ -503,7 +502,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e)
angle -= arc->rotation;
angle -= arc->bg_angle_start; /*Make the angle relative to the start angle*/
- /* If we click near the bg_angle_start the angle will be close to 360° instead of an small angle */
+ /* If we click near the bg_angle_start the angle will be close to 360° instead of a small angle */
if(angle < 0) angle += 360;
const uint32_t circumference = (uint32_t)((2U * r * 314U) / 100U); /* Equivalent to: 2r * 3.14, avoiding floats */
@@ -606,7 +605,7 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e)
else if(code == LV_EVENT_KEY) {
uint32_t c = lv_event_get_key(e);
- int16_t old_value = arc->value;
+ int32_t old_value = arc->value;
if(c == LV_KEY_RIGHT || c == LV_KEY_UP) {
lv_arc_set_value(obj, lv_arc_get_value(obj) + 1);
}
@@ -619,6 +618,16 @@ static void lv_arc_event(const lv_obj_class_t * class_p, lv_event_t * e)
if(res != LV_RESULT_OK) return;
}
}
+ else if(code == LV_EVENT_ROTARY) {
+ int32_t r = lv_event_get_rotary_diff(e);
+
+ int32_t old_value = arc->value;
+ lv_arc_set_value(obj, lv_arc_get_value(obj) + r);
+ if(old_value != arc->value) {
+ res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL);
+ if(res != LV_RESULT_OK) return;
+ }
+ }
else if(code == LV_EVENT_HIT_TEST) {
lv_hit_test_info_t * info = lv_event_get_param(e);
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/bar/lv_bar.c b/lib/libesp32_lvgl/lvgl/src/widgets/bar/lv_bar.c
index 44e72213e..7f4ebccfd 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/bar/lv_bar.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/bar/lv_bar.c
@@ -17,7 +17,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_bar_class
+#define MY_CLASS (&lv_bar_class)
/** hor. pad and ver. pad cannot make the indicator smaller than this [px]*/
#define LV_BAR_SIZE_MIN 4
@@ -469,9 +469,11 @@ static void draw_indic(lv_event_t * e)
*
*/
- bool gradient = false;
- if(hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_HOR) gradient = true;
- else if(!hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_VER) gradient = true;
+ bool mask_needed = false;
+ if(hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_HOR) mask_needed = true;
+ else if(!hor && draw_rect_dsc.bg_grad.dir == LV_GRAD_DIR_VER) mask_needed = true;
+
+ if(draw_rect_dsc.bg_image_src) mask_needed = true;
bool radius_issue = true;
/*The indicator is fully drawn if it's larger than the bg*/
@@ -479,7 +481,7 @@ static void draw_indic(lv_event_t * e)
else if(indic_radius >= bg_radius) radius_issue = false;
else if(_lv_area_is_in(&indic_area, &bar_coords, bg_radius)) radius_issue = false;
- if(radius_issue || gradient) {
+ if(radius_issue || mask_needed) {
if(!radius_issue) {
/*Draw only the shadow*/
lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc;
@@ -495,14 +497,14 @@ static void draw_indic(lv_event_t * e)
}
draw_rect_dsc.shadow_opa = 0;
- /*If clipped for any reason can the border, outline, and shadow
- *would be clipped and looked ugly so don't draw them*/
+ /*If clipped for any reason cannot the border, outline, and shadow
+ *as they would be clipped and looked ugly*/
lv_draw_rect_dsc_t draw_tmp_dsc = draw_rect_dsc;
draw_tmp_dsc.border_opa = 0;
draw_tmp_dsc.outline_opa = 0;
draw_tmp_dsc.shadow_opa = 0;
lv_area_t indic_draw_area = indic_area;
- if(gradient) {
+ if(mask_needed) {
if(hor) {
indic_draw_area.x1 = bar_coords.x1 + bg_left;
indic_draw_area.x2 = bar_coords.x2 - bg_right;
@@ -526,7 +528,7 @@ static void draw_indic(lv_event_t * e)
lv_draw_mask_rect(layer_indic, &mask_dsc);
}
- if(gradient) {
+ if(mask_needed) {
mask_dsc.area = indic_area;
mask_dsc.radius = indic_radius;
lv_draw_mask_rect(layer_indic, &mask_dsc);
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/button/lv_button.c b/lib/libesp32_lvgl/lvgl/src/widgets/button/lv_button.c
index 70dbe9099..8f57aa409 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/button/lv_button.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/button/lv_button.c
@@ -13,7 +13,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_button_class
+#define MY_CLASS (&lv_button_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c b/lib/libesp32_lvgl/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c
index 291d69a78..9b67c31bd 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/buttonmatrix/lv_buttonmatrix.c
@@ -21,7 +21,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_buttonmatrix_class
+#define MY_CLASS (&lv_buttonmatrix_class)
#define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10)
#define LV_BUTTONMATRIX_WIDTH_MASK 0x000F
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar.c b/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar.c
index ddaa6929f..49b46fb50 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar.c
@@ -18,7 +18,7 @@
#define LV_CALENDAR_CTRL_TODAY LV_BUTTONMATRIX_CTRL_CUSTOM_1
#define LV_CALENDAR_CTRL_HIGHLIGHT LV_BUTTONMATRIX_CTRL_CUSTOM_2
-#define MY_CLASS &lv_calendar_class
+#define MY_CLASS (&lv_calendar_class)
/**********************
* TYPEDEFS
@@ -245,15 +245,13 @@ static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * o
/*Initialize the allocated 'ext'*/
-#if LV_WIDGETS_HAS_DEFAULT_VALUE
- calendar->today.year = 2020;
+ calendar->today.year = 2024;
calendar->today.month = 1;
calendar->today.day = 1;
- calendar->showed_date.year = 2020;
+ calendar->showed_date.year = 2024;
calendar->showed_date.month = 1;
calendar->showed_date.day = 1;
-#endif
calendar->highlighted_dates = NULL;
calendar->highlighted_dates_num = 0;
@@ -287,11 +285,8 @@ static void lv_calendar_constructor(const lv_obj_class_t * class_p, lv_obj_t * o
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN);
lv_obj_set_flex_grow(calendar->btnm, 1);
-#if LV_WIDGETS_HAS_DEFAULT_VALUE
lv_calendar_set_showed_date(obj, calendar->showed_date.year, calendar->showed_date.month);
lv_calendar_set_today_date(obj, calendar->today.year, calendar->today.month, calendar->today.day);
-#endif
-
}
static void draw_task_added_event_cb(lv_event_t * e)
@@ -300,16 +295,10 @@ static void draw_task_added_event_cb(lv_event_t * e)
lv_draw_task_t * draw_task = lv_event_get_param(e);
if(((lv_draw_dsc_base_t *)draw_task->draw_dsc)->part != LV_PART_ITEMS) return;
- lv_draw_fill_dsc_t * fill_draw_dsc = NULL;
- lv_draw_border_dsc_t * border_draw_dsc = NULL;
+ lv_draw_fill_dsc_t * fill_draw_dsc = lv_draw_task_get_fill_dsc(draw_task);
+ lv_draw_border_dsc_t * border_draw_dsc = lv_draw_task_get_border_dsc(draw_task);
- if(draw_task->type == LV_DRAW_TASK_TYPE_FILL) {
- fill_draw_dsc = draw_task->draw_dsc;
- }
- else if(draw_task->type == LV_DRAW_TASK_TYPE_BORDER) {
- border_draw_dsc = draw_task->draw_dsc;
- }
- else {
+ if(!fill_draw_dsc && !border_draw_dsc) {
return;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c b/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c
index a9daad4ae..3a8eeaa1a 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/calendar/lv_calendar_header_arrow.c
@@ -13,6 +13,7 @@
#include "../button/lv_button.h"
#include "../label/lv_label.h"
#include "../../layouts/flex/lv_flex.h"
+#include "../../misc/lv_assert.h"
/*********************
* DEFINES
@@ -111,6 +112,9 @@ static void month_event_cb(lv_event_t * e)
d = lv_calendar_get_showed_date(calendar);
lv_calendar_date_t newd = *d;
+ LV_ASSERT_FORMAT_MSG(newd.year >= 0 && newd.month >= 1 && newd.month <= 12,
+ "Invalid date: %d-%d", newd.year, newd.month);
+
/*The last child is the right button*/
if(lv_obj_get_child(header, 0) == btn) {
if(newd.month == 1) {
@@ -142,9 +146,12 @@ static void value_changed_event_cb(lv_event_t * e)
lv_obj_t * header = lv_event_get_current_target(e);
lv_obj_t * calendar = lv_obj_get_parent(header);
- const lv_calendar_date_t * cur_date = lv_calendar_get_showed_date(calendar);
+ const lv_calendar_date_t * date = lv_calendar_get_showed_date(calendar);
+ LV_ASSERT_FORMAT_MSG(date->year >= 0 && date->month >= 1 && date->month <= 12,
+ "Invalid date: %d-%d", date->year, date->month);
+
lv_obj_t * label = lv_obj_get_child(header, 1);
- lv_label_set_text_fmt(label, "%d %s", cur_date->year, month_names_def[cur_date->month - 1]);
+ lv_label_set_text_fmt(label, "%d %s", date->year, month_names_def[date->month - 1]);
}
#endif /*LV_USE_CALENDAR_HEADER_ARROW*/
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.c b/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.c
index 0fe0e43c9..4ce2017af 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.c
@@ -19,7 +19,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_canvas_class
+#define MY_CLASS (&lv_canvas_class)
/**********************
* TYPEDEFS
@@ -152,16 +152,13 @@ void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv
lv_obj_invalidate(obj);
}
-void lv_canvas_set_palette(lv_obj_t * obj, uint8_t id, lv_color32_t c)
+void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_canvas_t * canvas = (lv_canvas_t *)obj;
- lv_image_dsc_t dsc;
- lv_draw_buf_to_image(canvas->draw_buf, &dsc);
-
- lv_image_buf_set_palette(&dsc, id, c);
+ lv_draw_buf_set_palette(canvas->draw_buf, index, color);
lv_obj_invalidate(obj);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.h b/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.h
index bb39f98c4..945132778 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/canvas/lv_canvas.h
@@ -91,15 +91,15 @@ void lv_canvas_set_px(lv_obj_t * obj, int32_t x, int32_t y, lv_color_t color, lv
/**
* Set the palette color of a canvas for index format. Valid only for `LV_COLOR_FORMAT_I1/2/4/8`
- * @param canvas pointer to canvas object
- * @param id the palette color to set:
+ * @param obj pointer to canvas object
+ * @param index the palette color to set:
* - for `LV_COLOR_FORMAT_I1`: 0..1
* - for `LV_COLOR_FORMAT_I2`: 0..3
* - for `LV_COLOR_FORMAT_I4`: 0..15
* - for `LV_COLOR_FORMAT_I8`: 0..255
- * @param c the color to set
+ * @param color the color to set
*/
-void lv_canvas_set_palette(lv_obj_t * canvas, uint8_t id, lv_color32_t c);
+void lv_canvas_set_palette(lv_obj_t * obj, uint8_t index, lv_color32_t color);
/*=====================
* Getter functions
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.c b/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.c
index 40d05ff89..782b7c5a6 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.c
@@ -14,7 +14,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_chart_class
+#define MY_CLASS (&lv_chart_class)
#define LV_CHART_HDIV_DEF 3
#define LV_CHART_VDIV_DEF 5
@@ -804,9 +804,15 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer)
/*If there are at least as many points as pixels then draw only vertical lines*/
bool crowded_mode = (int32_t)chart->point_cnt >= w;
+ line_dsc.base.id1 = _lv_ll_get_len(&chart->series_ll) - 1;
+ point_dsc_default.base.id1 = line_dsc.base.id1;
/*Go through all data lines*/
_LV_LL_READ_BACK(&chart->series_ll, ser) {
- if(ser->hidden) continue;
+ if(ser->hidden) {
+ line_dsc.base.id1--;
+ point_dsc_default.base.id1--;
+ continue;
+ }
line_dsc.color = ser->color;
point_dsc_default.bg_color = ser->color;
line_dsc.base.id2 = 0;
@@ -899,10 +905,10 @@ static void draw_series_line(lv_obj_t * obj, lv_layer_t * layer)
point_dsc_default.base.id2 = i - 1;
lv_draw_rect(layer, &point_dsc_default, &point_area);
}
-
- point_dsc_default.base.id1++;
- line_dsc.base.id1++;
}
+
+ point_dsc_default.base.id1--;
+ line_dsc.base.id1--;
}
layer->_clip_area = clip_area_ori;
@@ -1083,7 +1089,10 @@ static void draw_series_bar(lv_obj_t * obj, lv_layer_t * layer)
col_a.x2 = col_a.x1 + col_w - 1;
x_act += col_w + ser_gap;
- if(col_a.x2 < clip_area.x1) continue;
+ if(col_a.x2 < clip_area.x1) {
+ col_dsc.base.id1++;
+ continue;
+ }
if(col_a.x1 > clip_area.x2) break;
col_dsc.bg_color = ser->color;
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.h b/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.h
index c3628f9e3..a010bfda4 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/chart/lv_chart.h
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../core/lv_obj.h"
#if LV_USE_CHART != 0
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/checkbox/lv_checkbox.c b/lib/libesp32_lvgl/lvgl/src/widgets/checkbox/lv_checkbox.c
index 157559b79..ae42e7810 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/checkbox/lv_checkbox.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/checkbox/lv_checkbox.c
@@ -18,7 +18,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_checkbox_class
+#define MY_CLASS (&lv_checkbox_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/dropdown/lv_dropdown.c b/lib/libesp32_lvgl/lvgl/src/widgets/dropdown/lv_dropdown.c
index 22653d797..c5d1c0189 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/dropdown/lv_dropdown.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/dropdown/lv_dropdown.c
@@ -25,7 +25,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_dropdown_class
+#define MY_CLASS (&lv_dropdown_class)
#define MY_CLASS_LIST &lv_dropdownlist_class
#define LV_DROPDOWN_PR_NONE 0xFFFF
@@ -738,6 +738,19 @@ static void lv_dropdown_event(const lv_obj_class_t * class_p, lv_event_t * e)
}
}
}
+ else if(code == LV_EVENT_ROTARY) {
+ if(!lv_dropdown_is_open(obj)) {
+ lv_dropdown_open(obj);
+ }
+ else {
+ int32_t r = lv_event_get_rotary_diff(e);
+ int32_t new_id = dropdown->sel_opt_id + r;
+ new_id = LV_CLAMP(0, new_id, (int32_t)dropdown->option_cnt - 1);
+
+ dropdown->sel_opt_id = new_id;
+ position_to_selected(obj);
+ }
+ }
else if(code == LV_EVENT_DRAW_MAIN) {
draw_main(e);
}
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.c b/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.c
index 1f4984cdd..8bd70caf1 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.c
@@ -14,7 +14,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_image_class
+#define MY_CLASS (&lv_image_class)
/**********************
* TYPEDEFS
@@ -85,7 +85,7 @@ static const lv_property_ops_t properties[] = {
{
.id = LV_PROPERTY_IMAGE_ALIGN,
.setter = lv_image_set_inner_align,
- .getter = lv_image_get_align,
+ .getter = lv_image_get_inner_align,
},
};
#endif
@@ -139,7 +139,7 @@ void lv_image_set_src(lv_obj_t * obj, const void * src)
lv_image_src_t src_type = lv_image_src_get_type(src);
lv_image_t * img = (lv_image_t *)obj;
-#if LV_USE_LOG && LV_LOG_LEVEL >= LV_LOG_LEVEL_INFO
+#if LV_USE_LOG && LV_LOG_LEVEL <= LV_LOG_LEVEL_INFO
switch(src_type) {
case LV_IMAGE_SRC_FILE:
LV_LOG_TRACE("`LV_IMAGE_SRC_FILE` type found");
@@ -421,12 +421,19 @@ void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align)
if(align == img->align) return;
img->align = align;
-
update_align(obj);
lv_obj_invalidate(obj);
}
+void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+ lv_image_t * img = (lv_image_t *)obj;
+ img->bitmap_mask_src = src;
+ lv_obj_invalidate(obj);
+}
+
/*=====================
* Getter functions
*====================*/
@@ -531,6 +538,15 @@ lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj)
return img->align;
}
+const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj)
+{
+ LV_ASSERT_OBJ(obj, MY_CLASS);
+
+ lv_image_t * img = (lv_image_t *)obj;
+
+ return img->bitmap_mask_src;
+}
+
/**********************
* STATIC FUNCTIONS
**********************/
@@ -701,6 +717,10 @@ static void draw_image(lv_event_t * e)
return;
}
}
+ if(img->bitmap_mask_src) {
+ info->res = LV_COVER_RES_NOT_COVER;
+ return;
+ }
}
else if(code == LV_EVENT_DRAW_MAIN) {
@@ -722,6 +742,7 @@ static void draw_image(lv_event_t * e)
draw_dsc.rotation = img->rotation;
draw_dsc.antialias = img->antialias;
draw_dsc.blend_mode = img->blend_mode;
+ draw_dsc.bitmap_mask_src = img->bitmap_mask_src;
draw_dsc.src = img->src;
lv_area_t img_area = {obj->coords.x1, obj->coords.y1,
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.h b/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.h
index f02696d67..4b58c14ee 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/image/lv_image.h
@@ -40,6 +40,7 @@ extern "C" {
typedef struct {
lv_obj_t obj;
const void * src; /**< Image source: Pointer to an array or a file or a symbol*/
+ const lv_image_dsc_t * bitmap_mask_src; /**< Pointer to an A8 bitmap mask */
lv_point_t offset;
int32_t w; /**< Width of the image (Handled by the library)*/
int32_t h; /**< Height of the image (Handled by the library)*/
@@ -230,6 +231,13 @@ void lv_image_set_antialias(lv_obj_t * obj, bool antialias);
*/
void lv_image_set_inner_align(lv_obj_t * obj, lv_image_align_t align);
+/**
+ * Set an A8 bitmap mask for the image.
+ * @param obj pointer to an image object
+ * @param src an lv_image_dsc_t bitmap mask source.
+ */
+void lv_image_set_bitmap_map_src(lv_obj_t * obj, const lv_image_dsc_t * src);
+
/*=====================
* Getter functions
*====================*/
@@ -314,6 +322,13 @@ bool lv_image_get_antialias(lv_obj_t * obj);
*/
lv_image_align_t lv_image_get_inner_align(lv_obj_t * obj);
+/**
+ * Get the bitmap mask source.
+ * @param obj pointer to an image object
+ * @return an lv_image_dsc_t bitmap mask source.
+ */
+const lv_image_dsc_t * lv_image_get_bitmap_map_src(lv_obj_t * obj);
+
/**********************
* MACROS
**********************/
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/imagebutton/lv_imagebutton.c b/lib/libesp32_lvgl/lvgl/src/widgets/imagebutton/lv_imagebutton.c
index 77f6f3360..dcecf9534 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/imagebutton/lv_imagebutton.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/imagebutton/lv_imagebutton.c
@@ -16,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_imagebutton_class
+#define MY_CLASS (&lv_imagebutton_class)
/**********************
* TYPEDEFS
@@ -225,33 +225,21 @@ static void draw_main(lv_event_t * e)
src_info = &imagebutton->src_mid[state];
if(src_info->img_src) {
+ coords_part.x1 = coords.x1 + left_w;
+ coords_part.x2 = coords.x2 - right_w;
+ coords_part.y1 = coords.y1;
+ coords_part.y2 = coords.y2;
+
lv_area_t clip_area_center;
- clip_area_center.x1 = coords.x1 + left_w;
- clip_area_center.x2 = coords.x2 - right_w;
- clip_area_center.y1 = coords.y1;
- clip_area_center.y2 = coords.y2;
-
- bool comm_res;
- comm_res = _lv_area_intersect(&clip_area_center, &clip_area_center, &layer->_clip_area);
- if(comm_res) {
- int32_t i;
-
- const lv_area_t clip_area_ori = layer->_clip_area;
+ if(_lv_area_intersect(&clip_area_center, &coords_part, &layer->_clip_area)) {
+ lv_area_t clip_area_ori = layer->_clip_area;
layer->_clip_area = clip_area_center;
-
- coords_part.x1 = coords.x1 + left_w;
- coords_part.y1 = coords.y1;
- coords_part.x2 = coords_part.x1 + src_info->header.w - 1;
- coords_part.y2 = coords_part.y1 + src_info->header.h - 1;
-
- for(i = coords_part.x1; i < (int32_t)(clip_area_center.x2 + src_info->header.w - 1); i += src_info->header.w) {
- img_dsc.src = src_info->img_src;
- lv_draw_image(layer, &img_dsc, &coords_part);
- coords_part.x1 = coords_part.x2 + 1;
- coords_part.x2 += src_info->header.w;
- }
+ img_dsc.src = src_info->img_src;
+ img_dsc.tile = 1;
+ lv_draw_image(layer, &img_dsc, &coords_part);
layer->_clip_area = clip_area_ori;
}
+
}
}
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/keyboard/lv_keyboard.c b/lib/libesp32_lvgl/lvgl/src/widgets/keyboard/lv_keyboard.c
index ea12d8e04..abc431c2c 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/keyboard/lv_keyboard.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/keyboard/lv_keyboard.c
@@ -19,7 +19,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_keyboard_class
+#define MY_CLASS (&lv_keyboard_class)
#define LV_KB_BTN(width) LV_BUTTONMATRIX_CTRL_POPOVER | width
/**********************
@@ -90,6 +90,7 @@ static const lv_buttonmatrix_ctrl_t default_kb_ctrl_uc_map[] = {
#endif
LV_BUTTONMATRIX_CTRL_CHECKED | 2, 6, LV_BUTTONMATRIX_CTRL_CHECKED | 2, LV_KEYBOARD_CTRL_BUTTON_FLAGS | 2
};
+
#if LV_USE_ARABIC_PERSIAN_CHARS == 1
static const char * const default_kb_map_ar[] = {
"1#", "ض", "ص", "ث", "ق", "ف", "غ", "ع", "ه", "خ", "ح", "ج", "\n",
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/label/lv_label.c b/lib/libesp32_lvgl/lvgl/src/widgets/label/lv_label.c
index 4986d78f1..09fc5b68d 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/label/lv_label.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/label/lv_label.c
@@ -23,7 +23,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_label_class
+#define MY_CLASS (&lv_label_class)
#define LV_LABEL_DEF_SCROLL_SPEED lv_anim_speed_clamped(40, 300, 10000)
#define LV_LABEL_SCROLL_DELAY 300
@@ -278,7 +278,6 @@ void lv_label_get_letter_pos(const lv_obj_t * obj, uint32_t char_id, lv_point_t
}
lv_text_flag_t flag = get_label_flags(label);
- if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT;
const uint32_t byte_id = _lv_text_encoded_get_byte_id(txt, char_id);
/*Search the line of the index letter*/
@@ -378,7 +377,6 @@ uint32_t lv_label_get_letter_on(const lv_obj_t * obj, lv_point_t * pos_in, bool
int32_t y = 0;
lv_text_flag_t flag = get_label_flags(label);
- if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT;
/*Search the line of the index letter*/;
while(txt[line_start] != '\0') {
@@ -487,7 +485,6 @@ bool lv_label_is_char_under_pos(const lv_obj_t * obj, lv_point_t * pos)
const int32_t letter_height = lv_font_get_line_height(font);
lv_text_flag_t flag = get_label_flags(label);
- if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT;
/*Search the line of the index letter*/
int32_t y = 0;
@@ -701,6 +698,8 @@ static void lv_label_event(const lv_obj_class_t * class_p, lv_event_t * e)
if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) w = LV_COORD_MAX;
else w = lv_obj_get_content_width(obj);
+ w = LV_MIN(w, lv_obj_get_style_max_width(obj, 0));
+
lv_text_get_size(&label->size_cache, label->text, font, letter_space, line_space, w, flag);
label->invalid_size_cache = false;
}
@@ -723,9 +722,7 @@ static void draw_main(lv_event_t * e)
lv_area_t txt_coords;
lv_obj_get_content_coords(obj, &txt_coords);
- lv_text_flag_t flag = LV_TEXT_FLAG_NONE;
- if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND;
- if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT;
+ lv_text_flag_t flag = get_label_flags(label);
lv_draw_label_dsc_t label_draw_dsc;
lv_draw_label_dsc_init(&label_draw_dsc);
@@ -858,9 +855,7 @@ static void lv_label_refr_text(lv_obj_t * obj)
/*Calc. the height and longest line*/
lv_point_t size;
- lv_text_flag_t flag = LV_TEXT_FLAG_NONE;
- if(label->expand != 0) flag |= LV_TEXT_FLAG_EXPAND;
- if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT && !obj->w_layout) flag |= LV_TEXT_FLAG_FIT;
+ lv_text_flag_t flag = get_label_flags(label);
lv_text_get_size(&size, label->text, font, letter_space, line_space, max_w, flag);
@@ -1252,6 +1247,13 @@ static lv_text_flag_t get_label_flags(lv_label_t * label)
if(label->expand) flag |= LV_TEXT_FLAG_EXPAND;
+ lv_obj_t * obj = (lv_obj_t *) label;
+ if(lv_obj_get_style_width(obj, LV_PART_MAIN) == LV_SIZE_CONTENT &&
+ lv_obj_get_style_max_width(obj, LV_PART_MAIN) == LV_COORD_MAX &&
+ !obj->w_layout) {
+ flag |= LV_TEXT_FLAG_FIT;
+ }
+
return flag;
}
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/led/lv_led.c b/lib/libesp32_lvgl/lvgl/src/widgets/led/lv_led.c
index d9aa4ca2b..bf5db77c5 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/led/lv_led.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/led/lv_led.c
@@ -16,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_led_class
+#define MY_CLASS (&lv_led_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/line/lv_line.c b/lib/libesp32_lvgl/lvgl/src/widgets/line/lv_line.c
index 1b6f32451..4734e1bbe 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/line/lv_line.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/line/lv_line.c
@@ -19,7 +19,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_line_class
+#define MY_CLASS (&lv_line_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/list/lv_list.c b/lib/libesp32_lvgl/lvgl/src/widgets/list/lv_list.c
index 60dc6ddf1..5288c66e0 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/list/lv_list.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/list/lv_list.c
@@ -18,7 +18,9 @@
/*********************
* DEFINES
*********************/
-#define MV_CLASS &lv_list
+#define MY_CLASS (&lv_list_class)
+#define MY_CLASS_BUTTON (&lv_list_button_class)
+#define MY_CLASS_TEXT (&lv_list_text_class)
/**********************
* TYPEDEFS
@@ -63,7 +65,7 @@ const lv_obj_class_t lv_list_text_class = {
lv_obj_t * lv_list_create(lv_obj_t * parent)
{
LV_LOG_INFO("begin");
- lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_class, parent);
+ lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS, parent);
lv_obj_class_init_obj(obj);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_COLUMN);
return obj;
@@ -73,7 +75,7 @@ lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt)
{
LV_LOG_INFO("begin");
- lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_text_class, list);
+ lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_TEXT, list);
lv_obj_class_init_obj(obj);
lv_label_set_text(obj, txt);
return obj;
@@ -82,7 +84,7 @@ lv_obj_t * lv_list_add_text(lv_obj_t * list, const char * txt)
lv_obj_t * lv_list_add_button(lv_obj_t * list, const void * icon, const char * txt)
{
LV_LOG_INFO("begin");
- lv_obj_t * obj = lv_obj_class_create_obj(&lv_list_button_class, list);
+ lv_obj_t * obj = lv_obj_class_create_obj(MY_CLASS_BUTTON, list);
lv_obj_class_init_obj(obj);
lv_obj_set_flex_flow(obj, LV_FLEX_FLOW_ROW);
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/menu/lv_menu.c b/lib/libesp32_lvgl/lvgl/src/widgets/menu/lv_menu.c
index 899a00329..e21bdcd18 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/menu/lv_menu.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/menu/lv_menu.c
@@ -13,7 +13,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_menu_class
+#define MY_CLASS (&lv_menu_class)
#include "../../core/lv_obj.h"
#include "../../layouts/lv_layout.h"
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/msgbox/lv_msgbox.c b/lib/libesp32_lvgl/lvgl/src/widgets/msgbox/lv_msgbox.c
index b1cc16caf..6f9d4a72d 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/msgbox/lv_msgbox.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/msgbox/lv_msgbox.c
@@ -21,7 +21,7 @@
* DEFINES
*********************/
#define LV_MSGBOX_FLAG_AUTO_PARENT LV_OBJ_FLAG_WIDGET_1 /*Mark that the parent was automatically created*/
-#define MY_CLASS &lv_msgbox_class
+#define MY_CLASS (&lv_msgbox_class)
/**********************
* TYPEDEFS
@@ -235,7 +235,7 @@ lv_obj_t * lv_msgbox_get_footer(lv_obj_t * obj)
{
LV_ASSERT_OBJ(obj, MY_CLASS);
lv_msgbox_t * mbox = (lv_msgbox_t *)obj;
- return mbox->header;
+ return mbox->footer;
}
lv_obj_t * lv_msgbox_get_content(lv_obj_t * obj)
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/objx_templ/lv_objx_templ.c b/lib/libesp32_lvgl/lvgl/src/widgets/objx_templ/lv_objx_templ.c
index 7a3614a2b..eaf5c1270 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/objx_templ/lv_objx_templ.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/objx_templ/lv_objx_templ.c
@@ -22,7 +22,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_templ_class
+#define MY_CLASS (&lv_templ_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/roller/lv_roller.c b/lib/libesp32_lvgl/lvgl/src/widgets/roller/lv_roller.c
index 146841de2..98ed0f3df 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/roller/lv_roller.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/roller/lv_roller.c
@@ -20,7 +20,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_roller_class
+#define MY_CLASS (&lv_roller_class)
#define MY_CLASS_LABEL &lv_roller_label_class
#define EXTRA_INF_SIZE 1000 /*[px]: add the options multiple times until getting this height*/
@@ -380,6 +380,16 @@ static void lv_roller_event(const lv_obj_class_t * class_p, lv_event_t * e)
}
}
}
+ else if(code == LV_EVENT_ROTARY) {
+ int32_t r = lv_event_get_rotary_diff(e);
+ int32_t new_id = roller->sel_opt_id + r;
+ new_id = LV_CLAMP(0, new_id, (int32_t)roller->option_cnt - 1);
+ if((int32_t)roller->sel_opt_id != new_id) {
+ uint32_t ori_id = roller->sel_opt_id_ori; /*lv_roller_set_selected will overwrite this*/
+ lv_roller_set_selected(obj, new_id, LV_ANIM_ON);
+ roller->sel_opt_id_ori = ori_id;
+ }
+ }
else if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {
lv_obj_t * label = get_label(obj);
lv_obj_refresh_ext_draw_size(label);
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/scale/lv_scale.c b/lib/libesp32_lvgl/lvgl/src/widgets/scale/lv_scale.c
index cee6ba11f..1e8df7ade 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/scale/lv_scale.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/scale/lv_scale.c
@@ -17,7 +17,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_scale_class
+#define MY_CLASS (&lv_scale_class)
#define LV_SCALE_LABEL_TXT_LEN (20U)
#define LV_SCALE_DEFAULT_ANGLE_RANGE ((uint32_t) 270U)
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/slider/lv_slider.c b/lib/libesp32_lvgl/lvgl/src/widgets/slider/lv_slider.c
index 577b91e30..2cce03ab2 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/slider/lv_slider.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/slider/lv_slider.c
@@ -22,7 +22,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_slider_class
+#define MY_CLASS (&lv_slider_class)
#define LV_SLIDER_KNOB_COORD(is_reversed, area) (is_reversed ? area.x1 : area.x2)
#define LV_SLIDER_KNOB_COORD_VERTICAL(is_reversed, area) (is_reversed ? area.y2 : area.y1)
@@ -135,7 +135,7 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
else if(code == LV_EVENT_PRESSED) {
/*Save the pressed coordinates*/
lv_indev_get_point(lv_indev_active(), &slider->pressed_point);
- lv_obj_transform_point(obj, &slider->pressed_point, true, true);
+ lv_obj_transform_point(obj, &slider->pressed_point, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE);
}
else if(code == LV_EVENT_PRESSING) {
update_knob_pos(obj, true);
@@ -224,6 +224,15 @@ static void lv_slider_event(const lv_obj_class_t * class_p, lv_event_t * e)
res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL);
if(res != LV_RESULT_OK) return;
}
+ else if(code == LV_EVENT_ROTARY) {
+ int32_t r = lv_event_get_rotary_diff(e);
+
+ if(!slider->left_knob_focus) lv_slider_set_value(obj, lv_slider_get_value(obj) + r, LV_ANIM_ON);
+ else lv_slider_set_left_value(obj, lv_slider_get_left_value(obj) + 1, LV_ANIM_ON);
+
+ res = lv_obj_send_event(obj, LV_EVENT_VALUE_CHANGED, NULL);
+ if(res != LV_RESULT_OK) return;
+ }
else if(code == LV_EVENT_DRAW_MAIN) {
draw_knob(e);
}
@@ -336,7 +345,7 @@ static void drag_start(lv_obj_t * obj)
}
else if(mode == LV_SLIDER_MODE_RANGE) {
lv_indev_get_point(lv_indev_active(), &p);
- lv_obj_transform_point(obj, &p, true, true);
+ lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE);
const bool is_rtl = LV_BASE_DIR_RTL == lv_obj_get_style_base_dir(obj, LV_PART_MAIN);
const bool is_horizontal = is_slider_horizontal(obj);
const bool is_reversed = slider->bar.val_reversed ^ (is_rtl && is_horizontal);
@@ -400,7 +409,7 @@ static void update_knob_pos(lv_obj_t * obj, bool check_drag)
lv_point_t p;
lv_indev_get_point(indev, &p);
- lv_obj_transform_point(obj, &p, true, true);
+ lv_obj_transform_point(obj, &p, LV_OBJ_POINT_TRANSFORM_FLAG_INVERSE_RECURSIVE);
bool is_hor = is_slider_horizontal(obj);
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.c b/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.c
index 539c94d1d..95dd03094 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.c
@@ -16,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_spangroup_class
+#define MY_CLASS (&lv_spangroup_class)
#define snippet_stack LV_GLOBAL_DEFAULT()->span_snippet_stack
/**********************
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.h b/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.h
index fe87c9ffb..0b0386913 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/span/lv_span.h
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../core/lv_obj.h"
#if LV_USE_SPAN != 0
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/spinbox/lv_spinbox.c b/lib/libesp32_lvgl/lvgl/src/widgets/spinbox/lv_spinbox.c
index fd17ba710..667c310b3 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/spinbox/lv_spinbox.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/spinbox/lv_spinbox.c
@@ -16,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_spinbox_class
+#define MY_CLASS (&lv_spinbox_class)
#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_8BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 8U)
#define LV_SPINBOX_MAX_DIGIT_COUNT_WITH_4BYTES (LV_SPINBOX_MAX_DIGIT_COUNT + 4U)
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.c b/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.c
index 81eee4619..9b1daa8ef 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.c
@@ -6,7 +6,7 @@
/*********************
* INCLUDES
*********************/
-#include "lv_spinner.h"
+#include "../../lvgl.h"
#if LV_USE_SPINNER
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.h b/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.h
index 7b5f41666..92445631b 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/spinner/lv_spinner.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_SPINNER
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/switch/lv_switch.c b/lib/libesp32_lvgl/lvgl/src/widgets/switch/lv_switch.c
index eab1a4906..f1973e9c4 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/switch/lv_switch.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/switch/lv_switch.c
@@ -19,7 +19,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_switch_class
+#define MY_CLASS (&lv_switch_class)
#define LV_SWITCH_IS_ANIMATING(sw) (((sw)->anim_state) != LV_SWITCH_ANIM_STATE_INV)
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.c b/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.c
index 85e4c33e5..c69494c3a 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.c
@@ -21,7 +21,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_table_class
+#define MY_CLASS (&lv_table_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.h b/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.h
index 80db47b05..456d794f3 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/table/lv_table.h
@@ -52,7 +52,7 @@ typedef uint32_t lv_table_cell_ctrl_t;
typedef struct {
lv_table_cell_ctrl_t ctrl;
void * user_data; /**< Custom user data*/
- char txt[];
+ char txt[1]; /**< Variable length array*/
} lv_table_cell_t;
/*Data of table*/
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.c b/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.c
index f0e11952f..e6bd36805 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.c
@@ -6,7 +6,8 @@
/*********************
* INCLUDES
*********************/
-#include "lv_tabview.h"
+#include "../../lvgl.h"
+
#if LV_USE_TABVIEW
#include "../../misc/lv_assert.h"
@@ -15,7 +16,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_tabview_class
+#define MY_CLASS (&lv_tabview_class)
/**********************
* TYPEDEFS
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.h b/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.h
index 27e8a394e..a4e0c7640 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/tabview/lv_tabview.h
@@ -13,7 +13,8 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
+#include "../../core/lv_obj.h"
#if LV_USE_TABVIEW
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.c b/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.c
index 8a76e5f79..37bf816b1 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.c
@@ -23,7 +23,7 @@
/*********************
* DEFINES
*********************/
-#define MY_CLASS &lv_textarea_class
+#define MY_CLASS (&lv_textarea_class)
/*Test configuration*/
#ifndef LV_TEXTAREA_DEF_CURSOR_BLINK_TIME
@@ -116,14 +116,25 @@ void lv_textarea_add_char(lv_obj_t * obj, uint32_t c)
const char * letter_buf = (char *)&u32_buf;
+ uint32_t c2 = c;
#if LV_BIG_ENDIAN_SYSTEM
if(c != 0) while(*letter_buf == 0) ++letter_buf;
+
+ /*The byte order may or may not need to be swapped here to get correct c_uni below,
+ since lv_textarea_add_text is ordering bytes correctly before calling lv_textarea_add_char.
+ Assume swapping is needed if MSB is zero. May not be foolproof. */
+ if((c != 0) && ((c & 0xff000000) == 0)) {
+ c2 = ((c >> 24) & 0xff) | /*move byte 3 to byte 0*/
+ ((c << 8) & 0xff0000) | /*move byte 1 to byte 2*/
+ ((c >> 8) & 0xff00) | /*move byte 2 to byte 1*/
+ ((c << 24) & 0xff000000); /*byte 0 to byte 3*/
+ }
#endif
lv_result_t res = insert_handler(obj, letter_buf);
if(res != LV_RESULT_OK) return;
- uint32_t c_uni = _lv_text_encoded_next((const char *)&c, NULL);
+ uint32_t c_uni = _lv_text_encoded_next((const char *)&c2, NULL);
if(char_is_accepted(obj, c_uni) == false) {
LV_LOG_INFO("Character is not accepted by the text area (too long text or not in the accepted list)");
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.h b/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.h
index 336585c34..0db80eb8f 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/textarea/lv_textarea.h
@@ -204,7 +204,7 @@ void lv_textarea_set_text_selection(lv_obj_t * obj, bool en);
void lv_textarea_set_password_show_time(lv_obj_t * obj, uint32_t time);
/**
- * Deprecated: use the normal text_align style property instead
+ * @deprecated Use the normal text_align style property instead
* Set the label's alignment.
* It sets where the label is aligned (in one line mode it can be smaller than the text area)
* and how the lines of the area align in case of multiline text area
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/tileview/lv_tileview.c b/lib/libesp32_lvgl/lvgl/src/widgets/tileview/lv_tileview.c
index dad187fa4..400ca15c7 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/tileview/lv_tileview.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/tileview/lv_tileview.c
@@ -70,8 +70,7 @@ lv_obj_t * lv_tileview_add_tile(lv_obj_t * tv, uint8_t col_id, uint8_t row_id, l
lv_obj_t * obj = lv_obj_class_create_obj(&lv_tileview_tile_class, tv);
lv_obj_class_init_obj(obj);
- lv_obj_set_pos(obj, col_id * lv_obj_get_content_width(tv),
- row_id * lv_obj_get_content_height(tv));
+ lv_obj_set_pos(obj, lv_pct(col_id * 100), lv_pct(row_id * 100));
lv_tileview_tile_t * tile = (lv_tileview_tile_t *)obj;
tile->dir = dir;
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.c b/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.c
index 9be1a888c..437b3af48 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.c
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.c
@@ -6,7 +6,7 @@
/*********************
* INCLUDES
*********************/
-#include "lv_win.h"
+#include "../../lvgl.h"
#if LV_USE_WIN
/*********************
diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.h b/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.h
index 55691f77b..0f6d5a4ce 100644
--- a/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.h
+++ b/lib/libesp32_lvgl/lvgl/src/widgets/win/lv_win.h
@@ -13,7 +13,7 @@ extern "C" {
/*********************
* INCLUDES
*********************/
-#include "../../../lvgl.h"
+#include "../../lv_conf_internal.h"
#if LV_USE_WIN
/*********************
* DEFINES
diff --git a/tasmota/lvgl_berry/tasmota_lv_conf.h b/tasmota/lvgl_berry/tasmota_lv_conf.h
index a028d8637..519a28821 100644
--- a/tasmota/lvgl_berry/tasmota_lv_conf.h
+++ b/tasmota/lvgl_berry/tasmota_lv_conf.h
@@ -1,6 +1,6 @@
/**
* @file lv_conf.h
- * Configuration file for v9.0.0
+ * Configuration file for v9.1.0
*/
/*
@@ -17,6 +17,11 @@
#ifndef LV_CONF_H
#define LV_CONF_H
+/*If you need to include anything here, do it inside the `__ASSEMBLY__` guard */
+#if 0 && defined(__ASSEMBLY__)
+#include "my_include.h"
+#endif
+
/*====================
COLOR SETTINGS
*====================*/
@@ -54,7 +59,7 @@
#undef LV_MEM_POOL_INCLUDE
#undef LV_MEM_POOL_ALLOC
#endif
-#endif /*LV_USE_MALLOC == LV_STDLIB_BUILTIN*/
+#endif /*LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN*/
/*====================
HAL SETTINGS
@@ -94,6 +99,14 @@
/*Align the start address of draw_buf addresses to this bytes*/
#define LV_DRAW_BUF_ALIGN 4
+/* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
+ * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
+ * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
+ * and can't be drawn in chunks. */
+
+/*The target buffer size for simple layer chunks.*/
+#define LV_DRAW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
+
#define LV_USE_DRAW_SW 1
#if LV_USE_DRAW_SW == 1
/* Set the number of draw unit.
@@ -104,14 +117,9 @@
/* Use Arm-2D to accelerate the sw render */
#define LV_USE_DRAW_ARM2D_SYNC 0
- /* If a widget has `style_opa < 255` (not `bg_opa`, `text_opa` etc) or not NORMAL blend mode
- * it is buffered into a "simple" layer before rendering. The widget can be buffered in smaller chunks.
- * "Transformed layers" (if `transform_angle/zoom` are set) use larger buffers
- * and can't be drawn in chunks. */
-
- /*The target buffer size for simple layer chunks.*/
- #define LV_DRAW_SW_LAYER_SIMPLE_BUF_SIZE (24 * 1024) /*[bytes]*/
-
+ /* Enable native helium assembly to be compiled */
+ #define LV_USE_NATIVE_HELIUM_ASM 0
+
/* 0: use a simple renderer capable of drawing only simple rectangles with gradient, images, texts, and straight lines only
* 1: use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too */
#define LV_DRAW_SW_COMPLEX 1
@@ -176,6 +184,19 @@
/* Enable VG-Lite assert. */
#define LV_VG_LITE_USE_ASSERT 0
+/* VG-Lite flush commit trigger threshold. GPU will try to batch these many draw tasks. */
+#define LV_VG_LITE_FLUSH_MAX_COUNT 8
+
+/* Enable border to simulate shadow
+ * NOTE: which usually improves performance,
+ * but does not guarantee the same rendering quality as the software. */
+#define LV_VG_LITE_USE_BOX_SHADOW 0
+
+/* VG-Lite gradient image maximum cache number.
+ * NOTE: The memory usage of a single gradient image is 4K bytes.
+ */
+#define LV_VG_LITE_GRAD_CACHE_SIZE 32
+
#endif
/*=======================
@@ -312,6 +333,9 @@
/*Enable 16 pixels alignment*/
#define LV_VG_LITE_THORVG_16PIXELS_ALIGN 1
+ /*Buffer address alignment*/
+ #define LV_VG_LITE_THORVG_BUF_ADDR_ALIGN 64
+
/*Enable multi-thread render*/
#define LV_VG_LITE_THORVG_THREAD_RENDER 0
@@ -429,6 +453,9 @@
LV_FONT_DECLARE(robotocondensed_regular_40_latin1) \
LV_FONT_DECLARE(robotocondensed_regular_44_latin1) \
LV_FONT_DECLARE(robotocondensed_regular_48_latin1) \
+ LV_FONT_DECLARE(lv_font_montserrat_tasmota_10) \
+ LV_FONT_DECLARE(lv_font_montserrat_tasmota_14) \
+ LV_FONT_DECLARE(lv_font_montserrat_tasmota_20) \
LV_FONT_DECLARE(lv_font_icons_10) \
LV_FONT_DECLARE(lv_font_icons_12) \
LV_FONT_DECLARE(lv_font_icons_14) \
@@ -440,7 +467,6 @@
LV_FONT_DECLARE(lv_font_icons_28) \
// LV_FONT_DECLARE(montserrat_tasmota_14) \
// LV_FONT_DECLARE(montserrat_tasmota_20) \
- // LV_FONT_DECLARE(typicons24) \
#define FONT_ICONS_10 1
#define FONT_ICONS_12 1
@@ -690,6 +716,12 @@
#define LV_FS_MEMFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
#endif
+/*API for LittleFs. */
+#define LV_USE_FS_LITTLEFS 0
+#if LV_USE_FS_LITTLEFS
+ #define LV_FS_LITTLEFS_LETTER '\0' /*Set an upper cased letter on which the drive will accessible (e.g. 'A')*/
+#endif
+
/*LODEPNG decoder library*/
#define LV_USE_LODEPNG 1 // TASMOTA
@@ -736,10 +768,8 @@
/*Let FreeType to use LVGL memory and file porting*/
#define LV_FREETYPE_USE_LVGL_PORT 0
- /* Maximum number of opened FT_Face/FT_Size objects managed by this cache instance. */
- /* (0:use system defaults) */
- #define LV_FREETYPE_CACHE_FT_FACES 8
- #define LV_FREETYPE_CACHE_FT_SIZES 8
+ /*Cache count of the glyphs in FreeType. It means the number of glyphs that can be cached.
+ *The higher the value, the more memory will be used.*/
#define LV_FREETYPE_CACHE_FT_GLYPH_CNT 256
#endif
@@ -754,7 +784,7 @@
#define LV_USE_RLOTTIE 0
/*Enable Vector Graphic APIs*/
-#define LV_USE_VECTOR_GRAPHIC 1 // TASMOTA
+#define LV_USE_VECTOR_GRAPHIC 1 // TASMOTA
/* Enable ThorVG (vector graphics library) from the src/libs folder */
#define LV_USE_THORVG_INTERNAL 0
@@ -762,9 +792,6 @@
/* Enable ThorVG by assuming that its installed and linked to the project */
#define LV_USE_THORVG_EXTERNAL 0
-/*Enable LZ4 compress/decompress lib*/
-#define LV_USE_LZ4 0
-
/*Use lvgl built-in LZ4 lib*/
#define LV_USE_LZ4_INTERNAL 0
@@ -803,7 +830,7 @@
#endif
/*1: Show the used memory and the memory fragmentation
- * Requires `LV_USE_BUILTIN_MALLOC = 1`
+ * Requires `LV_USE_STDLIB_MALLOC = LV_STDLIB_BUILTIN`
* Requires `LV_USE_SYSMON = 1`*/
#define LV_USE_MEM_MONITOR 0
#if LV_USE_MEM_MONITOR
@@ -889,11 +916,12 @@
/*Use SDL to open window on PC and handle mouse and keyboard*/
#define LV_USE_SDL 0
#if LV_USE_SDL
- #define LV_SDL_INCLUDE_PATH
- #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
- #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
- #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
- #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #define LV_SDL_INCLUDE_PATH
+ #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/
+ #define LV_SDL_BUF_COUNT 1 /*1 or 2*/
+ #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/
+ #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/
+ #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/
#endif
/*Use X11 to open window on Linux desktop and handle mouse and keyboard*/
@@ -946,6 +974,20 @@
/*Driver for evdev input devices*/
#define LV_USE_EVDEV 0
+/*Driver for libinput input devices*/
+#define LV_USE_LIBINPUT 0
+
+#if LV_USE_LIBINPUT
+ #define LV_LIBINPUT_BSD 0
+
+ /*Full keyboard support*/
+ #define LV_LIBINPUT_XKB 0
+ #if LV_LIBINPUT_XKB
+ /*"setxkbmap -query" can help find the right values for your keyboard*/
+ #define LV_LIBINPUT_XKB_KEY_MAP { .rules = NULL, .model = "pc101", .layout = "us", .variant = NULL, .options = NULL }
+ #endif
+#endif
+
/*Drivers for LCD devices connected via SPI/parallel port*/
#define LV_USE_ST7735 0
#define LV_USE_ST7789 0
@@ -970,9 +1012,6 @@
/*Show some widget. It might be required to increase `LV_MEM_SIZE` */
#define LV_USE_DEMO_WIDGETS 0
-#if LV_USE_DEMO_WIDGETS
- #define LV_DEMO_WIDGETS_SLIDESHOW 0
-#endif
/*Demonstrate the usage of encoder and keyboard*/
#define LV_USE_DEMO_KEYPAD_AND_ENCODER 0
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino
index 185516bc4..c3e95522a 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_lvgl.ino
@@ -287,55 +287,55 @@ extern "C" {
// icons Font for sizes not covered by montserrat
// if montserrat is defined, use it, else import icons font
const lv_font_table_t lv_icons_fonts[] = {
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_10
+#if LV_FONT_MONTSERRAT_TASMOTA_10
{ 10, &lv_font_montserrat_tasmota_10 },
#elif defined(FONT_ICONS_10)
{ 10, &lv_font_icons_10 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_12
+#if LV_FONT_MONTSERRAT_TASMOTA_12
{ 12, &lv_font_montserrat_tasmota_12 },
#elif defined(FONT_ICONS_12)
{ 12, &lv_font_icons_12 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_14
+#if LV_FONT_MONTSERRAT_TASMOTA_14
{ 14, &lv_font_montserrat_tasmota_14 },
#elif defined(FONT_ICONS_14)
{ 14, &lv_font_icons_14 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_16
+#if LV_FONT_MONTSERRAT_TASMOTA_16
{ 16, &lv_font_montserrat_tasmota_16 },
#elif defined(FONT_ICONS_16)
{ 16, &lv_font_icons_16 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_18
+#if LV_FONT_MONTSERRAT_TASMOTA_18
{ 18, &lv_font_montserrat_tasmota_18 },
#elif defined(FONT_ICONS_18)
{ 18, &lv_font_icons_18 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_20
+#if LV_FONT_MONTSERRAT_TASMOTA_20
{ 20, &lv_font_montserrat_tasmota_20 },
#elif defined(FONT_ICONS_20)
{ 20, &lv_font_icons_20 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_22
+#if LV_FONT_MONTSERRAT_TASMOTA_22
{ 22, &lv_font_montserrat_tasmota_22 },
#elif defined(FONT_ICONS_22)
{ 22, &lv_font_icons_22 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_24
+#if LV_FONT_MONTSERRAT_TASMOTA_24
{ 24, &lv_font_montserrat_tasmota_24 },
#elif defined(FONT_ICONS_24)
{ 24, &lv_font_icons_24 },
#endif
-#ifdef LV_FONT_MONTSERRAT_TASMOTA_28
+#if LV_FONT_MONTSERRAT_TASMOTA_28
{ 28, &lv_font_montserrat_tasmota_28 },
#elif defined(FONT_ICONS_28)
{ 28, &lv_font_icons_28 },
diff --git a/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino b/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino
index 992dfed23..2b1a6b971 100644
--- a/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino
+++ b/tasmota/tasmota_xdrv_driver/xdrv_54_lvgl.ino
@@ -498,9 +498,10 @@ void start_lvgl(const char * uconfig) {
#ifdef USE_LVGL_FREETYPE
// initialize the FreeType renderer
- lv_freetype_init(USE_LVGL_FREETYPE_MAX_FACES,
- USE_LVGL_FREETYPE_MAX_SIZES,
- UsePSRAM() ? USE_LVGL_FREETYPE_MAX_BYTES_PSRAM : USE_LVGL_FREETYPE_MAX_BYTES);
+ lv_freetype_init(USE_LVGL_FREETYPE_MAX_FACES);
+ // lv_freetype_init(USE_LVGL_FREETYPE_MAX_FACES,
+ // USE_LVGL_FREETYPE_MAX_SIZES,
+ // UsePSRAM() ? USE_LVGL_FREETYPE_MAX_BYTES_PSRAM : USE_LVGL_FREETYPE_MAX_BYTES);
#endif
#ifdef USE_LVGL_PNG_DECODER
lv_lodepng_init();