From 20843458b4058bd80f8a3062b07659ff9ed3917d Mon Sep 17 00:00:00 2001 From: ShallowGreen123 <2608653986@qq.com> Date: Sun, 9 Oct 2022 00:56:54 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9AAdd=20lvgl=20font=20file=20.c=20to?= =?UTF-8?q?=20convert=20to=20.bin=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lvgl_mydemo/.vscode/c_cpp_properties.json | 21 ++ .../lvgl_mydemo/.vscode/settings.json | 5 +- LVGL.Simulator/lvgl_mydemo/.vscode/tasks.json | 68 ++++ LVGL.Simulator/lvgl_mydemo/lib/readme.md | 0 .../lvgl_mydemo/{ => tool/c_format}/a.exe | Bin .../c_format/c_flie_format.c} | 0 .../.vscode/c_cpp_properties.json | 21 ++ .../lvgl_binary_conver/.vscode/tasks.json | 68 ++++ .../lvgl_binary_conver/LVGL-Font-Binary.exe | Bin 0 -> 62634 bytes .../tool/lvgl_binary_conver/conver.cmd | 14 + .../tool/lvgl_binary_conver/main.c | 350 ++++++++++++++++++ LVGL.Simulator/lvgl_mydemo/tool/readme.md | 0 12 files changed, 546 insertions(+), 1 deletion(-) create mode 100644 LVGL.Simulator/lvgl_mydemo/.vscode/c_cpp_properties.json create mode 100644 LVGL.Simulator/lvgl_mydemo/.vscode/tasks.json create mode 100644 LVGL.Simulator/lvgl_mydemo/lib/readme.md rename LVGL.Simulator/lvgl_mydemo/{ => tool/c_format}/a.exe (100%) rename LVGL.Simulator/lvgl_mydemo/{lib/lib_c_flie_format.c => tool/c_format/c_flie_format.c} (100%) create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/c_cpp_properties.json create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/tasks.json create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/LVGL-Font-Binary.exe create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/conver.cmd create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/main.c create mode 100644 LVGL.Simulator/lvgl_mydemo/tool/readme.md diff --git a/LVGL.Simulator/lvgl_mydemo/.vscode/c_cpp_properties.json b/LVGL.Simulator/lvgl_mydemo/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..a985d0b --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.19041.0", + "compilerPath": "D:/APP/Dev C++/Dev-Cpp/MinGW64/bin/gcc.exe", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/LVGL.Simulator/lvgl_mydemo/.vscode/settings.json b/LVGL.Simulator/lvgl_mydemo/.vscode/settings.json index 691a8f6..584ea5c 100644 --- a/LVGL.Simulator/lvgl_mydemo/.vscode/settings.json +++ b/LVGL.Simulator/lvgl_mydemo/.vscode/settings.json @@ -1,3 +1,6 @@ { - "C_Cpp.errorSquiggles": "Disabled" + "C_Cpp.errorSquiggles": "Disabled", + "files.associations": { + "stdint.h": "c" + } } \ No newline at end of file diff --git a/LVGL.Simulator/lvgl_mydemo/.vscode/tasks.json b/LVGL.Simulator/lvgl_mydemo/.vscode/tasks.json new file mode 100644 index 0000000..483cbd1 --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/.vscode/tasks.json @@ -0,0 +1,68 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc.exe 生成活动文件", + "command": "D:\\APP\\Dev C++\\Dev-Cpp\\MinGW64\\bin\\gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": "build", + "detail": "调试器生成的任务。" + }, + { + "type": "cppbuild", + "label": "C/C++: cl.exe 生成活动文件", + "command": "cl.exe", + "args": [ + "/Zi", + "/EHsc", + "/nologo", + "/Fe${fileDirname}\\${fileBasenameNoExtension}.exe", + "${file}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$msCompile" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + }, + { + "type": "cppbuild", + "label": "C/C++: gcc.exe 生成活动文件", + "command": "D:/APP/Dev C++/Dev-Cpp/MinGW64/bin/gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "D:/APP/Dev C++/Dev-Cpp/MinGW64/bin" + }, + "problemMatcher": [ + "$gcc" + ], + "group": "build", + "detail": "编译器: \"D:/APP/Dev C++/Dev-Cpp/MinGW64/bin/gcc.exe\"" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/LVGL.Simulator/lvgl_mydemo/lib/readme.md b/LVGL.Simulator/lvgl_mydemo/lib/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/LVGL.Simulator/lvgl_mydemo/a.exe b/LVGL.Simulator/lvgl_mydemo/tool/c_format/a.exe similarity index 100% rename from LVGL.Simulator/lvgl_mydemo/a.exe rename to LVGL.Simulator/lvgl_mydemo/tool/c_format/a.exe diff --git a/LVGL.Simulator/lvgl_mydemo/lib/lib_c_flie_format.c b/LVGL.Simulator/lvgl_mydemo/tool/c_format/c_flie_format.c similarity index 100% rename from LVGL.Simulator/lvgl_mydemo/lib/lib_c_flie_format.c rename to LVGL.Simulator/lvgl_mydemo/tool/c_format/c_flie_format.c diff --git a/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/c_cpp_properties.json b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..49e80bd --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/c_cpp_properties.json @@ -0,0 +1,21 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "windowsSdkVersion": "10.0.19041.0", + "compilerPath": "D:/APP1/Visual Studio/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "windows-msvc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/tasks.json b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/tasks.json new file mode 100644 index 0000000..e9a3de1 --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/.vscode/tasks.json @@ -0,0 +1,68 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: gcc.exe 生成活动文件", + "command": "D:\\APP\\Dev C++\\Dev-Cpp\\MinGW64\\bin\\gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "调试器生成的任务。" + }, + { + "type": "cppbuild", + "label": "C/C++: gcc.exe 生成活动文件", + "command": "D:\\APP\\Dev C++\\Dev-Cpp\\MinGW64\\bin\\gcc.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}\\${fileBasenameNoExtension}.exe" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": "build", + "detail": "编译器: \"D:\\APP\\Dev C++\\Dev-Cpp\\MinGW64\\bin\\gcc.exe\"" + }, + { + "type": "cppbuild", + "label": "C/C++: cl.exe 生成活动文件", + "command": "cl.exe", + "args": [ + "/Zi", + "/EHsc", + "/nologo", + "/Fe${fileDirname}\\${fileBasenameNoExtension}.exe", + "${file}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$msCompile" + ], + "group": "build", + "detail": "编译器: cl.exe" + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/LVGL-Font-Binary.exe b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/LVGL-Font-Binary.exe new file mode 100644 index 0000000000000000000000000000000000000000..ab54af805a63f27938ea022596c8f9e382c0d4ef GIT binary patch literal 62634 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 literal 0 HcmV?d00001 diff --git a/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/conver.cmd b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/conver.cmd new file mode 100644 index 0000000..f5fb107 --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/conver.cmd @@ -0,0 +1,14 @@ +@echo off + +cd /d %~dp0 + +set FONT_PATH=fonts +set OUT_PATH=out + +rmdir /s /q %OUT_PATH% +mkdir %OUT_PATH% + +for /r %FONT_PATH% %%f in (*.c) do ( + echo Convert: %%~nxf + LVGL-Font-Binary.exe "%%f" "%OUT_PATH%" +) diff --git a/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/main.c b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/main.c new file mode 100644 index 0000000..aab2346 --- /dev/null +++ b/LVGL.Simulator/lvgl_mydemo/tool/lvgl_binary_conver/main.c @@ -0,0 +1,350 @@ +#include +#include +#include +#include +#include + +static char *get_file_name(const char *path) +{ + size_t len = strlen(path); + size_t start = 0; + size_t end = len; + char *file_name; + + for (size_t i = 0; i < len; i++) { + if (path[i] == '\\') { + start = i + 1; + } + } + for (size_t i = len - 1; i > start; i--) { + if (path[i] == '.') { + end = i; + } + } + + if (start >= end) { + return NULL; + } + + file_name = (char *)malloc(end - start + 1); + memcpy(file_name, path + start, end - start); + file_name[end - start] = '\0'; + return file_name; +} + +static char *str_trim(const char *s) +{ + size_t len = strlen(s); + size_t start; + size_t end; + char *ts; + char c; + + for (start = 0; start < len; start++) { + c = s[start]; + if (c != ' ' && c != '\t') { + break; + } + } + for (end = len; end > start; end--) { + c = s[end - 1]; + if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { + break; + } + } + + ts = (char *)malloc(end - start + 1); + memcpy(ts, s + start, end - start); + ts[end - start] = '\0'; + return ts; +} + +static char *str_replace(const char *s, const char *origin, const char *replace) +{ + char *find = strstr(s, origin); + size_t s_len = strlen(s); + size_t origin_len = strlen(origin); + size_t replace_len = strlen(replace); + size_t len = s_len - origin_len + replace_len + 1; + char *ns; + size_t pre, sub; + + if (find) { + ns = (char *)malloc(len); + pre = find - s; + sub = s_len - pre - origin_len; + if (pre > 0) { + memcpy(ns, s, pre); + } + memcpy(ns + pre, replace, replace_len); + if (sub > 0) { + memcpy(ns + pre + replace_len, s + s_len - sub, sub); + } + ns[len - 1] = '\0'; + return ns; + } + return (char *)s; +} +static void str_uppercase(char *s) +{ + size_t len = strlen(s); + size_t i; + int8_t diff = 'A' - 'a'; + + for (i = 0; i < len; i++) { + if (s[i] >= 'a' && s[i] <= 'z') { + s[i] += diff; + } + } +} + +static uint8_t hex_2_u8(char c) +{ + if (c >= '0' && c <= '9') { + return c - '0'; + } + if (c >= 'a' && c <= 'f') { + return c - 'a' + 10; + } + if (c >= 'A' && c <= 'F') { + return c - 'A' + 10; + } + return 0; +} + +static void process_glyph_bitmap(FILE *in, FILE *trim_file, const char *out_dir, const char *file_name) +{ + char line_buf[1024]; + char *line; + FILE *bin_file; + char bin_file_name[512]; + size_t len; + size_t pos; + uint8_t hex_buf[2]; + uint8_t n; + + snprintf(bin_file_name, sizeof(bin_file_name), "%s\\%s_glyph_bitmap.bin", out_dir, file_name); + bin_file = fopen(bin_file_name, "wb+"); + if (!bin_file) { + return; + } + printf("%% glyph bitmap\n"); + while ((line = fgets(line_buf, sizeof(line_buf), in)) != NULL) { + fprintf(trim_file, "%s", line); + line = str_trim(line); + len = strlen(line); + if (len == 1 && line[0] == '{') { + free(line); + continue; + } + if (line[0] == '/' && line[1] == '*') { + if (line[len - 2] == '*' && line[len - 1] == '/') { + free(line); + continue; + } else { + printf("[E] line format error: %s\n", line); + free(line); + continue; + } + } + + pos = 0; + while (pos < len) { + if (line[pos] == '0' && line[pos + 1] == 'x') { + pos += 2; + if ((pos + 1) == len || line[pos + 1] == ',') { + hex_buf[0] = 0; + hex_buf[1] = hex_2_u8(line[pos]); + n = hex_buf[1]; + fwrite(&n, 1, 1, bin_file); + pos += 2; + continue; + } else if ((pos + 2) == len || line[pos + 2] == ',') { + hex_buf[0] = hex_2_u8(line[pos]); + hex_buf[1] = hex_2_u8(line[pos + 1]); + n = hex_buf[0] * 16 + hex_buf[1]; + fwrite(&n, 1, 1, bin_file); + pos += 3; + continue; + } else { + printf("[E] hex string parse fail: %s (%" PRIuPTR ")\n", line, pos); + } + } + pos++; + } + + if (line[len - 1] == ';') { + free(line); + break; + } + free(line); + } + fclose(bin_file); +} + +static void process_kern_class_values(FILE *in, FILE *trim_file, const char *out_dir, const char *file_name) +{ + char line_buf[1024]; + char *line; + FILE *bin_file; + char bin_file_name[512]; + size_t len; + size_t pos; + char int_buf[12]; + size_t int_buf_pos; + uint8_t n; + + snprintf(bin_file_name, sizeof(bin_file_name), "%s\\%s_kern_class_values.bin", out_dir, file_name); + bin_file = fopen(bin_file_name, "wb+"); + if (!bin_file) { + return; + } + + printf("%% kern class values\n"); + while ((line = fgets(line_buf, sizeof(line_buf), in)) != NULL) { + fprintf(trim_file, "%s", line); + line = str_trim(line); + len = strlen(line); + + if (len == 1 && line[0] == '{') { + free(line); + continue; + } + if (line[0] == '/' && line[1] == '*') { + if (line[len - 2] == '*' && line[len - 1] == '/') { + free(line); + continue; + } else { + printf("[E] line format error: %s\n", line); + free(line); + continue; + } + } + + pos = 0; + memset(int_buf, 0, sizeof(int_buf)); + int_buf_pos = 0; + while (pos < len) { + if ((line[pos] == ',' || pos == len - 1) && int_buf_pos > 0) { + n = (uint8_t)atoi(int_buf); + fwrite(&n, 1, 1, bin_file); + memset(int_buf, 0, sizeof(int_buf)); + int_buf_pos = 0; + } else { + int_buf[int_buf_pos++] = line[pos]; + if (int_buf_pos >= sizeof(int_buf)) { + printf("[E] int string parse fail: %s (%" PRIuPTR ")\n", line, pos); + memset(int_buf, 0, sizeof(int_buf)); + int_buf_pos = 0; + } + } + pos++; + } + if (line[len - 1] == ';') { + free(line); + break; + } + free(line); + } + fclose(bin_file); +} + +static void process_one_file(const char *path, const char *out_dir) +{ + FILE *file; + FILE *trim_file; + char trim_file_name[512]; + char line_buf[1024]; + char replace_buf[256]; + char *line; + char *trim_line; + char *replace_line; + char *file_name = get_file_name(path); + + if (file_name == NULL) { + printf("Path err: %s\n", path); + return; + } + printf("\nStart process: %s\n", file_name); + + file = fopen(path, "r"); + if (!file) { + return; + } + + snprintf(trim_file_name, sizeof(trim_file_name), "%s\\%s.c", out_dir, file_name); + trim_file = fopen(trim_file_name, "w+"); + if (!trim_file) { + return; + } + + line = fgets(line_buf, sizeof(line_buf), file); + while (line != NULL) { + trim_line = str_trim(line); + if (strcmp(trim_line, "#ifdef LV_LVGL_H_INCLUDE_SIMPLE") == 0) { + fprintf(trim_file, "#include \"../bp_font_addr.h\"\n\n"); + } else if (strcmp(trim_line, "static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {") == 0) { + fprintf(trim_file, "#ifdef DEF_BP_FONT_AT_EXT_FLASH\n"); + snprintf(replace_buf, sizeof(replace_buf), "%s_glyph_bitmap", file_name); + str_uppercase(replace_buf); + fprintf(trim_file, "// %s\n", replace_buf); + fprintf(trim_file, "#else\n"); + fprintf(trim_file, "%s", line); + process_glyph_bitmap(file, trim_file, out_dir, file_name); + fprintf(trim_file, "#endif /* DEF_BP_FONT_AT_EXT_FLASH */\n"); + free(trim_line); + line = fgets(line_buf, sizeof(line_buf), file); + continue; + } else if (strcmp(trim_line, "static const int8_t kern_class_values[] =") == 0) { + fprintf(trim_file, "#ifdef DEF_BP_FONT_AT_EXT_FLASH\n"); + snprintf(replace_buf, sizeof(replace_buf), "%s_kern_class_values", file_name); + str_uppercase(replace_buf); + fprintf(trim_file, "// %s\n", replace_buf); + fprintf(trim_file, "#else\n"); + fprintf(trim_file, "%s", line); + process_kern_class_values(file, trim_file, out_dir, file_name); + fprintf(trim_file, "#endif /* DEF_BP_FONT_AT_EXT_FLASH */\n"); + free(trim_line); + line = fgets(line_buf, sizeof(line_buf), file); + continue; + } + free(trim_line); + + str_uppercase(file_name); + memset(replace_buf, 0, sizeof(replace_buf)); + strcat(replace_buf, " (const uint8_t *)("); + strcat(replace_buf, file_name); + strcat(replace_buf, "_GLYPH_BITMAP)"); + replace_line = str_replace(line, " glyph_bitmap", replace_buf); + if (replace_line == line) { + memset(replace_buf, 0, sizeof(replace_buf)); + strcat(replace_buf, " (const int8_t *)("); + strcat(replace_buf, file_name); + strcat(replace_buf, "_KERN_CLASS_VALUES)"); + replace_line = str_replace(line, " kern_class_values", replace_buf); + } + if (replace_line != line) { + fprintf(trim_file, "%s", replace_line); + free(replace_line); + } else { + fprintf(trim_file, "%s", line); + } + line = fgets(line_buf, sizeof(line_buf), file); + } + free(file_name); + fclose(trim_file); + fclose(file); +} + +int main(int argc, char **argv) +{ + if (argc != 3) { + printf("Usage:\n %s \n", argv[0]); + return 1; + } else { + process_one_file(argv[1], argv[2]); + } + printf("Done\n"); + + return 0; +} diff --git a/LVGL.Simulator/lvgl_mydemo/tool/readme.md b/LVGL.Simulator/lvgl_mydemo/tool/readme.md new file mode 100644 index 0000000..e69de29