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();