Просмотр исходного кода

fix:修复lvgl gtfont的一些列!!!!!!!!!!!!!!问题

Dozingfiretruck 6 месяцев назад
Родитель
Сommit
d9c540eefb
1 измененных файлов с 35 добавлено и 142 удалено
  1. 35 142
      components/lvgl/font/lv_font_gtfont.c

+ 35 - 142
components/lvgl/font/lv_font_gtfont.c

@@ -4,87 +4,22 @@
 
 #include "luat_gtfont.h"
 
-typedef struct
-{
-    int life;
-    uint16_t code;
-    uint16_t dot;
-    char data[1];
-} gt_font_char_t;
-
-typedef struct
-{
-    uint16_t i;
-    gt_font_char_t **chars;
-} gt_font_cache_t;
+#define LUAT_LOG_TAG "lvgl_gtfont"
+#include "luat_log.h"
 
-typedef struct
-{
+typedef struct{
     uint8_t sty_zh;
     uint8_t sty_en;
     uint16_t size;
     uint16_t bpp;
     uint16_t thickness;
-    gt_font_cache_t *cache;
-    uint16_t adv_w[94];
     uint16_t code;
     uint32_t dot;
-    unsigned char buf[1];
+    unsigned char buf[0];
 } gt_font_param_t;
 
-gt_font_char_t **gt_font_cache_open(gt_font_param_t *param, uint16_t code) {
-    if (param->cache == NULL)
-        return NULL;
-
-    gt_font_char_t *cached_char = NULL;
-    gt_font_cache_t *cache = param->cache;
-    gt_font_char_t **chars = cache->chars;
-
-    int i = 0;
-    for (i = 0; i < cache->i && chars[i] != NULL; ++i)
-    {
-        if(chars[i]->life > (INT32_MIN + 1)) {
-            chars[i]->life -= 1;
-        }
-    }
-
-    for(i = 0; i < cache->i && chars[i] != NULL; i++) {
-        if(chars[i]->code == code) {
-            cached_char = chars[i];
-            cached_char->life += 1;
-            if(cached_char->life > 1000) cached_char->life = 1000;
-            break;
-        }
-    }
-
-    if (cached_char || i < cache->i) return &chars[i];
-
-    i = 0;
-    for(int j = 1; j < cache->i; j++) {
-        if(cache->chars[j]->life < chars[i]->life) {
-            i = j;
-        }
-    }
-
-    chars[i]->life = 0;
-    chars[i]->code = 0;
-
-    return &chars[i];
-}
-
 static void gt_font_get(gt_font_param_t *param, uint16_t code) {
-    if (param->code == code)
-        return;
-
-    gt_font_char_t *vc = NULL;
-    gt_font_char_t **cached_char = gt_font_cache_open(param, code);
-    if (cached_char != NULL && (vc = *cached_char) != NULL && vc->code == code) {
-        param->code = code;
-        param->dot = vc->dot;
-        int size = ((param->dot + 7) / 8 * 8) * param->size * param->bpp / 8;
-        memcpy(param->buf, vc->data, size);
-        return;
-    }
+    if (param->code == code) return;
 
     uint8_t sty = param->sty_zh;
     if (code >= 0x20 && code <= 0x7e)
@@ -98,20 +33,10 @@ static void gt_font_get(gt_font_param_t *param, uint16_t code) {
     param->dot = dot / param->bpp;
 
     Gray_Process(param->buf, param->dot, param->size, param->bpp);
-
-    if (cached_char != NULL) {
-        int size = ((param->dot + 7) / 8 * 8) * param->size * param->bpp / 8;
-        vc = lv_mem_realloc(vc, sizeof(gt_font_char_t) + size);
-        vc->dot = param->dot;
-        vc->code = code;
-        vc->life = 0;
-        memcpy(vc->data, param->buf, size);
-
-        *cached_char = vc;
-    }
+    // LLOGD("dot:%d param->dot:%d aram->size:%d param->bpp:%d",dot,param->dot,param->size, param->bpp);
 }
 
-int get_font_adv_w(uint8_t *buf, int width, int height, int bpp) {
+static int get_font_adv_w(uint8_t *buf, int width, int height, int bpp) {
     uint8_t *p = buf;
     uint16_t w = width, h = height;
     uint32_t i = 0, j = 0, x = 0, y = 0;
@@ -136,24 +61,17 @@ int get_font_adv_w(uint8_t *buf, int width, int height, int bpp) {
             }
         }
     }
-
     return adv_w + 1;
 }
 
 static inline uint16_t gt_font_get_adv_w(gt_font_param_t *param, uint16_t code) {
     uint16_t adv_w = param->size;
-
+    gt_font_get(param, code);
     if (code >= 0x21 && code <= 0x7e) {
-        int i = code - 0x21;
-        // if (param->adv_w[i] == 0xFFFF) {
-            gt_font_get(param, code);
-            param->adv_w[i] = get_font_adv_w(param->buf, param->dot, param->size, param->bpp);
-        // }
-        adv_w = param->adv_w[i];
+        adv_w = get_font_adv_w(param->buf, param->dot, param->size, param->bpp);
     } else if (code == 0x20) {
         adv_w = param->size / 2;
     }
-
     return adv_w;
 }
 
@@ -162,19 +80,19 @@ static bool gt_font_get_glyph_dsc(const struct _lv_font_struct *font, lv_font_gl
     uint16_t code = gt_unicode2gb18030(letter);
 
     dsc_out->adv_w = gt_font_get_adv_w(param, code);
-    dsc_out->box_w = ((param->code == code ? param->dot : param->size) + 7) / 8 * 8;
+    dsc_out->box_w = (param->dot + 7) / 8 * 8;
+    // LLOGD("adv_w:%d box_w:%d",dsc_out->adv_w,dsc_out->box_w);
     dsc_out->box_h = param->size;
     dsc_out->ofs_x = 0;
     dsc_out->ofs_y = 0;
-    dsc_out->bpp   = param->bpp;
+    dsc_out->bpp  = param->bpp;
 
     return true;
 }
 
 static uint8_t *gt_font_get_glyph_bitmap(const struct _lv_font_struct *font, uint32_t letter) {
     gt_font_param_t *param = font->dsc;
-    uint16_t code = gt_unicode2gb18030(letter);
-    gt_font_get(param, code);
+    gt_font_get(param, gt_unicode2gb18030(letter));
     return param->buf;
 }
 
@@ -185,47 +103,30 @@ bool lv_font_is_gt(lv_font_t *font) {
 }
 
 lv_font_t *lv_font_new_gt(uint8_t sty_zh, uint8_t sty_en, uint8_t size, uint8_t bpp, uint16_t thickness, uint8_t cache_size) {
-    lv_font_t *font = NULL;
-    do {
-        font = lv_mem_alloc(sizeof(lv_font_t));
-        if (!font) break;
-
-        memset(font, 0, sizeof(lv_font_t));
-        font->get_glyph_dsc = gt_font_get_glyph_dsc;
-        font->get_glyph_bitmap = gt_font_get_glyph_bitmap;
-        font->line_height = size;
-
-        int malloc_size = size * bpp * size * bpp;
-        gt_font_param_t *param = lv_mem_alloc(sizeof(gt_font_param_t) + malloc_size);
-        if (!param) break;
-
-        memset(param, 0, sizeof(*param));
-        font->dsc = param;
-        memset(param->adv_w, 0xFF, sizeof(param->adv_w));
-        param->sty_zh = sty_zh;
-        param->sty_en = sty_en;
-        param->size = size;
-        param->bpp = bpp;
-        param->thickness = thickness;
-        if (cache_size != 0) {
-            gt_font_cache_t *cache = lv_mem_alloc(sizeof(gt_font_cache_t));
-            if (!cache) break;
-
-            memset(cache, 0, sizeof(*cache));
-            param->cache = cache;
-            cache->i = cache_size;
-            cache->chars = lv_mem_alloc(cache_size * sizeof(gt_font_char_t *));
-            if (!cache->chars) break;
-
-            memset(cache->chars, 0, cache_size * sizeof(gt_font_char_t *));
-        }
-
-        return font;
+    lv_font_t *font = lv_mem_alloc(sizeof(lv_font_t));
+    if (!font) return NULL;
+
+    memset(font, 0, sizeof(lv_font_t));
+    font->get_glyph_dsc = gt_font_get_glyph_dsc;
+    font->get_glyph_bitmap = gt_font_get_glyph_bitmap;
+    font->line_height = size;
+
+    int malloc_size = size * bpp * size * bpp;
+    gt_font_param_t *param = lv_mem_alloc(sizeof(gt_font_param_t) + malloc_size);
+    if (!param) {
+        lv_font_del_gt(font);
+        return NULL;
+    }
 
-    } while (0);
+    memset(param, 0, sizeof(*param));
+    font->dsc = param;
+    param->sty_zh = sty_zh;
+    param->sty_en = sty_en;
+    param->size = size;
+    param->bpp = bpp;
+    param->thickness = thickness;
 
-    lv_font_del_gt(font);
-    return NULL;
+    return font;
 }
 
 void lv_font_del_gt(lv_font_t *font) {
@@ -235,14 +136,6 @@ void lv_font_del_gt(lv_font_t *font) {
         return;
     }
     gt_font_param_t *param = font->dsc;
-    if (param->cache) {
-        gt_font_char_t **chars = param->cache->chars;
-        for (int i = 0; i < param->cache->i; ++i) {
-            if (chars[i]) lv_mem_free(chars[i]);
-        }
-        if (param->cache->chars) lv_mem_free(param->cache->chars);
-        lv_mem_free(param->cache);
-    }
     lv_mem_free(param);
     lv_mem_free(font);
 }