1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00

Merge branch 'master' into dev-5.3

This commit is contained in:
Gabor Kiss-Vamosi 2018-10-15 12:38:27 +02:00
commit 108278c4b5
4 changed files with 234 additions and 36 deletions

View File

@ -317,11 +317,11 @@ static bool lv_bar_design(lv_obj_t * bar, const lv_area_t * mask, lv_design_mode
lv_coord_t h = lv_area_get_height(&indic_area);
if(w >= h) {
indic_area.x2 = (int32_t)((int32_t)w * (ext->cur_value - ext->min_value - 1)) / (ext->max_value - ext->min_value);
indic_area.x2 = indic_area.x1 + indic_area.x2;
indic_area.x2 = (int32_t)((int32_t)w * (ext->cur_value - ext->min_value)) / (ext->max_value - ext->min_value);
indic_area.x2 = indic_area.x1 + indic_area.x2 - 1;
} else {
indic_area.y1 = (int32_t)((int32_t)h * (ext->cur_value - ext->min_value - 1)) / (ext->max_value - ext->min_value);
indic_area.y1 = indic_area.y2 - indic_area.y1;
indic_area.y1 = (int32_t)((int32_t)h * (ext->cur_value - ext->min_value)) / (ext->max_value - ext->min_value);
indic_area.y1 = indic_area.y2 - indic_area.y1 + 1;
}
/*Draw the indicator*/

View File

@ -547,45 +547,42 @@ static lv_res_t lv_btnm_signal(lv_obj_t * btnm, lv_signal_t sign, void * param)
}
} else if(sign == LV_SIGNAL_RELEASED) {
if(ext->btn_id_pr != LV_BTNM_PR_NONE) {
if(ext->action) {
uint16_t txt_i = get_button_text(btnm, ext->btn_id_pr);
if(txt_i != LV_BTNM_PR_NONE && button_is_inactive(ext->map_p[txt_i]) == false) {
ext->action(btnm, cut_ctrl_byte(ext->map_p[txt_i]));
}
}
uint16_t txt_i = get_button_text(btnm, ext->btn_id_pr);
if(button_is_inactive(ext->map_p[txt_i]) == false && txt_i != LV_BTNM_PR_NONE) { /*Ignore the inactive buttons anf click between the buttons*/
if(ext->action)ext->action(btnm, cut_ctrl_byte(ext->map_p[txt_i]));
/*Invalidate to old pressed area*/;
lv_obj_get_coords(btnm, &btnm_area);
lv_area_copy(&btn_area, &ext->button_areas[ext->btn_id_pr]);
btn_area.x1 += btnm_area.x1;
btn_area.y1 += btnm_area.y1;
btn_area.x2 += btnm_area.x1;
btn_area.y2 += btnm_area.y1;
lv_inv_area(&btn_area);
if(ext->toggle != 0) {
/*Invalidate to old toggled area*/;
lv_area_copy(&btn_area, &ext->button_areas[ext->btn_id_tgl]);
/*Invalidate to old pressed area*/;
lv_obj_get_coords(btnm, &btnm_area);
lv_area_copy(&btn_area, &ext->button_areas[ext->btn_id_pr]);
btn_area.x1 += btnm_area.x1;
btn_area.y1 += btnm_area.y1;
btn_area.x2 += btnm_area.x1;
btn_area.y2 += btnm_area.y1;
lv_inv_area(&btn_area);
ext->btn_id_tgl = ext->btn_id_pr;
}
if(ext->toggle != 0) {
/*Invalidate to old toggled area*/;
lv_area_copy(&btn_area, &ext->button_areas[ext->btn_id_tgl]);
btn_area.x1 += btnm_area.x1;
btn_area.y1 += btnm_area.y1;
btn_area.x2 += btnm_area.x1;
btn_area.y2 += btnm_area.y1;
lv_inv_area(&btn_area);
ext->btn_id_tgl = ext->btn_id_pr;
}
#if USE_LV_GROUP
/*Leave the clicked button as pressed if this the focused object in a group*/
lv_group_t * g = lv_obj_get_group(btnm);
if(lv_group_get_focused(g) != btnm) {
#if USE_LV_GROUP
/*Leave the clicked button as pressed if this the focused object in a group*/
lv_group_t * g = lv_obj_get_group(btnm);
if(lv_group_get_focused(g) != btnm) {
ext->btn_id_pr = LV_BTNM_PR_NONE;
}
#else
ext->btn_id_pr = LV_BTNM_PR_NONE;
#endif
}
#else
ext->btn_id_pr = LV_BTNM_PR_NONE;
#endif
}
} else if(sign == LV_SIGNAL_PRESS_LOST || sign == LV_SIGNAL_DEFOCUS) {
ext->btn_id_pr = LV_BTNM_PR_NONE;

View File

@ -349,12 +349,12 @@ static bool lv_slider_design(lv_obj_t * slider, const lv_area_t * mask, lv_desig
if(ext->drag_value != LV_SLIDER_NOT_PRESSED) cur_value = ext->drag_value;
if(slider_w >= slider_h) {
area_indic.x2 = (int32_t)((int32_t)(lv_area_get_width(&area_indic) - 1) * (cur_value - min_value)) / (max_value - min_value);
area_indic.x2 = area_indic.x1 + area_indic.x2;
area_indic.x2 = (int32_t)((int32_t)(lv_area_get_width(&area_indic)) * (cur_value - min_value)) / (max_value - min_value);
area_indic.x2 = area_indic.x1 + area_indic.x2 - 1;
} else {
area_indic.y1 = (int32_t)((int32_t)(lv_area_get_height(&area_indic) - 1) * (cur_value - min_value)) / (max_value - min_value);
area_indic.y1 = area_indic.y2 - area_indic.y1;
area_indic.y1 = (int32_t)((int32_t)(lv_area_get_height(&area_indic)) * (cur_value - min_value)) / (max_value - min_value);
area_indic.y1 = area_indic.y2 - area_indic.y1 + 1;
}
if(cur_value != min_value) lv_draw_rect(&area_indic, mask, style_indic, opa_scale);

201
utils/bdf_font_converter.py Normal file
View File

@ -0,0 +1,201 @@
#!/user/bin/env python
'''
Small utility that converts 1bpp BDF fonts to a font compatible with littlevgl
'''
# General imports
import argparse
import math
class Glyph:
def __init__(self, props ):
for k, v in props.items():
setattr(self, k, v)
def __lt__(self, other):
return self.encoding < other.encoding
def get_width(self):
return self.dwidth[0]
def get_byte_width(self):
# Compute how many bytes wide the glyph will be
return math.ceil(self.dwidth[0] / 8.0)
def get_height(self):
return len(self.bitmap)
def get_encoding(self):
return self.encoding
def write_bitmap(self, f):
f.write('''/*Unicode: U+%04x ( %s ) , Width: %d */\n''' %
(self.encoding, self.name, self.dwidth[0]) )
for line in self.bitmap:
for i in range(0, len(line), 2):
f.write("0x%s," % line[i:i+2])
if(i > 0):
f.write(" ")
f.write("\n")
f.write("\n\n")
def parse_bdf(fn):
# Converts bdf file to a list of Glyphs
# Read in BDF File
with open(fn, "r") as f:
bdf = f.readlines()
bdf = [x.rstrip("\n") for x in bdf]
# Iterate through BDF Glyphs
glyphs = []
i = -1
while i < len(bdf):
props = {}
i += 1
tokens = bdf[i].split(' ')
if tokens[0] == 'ENDFONT':
break;
if tokens[0] != "STARTCHAR":
continue
props['name'] = tokens[1]
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "ENCODING":
continue
encoding = int(tokens[-1])
if encoding < 0: # skip glyphs with a negative encoding value
continue
props['encoding'] = encoding
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "SWIDTH":
continue
props['swidth'] = (int(tokens[1]), int(tokens[2]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "DWIDTH":
continue
props['dwidth'] = (int(tokens[1]), int(tokens[2]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "BBX":
continue
props['dwidth'] = (int(tokens[1]), int(tokens[2]),
int(tokens[3]), int(tokens[4]))
i += 1
tokens = bdf[i].split(' ')
if tokens[0] != "BITMAP":
continue
props['bitmap'] = []
while True:
i += 1
tokens = bdf[i].split(' ')
if tokens[0] == 'ENDCHAR':
break
props['bitmap'].append(tokens[0])
glyphs.append(Glyph(props))
return glyphs
def parse_args():
''' Parse CLI arguments into an object and a dictionary '''
parser = argparse.ArgumentParser()
parser.add_argument('bdf_fn', type=str, default='imgs',
help='BDF Filename')
parser.add_argument('font_name', type=str, default='font_name',
help='Name of the font to be generated')
args = parser.parse_args()
dargs = vars(args)
return (args, dargs)
def main():
args, dargs = parse_args()
glyphs = parse_bdf(args.bdf_fn)
glyphs.sort() # Sorts by encoding (utf8) value
################
# WRITE HEADER #
################
out = open(args.font_name + '.c', "w")
out.write('''
#include "../lv_misc/lv_font.h"
''')
#################
# WRITE BITMAPS #
#################
out.write(
'''
static const uint8_t %s_glyph_bitmap[] =
{
''' % args.font_name)
for glyph in glyphs:
glyph.write_bitmap(out)
out.write('''
};
''')
######################
# WRITE DESCRIPTIONS #
######################
out.write(
'''
/*Store the glyph descriptions*/
static const lv_font_glyph_dsc_t %s_glyph_dsc[] =
{
''' % args.font_name)
glyph_index = 0
for glyph in glyphs:
out.write('''
{.w_px = %d, .glyph_index = %d}, /*Unicode: U+%04x ( )*/
''' % (glyph.get_width(), glyph_index, glyph.get_encoding()) )
glyph_index += glyph.get_byte_width() * glyph.get_height()
out.write('''
};
''')
#####################
# WRITE FONT STRUCT #
#####################
out.write(
'''
lv_font_t %s =
{
.unicode_first = %d, /*First Unicode letter in this font*/
.unicode_last = %d, /*Last Unicode letter in this font*/
.h_px = %d, /*Font height in pixels*/
.glyph_bitmap = %s_glyph_bitmap, /*Bitmap of glyphs*/
.glyph_dsc = %s_glyph_dsc, /*Description of glyphs*/
.glyph_cnt = %d, /*Number of glyphs in the font*/
.unicode_list = NULL, /*Every character in the font from 'unicode_first' to 'unicode_last'*/
.get_bitmap = lv_font_get_bitmap_continuous, /*Function pointer to get glyph's bitmap*/
.get_width = lv_font_get_width_continuous, /*Function pointer to get glyph's width*/
.bpp = 1, /*Bit per pixel*/
.monospace = 0, /*Fix width (0: if not used)*/
.next_page = NULL, /*Pointer to a font extension*/
};
''' % (args.font_name,
glyphs[0].get_encoding(),
glyphs[-1].get_encoding(),
glyphs[0].get_height(),
args.font_name,
args.font_name,
len(glyphs),
) )
out.close()
if __name__=='__main__':
main()