浏览代码

fix:u8g2等宽字体英文显示不正常,u8g2 demo不支持air780ep https://gitee.com/openLuat/LuatOS/issues/I95J8R

alienwalker 2 年之前
父节点
当前提交
3361ec0949
共有 4 个文件被更改,包括 50 次插入3 次删除
  1. 19 2
      components/u8g2/luat_lib_u8g2.c
  2. 5 0
      components/u8g2/luat_u8g2.h
  3. 20 1
      components/u8g2/u8g2_font.c
  4. 6 0
      demo/u8g2/main.lua

+ 19 - 2
components/u8g2/luat_lib_u8g2.c

@@ -357,7 +357,7 @@ static int l_u8g2_SendBuffer(lua_State *L) {
 }
 
 /*
-在显示屏上画一段文字,在显示屏上画一段文字,要调用u8g2.SendBuffer()才会更新到屏幕
+在显示屏上画一段文字,在显示屏上画一段文字,要调用u8g2.SendBuffer()才会更新到屏幕,坐标原点为左下角!!!,其他显示API均同
 @api u8g2.DrawUTF8(str, x, y)
 @string 文件内容
 @int 横坐标
@@ -435,8 +435,9 @@ static int l_u8g2_SetFontMode(lua_State *L){
 
 /*
 设置字体
-@api u8g2.SetFont(font)
+@api u8g2.SetFont(font, indentation)
 @userdata font, u8g2.font_opposansm8 为纯英文8号字体,还有font_opposansm10 font_opposansm12 font_opposansm16 font_opposansm18 font_opposansm20 font_opposansm22 font_opposansm24 font_opposansm32 可选 u8g2.font_opposansm12_chinese 为12x12全中文,还有 font_opposansm16_chinese font_opposansm24_chinese font_opposansm32_chinese 可选, u8g2.font_unifont_t_symbols 为符号.
+@int indentation, 等宽字体ascii右侧缩进0~127个pixel,等宽字体的ascii字符可能在右侧有大片空白,用户可以选择删除部分。留空或者超过127则直接删除右半边, 非等宽字体无效
 @usage
 -- 设置为中文字体,对之后的drawStr有效
 u8g2.SetFont(u8g2.font_opposansm12)
@@ -456,6 +457,10 @@ static int l_u8g2_SetFont(lua_State *L) {
         LLOGE("only font pointer is allow");
         return 0;
     }
+    conf->equal_width_cut_for_ascii = 0xff;
+    if (lua_isinteger(L, 2)) {
+    	conf->equal_width_cut_for_ascii = lua_tointeger(L, 2);
+    }
     u8g2_SetFont(&conf->u8g2, ptr);
     lua_pushboolean(L, 1);
     return 1;
@@ -1559,4 +1564,16 @@ uint8_t u8x8_luat_gpio_and_delay_default(u8x8_t *u8x8, uint8_t msg, uint8_t arg_
 }
 
 
+void luat_u8g2_set_equal_width(uint8_t is_true)
+{
+	conf->is_equal_width = is_true;
+}
 
+u8g2_uint_t luat_u8g2_need_ascii_cut(u8g2_uint_t org_delta)
+{
+	if (conf->is_equal_width) {
+		if ((conf->equal_width_cut_for_ascii < org_delta)) return org_delta - conf->equal_width_cut_for_ascii;
+		return ((org_delta - 1) >> 1) + 1;
+	}
+	return org_delta;
+}

+ 5 - 0
components/u8g2/luat_u8g2.h

@@ -13,6 +13,8 @@ typedef struct luat_u8g2_conf
     uint16_t h;
     uint8_t sleepcmd;
     uint8_t wakecmd;
+    uint8_t is_equal_width;	//是否是等宽字体
+    uint8_t equal_width_cut_for_ascii;//等宽字体ascii码缩进处理
     int lua_ref;
     char* cname; // 控制器名称, 例如SSD1306
     u8g2_t u8g2;
@@ -25,3 +27,6 @@ int luat_u8g2_setup(luat_u8g2_conf_t *conf);
 
 int luat_u8g2_close(luat_u8g2_conf_t *conf);
 
+void luat_u8g2_set_equal_width(uint8_t is_true);
+
+u8g2_uint_t luat_u8g2_need_ascii_cut(u8g2_uint_t org_delta);

+ 20 - 1
components/u8g2/u8g2_font.c

@@ -39,6 +39,10 @@
 /* this is the size for the new font format */
 #define U8G2_FONT_DATA_STRUCT_SIZE 23
 
+#if (defined __LUATOS__) || defined (__USER_CODE__)
+void luat_u8g2_set_equal_width(uint8_t is_true);
+u8g2_uint_t luat_u8g2_need_ascii_cut(u8g2_uint_t org_delta);
+#endif
 /*
   font data:
 
@@ -979,7 +983,9 @@ static u8g2_uint_t u8g2_draw_string(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y,
     if ( e != 0x0fffe )
     {
       delta = u8g2_DrawGlyph(u8g2, x, y, e);
-    
+#if (defined __LUATOS__) || defined (__USER_CODE__)
+      if (e < 0x0080) delta = luat_u8g2_need_ascii_cut(delta);
+#endif
 #ifdef U8G2_WITH_FONT_ROTATION
       switch(u8g2->font_decode.dir)
       {
@@ -1288,6 +1294,19 @@ void u8g2_SetFont(u8g2_t *u8g2, const uint8_t  *font)
     u8g2_read_font_info(&(u8g2->font_info), font);
     u8g2_UpdateRefHeight(u8g2);
     /* u8g2_SetFontPosBaseline(u8g2); */ /* removed with issue 195 */
+#if (defined __LUATOS__) || defined (__USER_CODE__)
+//探测一下是不是等宽字体
+    const uint8_t *glyph_data = u8g2_font_get_glyph_data(u8g2, 'a');
+    int8_t x, y;
+    int8_t d;
+    u8g2_font_decode_t *decode = &(u8g2->font_decode);
+
+    u8g2_font_setup_decode(u8g2, glyph_data);     /* set values in u8g2->font_decode data structure */
+    x = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_char_x);
+    y = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_char_y);
+    d = u8g2_font_decode_get_signed_bits(decode, u8g2->font_info.bits_per_delta_x);
+    luat_u8g2_set_equal_width(d == u8g2->font_info.max_char_width);
+#endif
   }
 }
 

+ 6 - 0
demo/u8g2/main.lua

@@ -38,6 +38,8 @@ function u8g2_pin()
         return 0,12,11,2,16,15,14,13
     elseif rtos_bsp == "EC618" then
         return 0,10,11,0,1,10,8,18
+    elseif rtos_bsp == "EC718P" then
+        return 0,14,15,0,1,10,8,18
     else
         log.info("main", "bsp not support")
         return
@@ -113,6 +115,10 @@ if u8g2.font_opposansm12_chinese then
     u8g2.SetFont(u8g2.font_opposansm12_chinese)
 elseif u8g2.font_opposansm10_chinese then
     u8g2.SetFont(u8g2.font_opposansm10_chinese)
+elseif u8g2.font_sarasa_m12_chinese then
+    u8g2.SetFont(u8g2.font_sarasa_m12_chinese)
+elseif u8g2.font_sarasa_m10_chinese then
+    u8g2.SetFont(u8g2.font_sarasa_m10_chinese)
 else
     print("no chinese font")
 end