luat_lib_lvgl_font.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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_malloc.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. lv_font_t* font = NULL;
  59. const char* fontname = luaL_checkstring(L, 1);
  60. if (!strcmp("", fontname)) {
  61. LLOGE("字体名称不能是空字符串");
  62. return 0;
  63. }
  64. for (size_t i = 0; i < sizeof(fonts) / sizeof(lvfont_t); i++)
  65. {
  66. if (fonts[i].name == NULL) {
  67. break;
  68. }
  69. if (!strcmp(fontname, fonts[i].name)) {
  70. lua_pushlightuserdata(L, fonts[i].data);
  71. return 1;
  72. }
  73. }
  74. LLOGE("没有找到对应的字体名称 %s", fontname);
  75. for (size_t i = 0; i < sizeof(fonts) / sizeof(lvfont_t); i++)
  76. {
  77. if (fonts[i].name == NULL) {
  78. break;
  79. }
  80. LLOGI("本固件支持的字体名称: %s", fonts[i].name);
  81. }
  82. return 0;
  83. }
  84. /*
  85. 从文件系统加载字体
  86. @api lvgl.font_load(path/spi_device,size,bpp,thickness,cache_size,sty_zh,sty_en)
  87. @string/userdata 字体路径/spi_device (spi_device为使用外置高通矢量字库芯片)
  88. @number size 可选,字号 16-192 默认16(使用高通矢量字库)
  89. @number bpp 可选 深度 默认4(使用高通矢量字库)
  90. @number thickness 可选 粗细值 默认size * bpp(使用高通矢量字库)
  91. @number cache_size 可选 默认0(使用高通矢量字库)
  92. @number sty_zh 可选 选择字体 默认1(使用高通矢量字库)
  93. @number sty_en 可选 选择字体 默认3(使用高通矢量字库)
  94. @return userdata 字体指针
  95. @usage
  96. local font = lvgl.font_load("/font_32.bin")
  97. --local font = lvgl.font_load(spi_device,16)(高通矢量字库)
  98. */
  99. int luat_lv_font_load(lua_State *L) {
  100. lv_font_t *font = NULL;
  101. if (lua_isuserdata(L, 1)) {
  102. #ifdef LUAT_USE_GTFONT
  103. luat_spi_device_t *spi = lua_touserdata(L, 1);
  104. uint8_t size = luaL_optinteger(L, 2, 16);
  105. uint8_t bpp = luaL_optinteger(L, 3, 4);
  106. uint16_t thickness = luaL_optinteger(L, 4, size * bpp);
  107. uint8_t cache_size = luaL_optinteger(L, 5, 0);
  108. uint8_t sty_zh = luaL_optinteger(L, 6, 1);
  109. uint8_t sty_en = luaL_optinteger(L, 7, 3);
  110. if (!(bpp >= 1 && bpp <= 4 && bpp != 3)) {
  111. return 0;
  112. }
  113. if (gt_spi_dev == NULL) {
  114. gt_spi_dev = lua_touserdata(L, 1);
  115. }
  116. font = lv_font_new_gt(sty_zh, sty_en, size, bpp, thickness, cache_size);
  117. #else
  118. LLOGE("本固件没有包含高通字体芯片的驱动");
  119. #endif
  120. } else {
  121. const char* path = luaL_checkstring(L, 1);
  122. LLOGD("从文件加载lvgl字体 %s", path);
  123. font = lv_font_load(path);
  124. if (!font) {
  125. LLOGE("从文件加载lvgl字体 %s 失败", path);
  126. }
  127. }
  128. if (font) {
  129. lua_pushlightuserdata(L, font);
  130. return 1;
  131. }
  132. return 0;
  133. }
  134. /*
  135. 释放字体,慎用!!!仅通过font_load加载的字体允许卸载,通过font_get获取的字体不允许卸载
  136. @api lvgl.font_free(font)
  137. @string 字体路径
  138. @return userdata 字体指针
  139. @usage
  140. local font = lvgl.font_load("/font_32.bin")
  141. -- N N N N 操作
  142. -- 确定字体不被使用,不被引用,且内存紧张需要释放
  143. lvgl.font_free(font)
  144. */
  145. int luat_lv_font_free(lua_State *L) {
  146. lv_font_t* font = lua_touserdata(L, 1);
  147. if (font) {
  148. if (lv_font_is_gt(font)) lv_font_del_gt(font);
  149. else lv_font_free(font);
  150. }
  151. return 0;
  152. }