| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #include "luat_lvgl_fonts.h"
- #ifdef LUAT_USE_GTFONT
- #include "luat_gtfont.h"
- #define LUAT_LOG_TAG "lvgl_gtfont"
- #include "luat_log.h"
- typedef struct{
- uint8_t sty_zh;
- uint8_t sty_en;
- uint16_t size;
- uint16_t bpp;
- uint16_t thickness;
- uint16_t code;
- uint32_t dot;
- unsigned char buf[0];
- } gt_font_param_t;
- static void gt_font_get(gt_font_param_t *param, uint16_t code) {
- if (param->code == code) return;
- uint8_t sty = param->sty_zh;
- if (code >= 0x20 && code <= 0x7e)
- sty = param->sty_en;
- memset(param->buf, 0, param->size * param->bpp * param->size * param->bpp);
- uint32_t dot = get_font(param->buf, sty, code, param->size * param->bpp, param->size * param->bpp, param->thickness);
- param->code = code;
- param->dot = dot / param->bpp;
- Gray_Process(param->buf, param->dot, param->size, param->bpp);
- // LLOGD("dot:%d param->dot:%d aram->size:%d param->bpp:%d",dot,param->dot,param->size, param->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;
- uint8_t c, c_bits;
- uint32_t t = (w + 7) / 8 * bpp;
- uint32_t adv_w = 0;
- uint32_t cur_w = 0;
- for (i = 0; i < (t * h); i++) {
- c = *p++;
- for (j = 0; j < (8 / bpp); j++) {
- c_bits = (c >> (((8 / bpp) - 1 - j) * bpp)) & (0xff >> (8 - bpp));
- if (x < w && c_bits != 0) {
- cur_w = x;
- }
- x++;
- if(x >= ((w + 7) / 8 * 8)) {
- if (cur_w > adv_w)
- adv_w = cur_w;
- x = 0;
- y++;
- }
- }
- }
- 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) {
- 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;
- }
- static bool gt_font_get_glyph_dsc(const struct _lv_font_struct *font, lv_font_glyph_dsc_t *dsc_out, uint32_t letter, uint32_t letter_next) {
- gt_font_param_t *param = font->dsc;
- uint16_t code = gt_unicode2gb18030(letter);
- dsc_out->adv_w = gt_font_get_adv_w(param, code);
- 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;
- 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;
- gt_font_get(param, gt_unicode2gb18030(letter));
- return param->buf;
- }
- bool lv_font_is_gt(lv_font_t *font) {
- if (font != NULL && font->get_glyph_dsc == gt_font_get_glyph_dsc)
- return true;
- return false;
- }
- 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 = 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;
- }
- 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;
- return font;
- }
- void lv_font_del_gt(lv_font_t *font) {
- if (!font) return;
- if (!font->dsc) {
- lv_mem_free(font);
- return;
- }
- gt_font_param_t *param = font->dsc;
- lv_mem_free(param);
- lv_mem_free(font);
- }
- #else
- bool lv_font_is_gt(lv_font_t *font) {
- return false;
- }
- 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) {
- return NULL;
- }
- void lv_font_del_gt(lv_font_t *font) {
- }
- #endif
|