luat_lib_lvgl_font.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. @module lvgl
  3. @summary LVGL图像库
  4. @version 1.0
  5. @date 2021.06.01
  6. */
  7. #include "luat_base.h"
  8. #include "luat_lvgl.h"
  9. #include "lvgl.h"
  10. #include "luat_mem.h"
  11. #include "luat_lvgl_fonts.h"
  12. #include "luat_spi.h"
  13. #ifdef LUAT_USE_GTFONT
  14. extern luat_spi_device_t* gt_spi_dev;
  15. #endif
  16. typedef struct lvfont
  17. {
  18. const char* name;
  19. const void* data;
  20. }lvfont_t;
  21. static const lvfont_t fonts[] = {
  22. {.name="montserrat_14", .data=&lv_font_montserrat_14},
  23. #ifdef LV_FONT_OPPOSANS_M_8
  24. {.name="opposans_m_8", .data=&lv_font_opposans_m_8},
  25. #endif
  26. #ifdef LV_FONT_OPPOSANS_M_10
  27. {.name="opposans_m_10", .data=&lv_font_opposans_m_10},
  28. #endif
  29. #ifdef LV_FONT_OPPOSANS_M_12
  30. {.name="opposans_m_12", .data=&lv_font_opposans_m_12},
  31. #endif
  32. #ifdef LV_FONT_OPPOSANS_M_14
  33. {.name="opposans_m_14", .data=&lv_font_opposans_m_14},
  34. #endif
  35. #ifdef LV_FONT_OPPOSANS_M_16
  36. {.name="opposans_m_16", .data=&lv_font_opposans_m_16},
  37. #endif
  38. #ifdef LV_FONT_OPPOSANS_M_18
  39. {.name="opposans_m_18", .data=&lv_font_opposans_m_18},
  40. #endif
  41. #ifdef LV_FONT_OPPOSANS_M_20
  42. {.name="opposans_m_20", .data=&lv_font_opposans_m_20},
  43. #endif
  44. #ifdef LV_FONT_OPPOSANS_M_22
  45. {.name="opposans_m_22", .data=&lv_font_opposans_m_22},
  46. #endif
  47. {.name=NULL, .data=NULL}
  48. };
  49. /*
  50. 获取内置字体
  51. @api lvgl.font_get(name)
  52. @string 字体名称+字号, 例如 opposans_m_10
  53. @return userdata 字体指针
  54. @usage
  55. local font = lvgl.font_get("opposans_m_12")
  56. */
  57. int luat_lv_font_get(lua_State *L) {
  58. const char* fontname = luaL_checkstring(L, 1);
  59. if (!strcmp("", fontname)) {
  60. LLOGE("字体名称不能是空字符串");
  61. return 0;
  62. }
  63. for (size_t i = 0; i < sizeof(fonts) / sizeof(lvfont_t); i++)
  64. {
  65. if (fonts[i].name == NULL) {
  66. break;
  67. }
  68. if (!strcmp(fontname, fonts[i].name)) {
  69. lua_pushlightuserdata(L, fonts[i].data);
  70. return 1;
  71. }
  72. }
  73. LLOGE("没有找到对应的字体名称 %s", fontname);
  74. for (size_t i = 0; i < sizeof(fonts) / sizeof(lvfont_t); i++)
  75. {
  76. if (fonts[i].name == NULL) {
  77. break;
  78. }
  79. LLOGI("本固件支持的字体名称: %s", fonts[i].name);
  80. }
  81. return 0;
  82. }
  83. /*
  84. 从文件系统加载字体
  85. @api lvgl.font_load(path/spi_device,size,bpp,thickness,cache_size,sty_zh,sty_en)
  86. @string/userdata 字体路径/spi_device (spi_device为使用外置高通矢量字库芯片)
  87. @number size 可选,字号 16-192 默认16(使用高通矢量字库)
  88. @number bpp 可选 深度 默认4(使用高通矢量字库)
  89. @number thickness 可选 粗细值 默认size * bpp(使用高通矢量字库)
  90. @number cache_size 可选 默认0(使用高通矢量字库)
  91. @number sty_zh 可选 选择字体 默认1(使用高通矢量字库)
  92. @number sty_en 可选 选择字体 默认3(使用高通矢量字库)
  93. @return userdata 字体指针
  94. @usage
  95. local font = lvgl.font_load("/font_32.bin")
  96. --local font = lvgl.font_load(spi_device,16)(高通矢量字库)
  97. */
  98. int luat_lv_font_load(lua_State *L) {
  99. lv_font_t *font = NULL;
  100. if (lua_isuserdata(L, 1)) {
  101. #ifdef LUAT_USE_GTFONT
  102. luat_spi_device_t *spi = lua_touserdata(L, 1);
  103. uint8_t size = luaL_optinteger(L, 2, 16);
  104. uint8_t bpp = luaL_optinteger(L, 3, 4);
  105. uint16_t thickness = luaL_optinteger(L, 4, size * bpp);
  106. uint8_t cache_size = luaL_optinteger(L, 5, 0);
  107. uint8_t sty_zh = luaL_optinteger(L, 6, 1);
  108. uint8_t sty_en = luaL_optinteger(L, 7, 3);
  109. if (!(bpp >= 1 && bpp <= 4 && bpp != 3)) {
  110. return 0;
  111. }
  112. if (gt_spi_dev == NULL) {
  113. gt_spi_dev = lua_touserdata(L, 1);
  114. }
  115. font = lv_font_new_gt(sty_zh, sty_en, size, bpp, thickness, cache_size);
  116. #else
  117. LLOGE("本固件没有包含高通字体芯片的驱动");
  118. #endif
  119. } else {
  120. const char* path = luaL_checkstring(L, 1);
  121. LLOGD("从文件加载lvgl字体 %s", path);
  122. font = lv_font_load(path);
  123. if (!font) {
  124. LLOGE("从文件加载lvgl字体 %s 失败", path);
  125. }
  126. }
  127. if (font) {
  128. lua_pushlightuserdata(L, font);
  129. return 1;
  130. }
  131. return 0;
  132. }
  133. /*
  134. 释放字体,慎用!!!仅通过font_load加载的字体允许卸载,通过font_get获取的字体不允许卸载
  135. @api lvgl.font_free(font)
  136. @string 字体路径
  137. @return userdata 字体指针
  138. @usage
  139. local font = lvgl.font_load("/font_32.bin")
  140. -- N N N N 操作
  141. -- 确定字体不被使用,不被引用,且内存紧张需要释放
  142. lvgl.font_free(font)
  143. */
  144. int luat_lv_font_free(lua_State *L) {
  145. lv_font_t* font = lua_touserdata(L, 1);
  146. if (font) {
  147. if (lv_font_is_gt(font)) lv_font_del_gt(font);
  148. else lv_font_free(font);
  149. }
  150. return 0;
  151. }