new font system WIP
This commit is contained in:
@@ -110,7 +110,7 @@ void lv_rletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
|||||||
|
|
||||||
uint8_t col, col_sub, row;
|
uint8_t col, col_sub, row;
|
||||||
#if LV_FONT_ANTIALIAS == 0
|
#if LV_FONT_ANTIALIAS == 0
|
||||||
for(row = 0; row < font_p->height_row; row ++) {
|
for(row = 0; row < font_p->h_px; row ++) {
|
||||||
for(col = 0, col_sub = 7; col < w; col ++, col_sub--) {
|
for(col = 0, col_sub = 7; col < w; col ++, col_sub--) {
|
||||||
if(*bitmap_p & (1 << col_sub)) {
|
if(*bitmap_p & (1 << col_sub)) {
|
||||||
lv_rpx(pos_p->x + col, pos_p->y + row, mask_p, color, opa);
|
lv_rpx(pos_p->x + col, pos_p->y + row, mask_p, color, opa);
|
||||||
@@ -131,7 +131,7 @@ void lv_rletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
|||||||
const uint8_t * map2_p = bitmap_p + width_byte;
|
const uint8_t * map2_p = bitmap_p + width_byte;
|
||||||
uint8_t px_cnt;
|
uint8_t px_cnt;
|
||||||
uint8_t col_byte_cnt;
|
uint8_t col_byte_cnt;
|
||||||
for(row = 0; row < (font_p->height_row >> 1); row ++) {
|
for(row = 0; row < (font_p->h_px >> 1); row ++) {
|
||||||
col_byte_cnt = 0;
|
col_byte_cnt = 0;
|
||||||
col_sub = 7;
|
col_sub = 7;
|
||||||
for(col = 0; col < (w >> 1); col ++) {
|
for(col = 0; col < (w >> 1); col ++) {
|
||||||
|
|||||||
@@ -203,11 +203,30 @@ void lv_vfill(const lv_area_t * cords_p, const lv_area_t * mask_p,
|
|||||||
void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
||||||
const lv_font_t * font_p, uint32_t letter,
|
const lv_font_t * font_p, uint32_t letter,
|
||||||
lv_color_t color, lv_opa_t opa)
|
lv_color_t color, lv_opa_t opa)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
static uint8_t bpp1_opa_table[2] = {0, 255}; /*Opacity mapping with bpp = 1 (Just for compatibility)*/
|
||||||
|
static uint8_t bpp2_opa_table[4] = {0, 85, 170, 255}; /*Opacity mapping with bpp = 2*/
|
||||||
|
static uint8_t bpp4_opa_table[16] = {0, 17, 34, 51, /*Opacity mapping with bpp = 4*/
|
||||||
|
68, 85, 102, 119,
|
||||||
|
136, 153, 170, 187,
|
||||||
|
204, 221, 238, 255};
|
||||||
|
|
||||||
if(font_p == NULL) return;
|
if(font_p == NULL) return;
|
||||||
|
|
||||||
uint8_t letter_w = lv_font_get_width(font_p, letter);
|
uint8_t letter_w = lv_font_get_width(font_p, letter);
|
||||||
uint8_t letter_h = lv_font_get_height(font_p);
|
uint8_t letter_h = lv_font_get_height(font_p);
|
||||||
|
uint8_t bpp = font_p->bpp; /*Bit per pixel (1,2 or 4)*/
|
||||||
|
uint8_t *bpp_opa_table; /*Value per pixel (1, 4 or 16)*/
|
||||||
|
uint8_t mask_init;
|
||||||
|
uint8_t mask;
|
||||||
|
|
||||||
|
switch(bpp) {
|
||||||
|
case 1: bpp_opa_table = bpp1_opa_table; mask_init = 0x80; break;
|
||||||
|
case 2: bpp_opa_table = bpp2_opa_table; mask_init = 0xC0; break;
|
||||||
|
case 4: bpp_opa_table = bpp4_opa_table; mask_init = 0xF0; break;
|
||||||
|
default: return; /*Invalid bpp. Can't render the letter*/
|
||||||
|
}
|
||||||
|
|
||||||
const uint8_t * map_p = lv_font_get_bitmap(font_p, letter);
|
const uint8_t * map_p = lv_font_get_bitmap(font_p, letter);
|
||||||
|
|
||||||
@@ -223,15 +242,17 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
|||||||
lv_coord_t col, row;
|
lv_coord_t col, row;
|
||||||
uint8_t col_bit;
|
uint8_t col_bit;
|
||||||
uint8_t col_byte_cnt;
|
uint8_t col_byte_cnt;
|
||||||
uint8_t width_byte = letter_w >> 3; /*Width in bytes (e.g. w = 11 -> 2 bytes wide)*/
|
uint8_t width_byte_scr = letter_w >> 3; /*Width in bytes (on the screen finally) (e.g. w = 11 -> 2 bytes wide)*/
|
||||||
if(letter_w & 0x7) width_byte++;
|
if(letter_w & 0x7) width_byte_scr++;
|
||||||
|
uint8_t width_byte_bpp = (letter_w * bpp) >> 3; /*Width in bytes in the font (e.g. w = 11 -> 2 bytes wide)*/
|
||||||
|
if((letter_w * bpp) & 0x7) width_byte_bpp++;
|
||||||
|
|
||||||
/* Calculate the col/row start/end on the map
|
/* Calculate the col/row start/end on the map
|
||||||
* If font anti alaiassing is enabled use the reduced letter sizes*/
|
* If font anti aliasing is enabled use the reduced letter sizes*/
|
||||||
lv_coord_t col_start = pos_p->x > mask_p->x1 ? 0 : mask_p->x1 - pos_p->x;
|
lv_coord_t col_start = pos_p->x > mask_p->x1 ? 0 : mask_p->x1 - pos_p->x;
|
||||||
lv_coord_t col_end = pos_p->x + (letter_w >> LV_FONT_ANTIALIAS) < mask_p->x2 ? (letter_w >> LV_FONT_ANTIALIAS) : mask_p->x2 - pos_p->x + 1;
|
lv_coord_t col_end = pos_p->x + letter_w < mask_p->x2 ? letter_w : mask_p->x2 - pos_p->x + 1;
|
||||||
lv_coord_t row_start = pos_p->y > mask_p->y1 ? 0 : mask_p->y1 - pos_p->y;
|
lv_coord_t row_start = pos_p->y > mask_p->y1 ? 0 : mask_p->y1 - pos_p->y;
|
||||||
lv_coord_t row_end = pos_p->y + (letter_h >> LV_FONT_ANTIALIAS) < mask_p->y2 ? (letter_h >> LV_FONT_ANTIALIAS) : mask_p->y2 - pos_p->y + 1;
|
lv_coord_t row_end = pos_p->y + letter_h < mask_p->y2 ? letter_h : mask_p->y2 - pos_p->y + 1;
|
||||||
|
|
||||||
/*Set a pointer on VDB to the first pixel of the letter*/
|
/*Set a pointer on VDB to the first pixel of the letter*/
|
||||||
vdb_buf_tmp += ((pos_p->y - vdb_p->area.y1) * vdb_width)
|
vdb_buf_tmp += ((pos_p->y - vdb_p->area.y1) * vdb_width)
|
||||||
@@ -241,78 +262,36 @@ void lv_vletter(const lv_point_t * pos_p, const lv_area_t * mask_p,
|
|||||||
vdb_buf_tmp += (row_start * vdb_width) + col_start;
|
vdb_buf_tmp += (row_start * vdb_width) + col_start;
|
||||||
|
|
||||||
/*Move on the map too*/
|
/*Move on the map too*/
|
||||||
map_p += ((row_start << LV_FONT_ANTIALIAS) * width_byte) + ((col_start << LV_FONT_ANTIALIAS) >> 3);
|
map_p += (row_start * width_byte_bpp) + ((col_start * bpp) >> 3);
|
||||||
|
|
||||||
#if LV_FONT_ANTIALIAS != 0
|
uint8_t letter_px;
|
||||||
lv_opa_t opa_tmp = opa;
|
|
||||||
if(opa_tmp != LV_OPA_COVER) opa_tmp = opa_tmp >> 2; /*Opacity per pixel (used when sum the pixels)*/
|
|
||||||
const uint8_t * map1_p = map_p;
|
|
||||||
const uint8_t * map2_p = map_p + width_byte;
|
|
||||||
uint8_t px_cnt;
|
|
||||||
for(row = row_start; row < row_end; row ++) {
|
for(row = row_start; row < row_end; row ++) {
|
||||||
col_byte_cnt = 0;
|
col_byte_cnt = 0;
|
||||||
col_bit = 7 - ((col_start << LV_FONT_ANTIALIAS) % 8);
|
col_bit = (col_start * bpp) % 8;
|
||||||
|
mask = mask_init >> col_bit;
|
||||||
for(col = col_start; col < col_end; col ++) {
|
for(col = col_start; col < col_end; col ++) {
|
||||||
|
letter_px = (*map_p & mask) >> (8 - col_bit - bpp);
|
||||||
|
if(letter_px != 0) {
|
||||||
|
*vdb_buf_tmp = lv_color_mix(color, *vdb_buf_tmp, bpp_opa_table[letter_px]);
|
||||||
|
}
|
||||||
|
|
||||||
px_cnt = 0;
|
vdb_buf_tmp++;
|
||||||
if((*map1_p & (1 << col_bit)) != 0) px_cnt++;
|
|
||||||
if((*map2_p & (1 << col_bit)) != 0) px_cnt++;
|
if(col_bit < 8 - bpp) {
|
||||||
if(col_bit != 0) col_bit --;
|
col_bit += bpp;
|
||||||
|
mask = mask >> bpp;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
col_bit = 7;
|
col_bit = 0;
|
||||||
col_byte_cnt ++;
|
col_byte_cnt ++;
|
||||||
map1_p ++;
|
mask = mask_init;
|
||||||
map2_p ++;
|
map_p ++;
|
||||||
}
|
|
||||||
if((*map1_p & (1 << col_bit)) != 0) px_cnt++;
|
|
||||||
if((*map2_p & (1 << col_bit)) != 0) px_cnt++;
|
|
||||||
if(col_bit != 0) col_bit --;
|
|
||||||
else {
|
|
||||||
col_bit = 7;
|
|
||||||
col_byte_cnt ++;
|
|
||||||
map1_p ++;
|
|
||||||
map2_p ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(px_cnt != 0) {
|
|
||||||
if(opa == LV_OPA_COVER) *vdb_buf_tmp = lv_color_mix(color, *vdb_buf_tmp, 63*px_cnt);
|
|
||||||
else *vdb_buf_tmp = lv_color_mix(color, *vdb_buf_tmp, opa_tmp * px_cnt);
|
|
||||||
}
|
|
||||||
|
|
||||||
vdb_buf_tmp++;
|
|
||||||
}
|
|
||||||
|
|
||||||
map1_p += width_byte;
|
|
||||||
map2_p += width_byte;
|
|
||||||
map1_p += width_byte - col_byte_cnt;
|
|
||||||
map2_p += width_byte - col_byte_cnt;
|
|
||||||
vdb_buf_tmp += vdb_width - ((col_end) - (col_start)); /*Next row in VDB*/
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
for(row = row_start; row < row_end; row ++) {
|
|
||||||
col_byte_cnt = 0;
|
|
||||||
col_bit = 7 - (col_start % 8);
|
|
||||||
for(col = col_start; col < col_end; col ++) {
|
|
||||||
|
|
||||||
if((*map_p & (1 << col_bit)) != 0) {
|
|
||||||
if(opa == LV_OPA_COVER) *vdb_buf_tmp = color;
|
|
||||||
else *vdb_buf_tmp = lv_color_mix(color, *vdb_buf_tmp, opa);
|
|
||||||
}
|
|
||||||
|
|
||||||
vdb_buf_tmp++;
|
|
||||||
|
|
||||||
if(col_bit != 0) col_bit --;
|
|
||||||
else {
|
|
||||||
col_bit = 7;
|
|
||||||
col_byte_cnt ++;
|
|
||||||
map_p ++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
map_p += width_byte - col_byte_cnt;
|
map_p += (width_byte_bpp) - col_byte_cnt;
|
||||||
vdb_buf_tmp += vdb_width - (col_end - col_start); /*Next row in VDB*/
|
vdb_buf_tmp += vdb_width - (col_end - col_start); /*Next row in VDB*/
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ bool lv_area_is_on(const lv_area_t * a1_p, const lv_area_t * a2_p)
|
|||||||
if(lv_area_is_point_on(a1_p, &p)) return true;
|
if(lv_area_is_point_on(a1_p, &p)) return true;
|
||||||
|
|
||||||
/*a2 right-top corner is on a1*/
|
/*a2 right-top corner is on a1*/
|
||||||
p.x = a2_p->x1;
|
p.x = a2_p->x2;
|
||||||
p.y = a2_p->y1;
|
p.y = a2_p->y1;
|
||||||
if(lv_area_is_point_on(a1_p, &p)) return true;
|
if(lv_area_is_point_on(a1_p, &p)) return true;
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,11 @@
|
|||||||
/**********************
|
/**********************
|
||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
**********************/
|
**********************/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t glyph_index;
|
||||||
|
uint32_t unicode;
|
||||||
|
uint8_t w_px;
|
||||||
|
}asd_glyph_dsc_t;
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
* STATIC PROTOTYPES
|
* STATIC PROTOTYPES
|
||||||
@@ -109,7 +114,7 @@ void lv_font_init(void)
|
|||||||
|
|
||||||
/*DEJAVU 20*/
|
/*DEJAVU 20*/
|
||||||
#if USE_LV_FONT_DEJAVU_20 != 0
|
#if USE_LV_FONT_DEJAVU_20 != 0
|
||||||
lv_font_add(&lv_font_dejavu_20, NULL);
|
lv_font_add(&arial_20, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USE_LV_FONT_DEJAVU_20_SUP != 0
|
#if USE_LV_FONT_DEJAVU_20_SUP != 0
|
||||||
@@ -446,9 +451,9 @@ const uint8_t * lv_font_get_bitmap(const lv_font_t * font_p, uint32_t letter)
|
|||||||
{
|
{
|
||||||
const lv_font_t * font_i = font_p;
|
const lv_font_t * font_i = font_p;
|
||||||
while(font_i != NULL) {
|
while(font_i != NULL) {
|
||||||
if(letter >= font_i->first_ascii && letter <= font_i->last_ascii) {
|
if(letter >= font_i->unicode_first && letter <= font_i->unicode_last) {
|
||||||
uint32_t index = (letter - font_i->first_ascii);
|
uint32_t index = (letter - font_i->unicode_first);
|
||||||
return &font_i->bitmap[font_i->map[index]];
|
return &font_i->glyph_bitmap[font_i->glyph_dsc[index].glyph_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
font_i = font_i->next_page;
|
font_i = font_i->next_page;
|
||||||
@@ -467,9 +472,9 @@ uint8_t lv_font_get_width(const lv_font_t * font_p, uint32_t letter)
|
|||||||
{
|
{
|
||||||
const lv_font_t * font_i = font_p;
|
const lv_font_t * font_i = font_p;
|
||||||
while(font_i != NULL) {
|
while(font_i != NULL) {
|
||||||
if(letter >= font_i->first_ascii && letter <= font_i->last_ascii) {
|
if(letter >= font_i->unicode_first && letter <= font_i->unicode_last) {
|
||||||
uint32_t index = (letter - font_i->first_ascii);
|
uint32_t index = (letter - font_i->unicode_first);
|
||||||
return font_i->width[index];
|
return font_i->glyph_dsc[index].w_px;
|
||||||
}
|
}
|
||||||
font_i = font_i->next_page;
|
font_i = font_i->next_page;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,15 +29,27 @@ extern "C" {
|
|||||||
* TYPEDEFS
|
* TYPEDEFS
|
||||||
**********************/
|
**********************/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t w_px :8;
|
||||||
|
uint32_t glyph_index :24;
|
||||||
|
}lv_font_glyph_dsc_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t unicode :21;
|
||||||
|
uint32_t glyph_dsc_index :11;
|
||||||
|
}lv_font_unicode_map_t;
|
||||||
|
|
||||||
typedef struct _lv_font_struct
|
typedef struct _lv_font_struct
|
||||||
{
|
{
|
||||||
uint32_t first_ascii;
|
uint32_t unicode_first;
|
||||||
uint32_t last_ascii;
|
uint32_t unicode_last;
|
||||||
uint8_t height_row;
|
uint8_t h_px;
|
||||||
const uint8_t * bitmap;
|
const uint8_t * glyph_bitmap;
|
||||||
const uint32_t * map;
|
const lv_font_glyph_dsc_t * glyph_dsc;
|
||||||
const uint8_t * width;
|
|
||||||
struct _lv_font_struct * next_page; /*Pointer to a font extension*/
|
struct _lv_font_struct * next_page; /*Pointer to a font extension*/
|
||||||
|
uint32_t bpp :3; /*Bit per pixel: 1, 2 or 4*/
|
||||||
}lv_font_t;
|
}lv_font_t;
|
||||||
|
|
||||||
/**********************
|
/**********************
|
||||||
@@ -71,7 +83,7 @@ const uint8_t * lv_font_get_bitmap(const lv_font_t * font_p, uint32_t letter);
|
|||||||
*/
|
*/
|
||||||
static inline uint8_t lv_font_get_height(const lv_font_t * font_p)
|
static inline uint8_t lv_font_get_height(const lv_font_t * font_p)
|
||||||
{
|
{
|
||||||
return font_p->height_row;
|
return font_p->h_px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -81,7 +93,7 @@ static inline uint8_t lv_font_get_height(const lv_font_t * font_p)
|
|||||||
*/
|
*/
|
||||||
static inline uint8_t lv_font_get_height_scale(const lv_font_t * font_p)
|
static inline uint8_t lv_font_get_height_scale(const lv_font_t * font_p)
|
||||||
{
|
{
|
||||||
return (font_p->height_row >> LV_FONT_ANTIALIAS) >> LV_ANTIALIAS;
|
return (font_p->h_px >> LV_FONT_ANTIALIAS) >> LV_ANTIALIAS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "../lv_font.h"
|
#include "../lv_font.h"
|
||||||
|
|
||||||
extern lv_font_t lv_font_dejavu_20;
|
extern lv_font_t arial_20;
|
||||||
|
|
||||||
#endif /*USE_LV_FONT_DEJAVU_20*/
|
#endif /*USE_LV_FONT_DEJAVU_20*/
|
||||||
#endif /*DEJAVU_20_H*/
|
#endif /*DEJAVU_20_H*/
|
||||||
|
|||||||
@@ -315,7 +315,7 @@ uint8_t lv_txt_utf8_size(uint8_t c)
|
|||||||
* @param letter_uni an Unicode letter
|
* @param letter_uni an Unicode letter
|
||||||
* @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
|
* @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
|
||||||
*/
|
*/
|
||||||
uint32_t txt_unicode_to_utf8(uint32_t letter_uni)
|
uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni)
|
||||||
{
|
{
|
||||||
if(letter_uni < 128) return letter_uni;
|
if(letter_uni < 128) return letter_uni;
|
||||||
uint8_t bytes[4];
|
uint8_t bytes[4];
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ uint8_t lv_txt_utf8_size(uint8_t c);
|
|||||||
* @param letter_uni an Unicode letter
|
* @param letter_uni an Unicode letter
|
||||||
* @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
|
* @return UTF-8 coded character in Little Endian to be compatible with C chars (e.g. 'Á', 'Ű')
|
||||||
*/
|
*/
|
||||||
uint32_t txt_unicode_to_utf8(uint32_t letter_uni);
|
uint32_t lv_txt_unicode_to_utf8(uint32_t letter_uni);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode an UTF-8 character from a string.
|
* Decode an UTF-8 character from a string.
|
||||||
|
|||||||
Reference in New Issue
Block a user