转换工具下载
- 链接: 工具下载 提取码:kzlc
字体下载
打开工具生成外部汉字bin文件,这里选择鸿蒙黑体HarmonyOS_Sans_SC_Black.ttf
static uint8_t __g_font_buf[364];//如bin文件存在SPI FLASH可使用此buff static uint8_t *__user_font_getdata(int offset, int size){ //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size); //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset); lv_fs_file_t file; lv_fs_res_t result; result = lv_fs_open(&file, "P:/test/myFont.bin", LV_FS_MODE_RD); if (result != LV_FS_RES_OK) return NULL; lv_fs_seek(&file, offset); uint32_t len; lv_fs_read(&file, __g_font_buf, size, &len); lv_fs_close(&file); return __g_font_buf; }lvgl文件系统驱动匹配
/** * @file lv_tutorial_images.h * */ /* * ------------------------------------------------------------------------------------------- * Learn how to use images stored internally (in a variable) or externally (e.g. on an SD card) *------------------------------------------------------------------------------------------- * * * The basic object to display images is 'lv_img'. The displayed image is called 'image source'. * * IMAGE SOURCES * ----------------- * * 1. IMAGE CONVETED TO C ARRAY * With the online image converter tool you can convert your images into C arrays: * https://littlevgl.com/image-to-c-array * * If you have the converted file: * - Copy the result C file into your project * - Declare the image variable with 'LV_IMG_DECLARE(image_name);' * - Set it for an image object: 'lv_img_set_src(img1, &image_name);' * * In this case you don't need to think about color format because * all color formats are included in the C file and the currently active * (according to 'LV_COLOR_DEPTH' in 'lv_conf.h') will be enabled. * * 2. IMAGE FROM FILE * With the above mentioned online image converter tool you can convert images to binary files too. * Now you should choose the right color format. * The result of the conversion should be a *.bin file which can be copied to any external device (e.g. SD card) * * To read this file you need to provide some functions for LittlevGL. You will see it in the example below. * * To set a file for an image object use: 'lv_img_set_src(img, "S:path/to/image.bin")' * * 3. IMAGE FROM SYMBOL FONT * The symbol fonts are letters however they look like small images. * To set symbols for an image object use: 'lv_img_set_src(img, LV_SYMBOL_CLOSE)' * * TRANSPARENCY * --------------- * * The images have 2 features related to pixel level transparency: * * 1. CHROMA KEYING * The LV_COLOR_TRANSP (lv_conf.h) pixels will be transparent. * This feature can be enabled individually in the images in the online image converter tool. * Because Chroma keying can only show/hide a pixel edges on the image might be jagged. * On the other hand it dosn't mean extra memory usage. * * 2. ALHPA BYTE * It will add an extra byte to every pixel to show its opacity. * This feature also can be enabled in the online converter tool. * In case of 8 and 16 bit images it means extra 8 bit for every pixel. * The 24 bit images are stored on 32 bit independently from Alpha byte settings. * Alpha byte results very smooth edges and high quality images. */ /********************* * INCLUDES *********************/ #include "lv_tutorial_images.h" #if LV_USE_TUTORIALS #include "lvgl/lvgl.h" #include #include /********************* * DEFINES *********************/ #define PC_FILES 1 /*If you are on PC you can add PC file function to 'lv_fs'*/ /********************** * TYPEDEFS **********************/ typedef FILE * pc_file_t; /********************** * STATIC PROTOTYPES **********************/ #if PC_FILES && LV_USE_FILESYSTEM /*Interface functions to standard C file functions (only the required ones to image handling)*/ static lv_fs_res_t pcfs_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv_fs_mode_t mode); static lv_fs_res_t pcfs_close(lv_fs_drv_t * drv, void * file_p); static lv_fs_res_t pcfs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); static lv_fs_res_t pcfs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos); static lv_fs_res_t pcfs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); static lv_fs_res_t pcfs_size(struct _lv_fs_drv_t* drv, void* file_p, uint32_t* size_p); static lv_fs_res_t pcfs_write(struct _lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw); #endif /********************** * STATIC VARIABLES **********************/ /*Declare the "source code image" which is stored in the flash*/ LV_IMG_DECLARE(red_flower) LV_IMG_DECLARE(red_rose_16); LV_IMG_DECLARE(flower_icon_alpha); /********************** * MACROS **********************/ /********************** * GLOBAL FUNCTIONS **********************/ void init_fs_config(void) { lv_fs_drv_t pcfs_drv; /*A driver descriptor*/ memset(&pcfs_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/ pcfs_drv.file_size = sizeof(pc_file_t); /*Set up fields...*/ pcfs_drv.letter = 'P'; pcfs_drv.write_cb = pcfs_write; pcfs_drv.open_cb = pcfs_open; pcfs_drv.close_cb = pcfs_close; pcfs_drv.read_cb = pcfs_read; pcfs_drv.seek_cb = pcfs_seek; pcfs_drv.tell_cb = pcfs_tell; pcfs_drv.size_cb = pcfs_size; lv_fs_drv_register(&pcfs_drv); } /** * Create images from variable and file */ void lv_tutorial_image(void) { lv_obj_t * scr = lv_disp_get_scr_act(NULL); /*Get the current screen*/ /************************* * IMAGE FROM SOURCE CODE *************************/ #if 0 lv_obj_t * img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &red_flower); /*Set the created file as image (a red flower)*/ lv_obj_set_pos(img_var, 10, 10); /*Set the positions*/ lv_obj_set_drag(img_var, true); img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &red_rose_16); /*Set the created file as image (a red rose)*/ lv_obj_set_pos(img_var, 10, 100); /*Set the positions*/ lv_obj_set_drag(img_var, true); static lv_style_t style_red; lv_style_copy(&style_red, &lv_style_plain); style_red.image.color = LV_COLOR_RED; img_var = lv_img_create(scr, NULL); /*Crate an image object*/ lv_img_set_src(img_var, &flower_icon_alpha); /*Set the created file as image (a red flower icon)*/ lv_img_set_style(img_var, LV_IMG_STYLE_MAIN, &style_red); lv_obj_set_pos(img_var, 10, 200); /*Set the positions*/ lv_obj_set_drag(img_var, true); #endif #if PC_FILES && LV_USE_FILESYSTEM /************************** * IMAGE FROM BINARY FILE **************************/ /* Add a simple drive to open images from PC*/ lv_fs_drv_t pcfs_drv; /*A driver descriptor*/ memset(&pcfs_drv, 0, sizeof(lv_fs_drv_t)); /*Initialization*/ pcfs_drv.file_size = sizeof(pc_file_t); /*Set up fields...*/ pcfs_drv.letter = 'P'; pcfs_drv.open_cb = pcfs_open; pcfs_drv.close_cb = pcfs_close; pcfs_drv.read_cb = pcfs_read; pcfs_drv.seek_cb = pcfs_seek; pcfs_drv.tell_cb = pcfs_tell; pcfs_drv.size_cb = pcfs_size; lv_fs_drv_register(&pcfs_drv); // lv_obj_t * img_bin = lv_img_create(scr, NULL); /*Create an image object*/ /* Set the image's file according to the current color depth * a blue flower picture*/ #if LV_COLOR_DEPTH == 8 lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_8.bin"); #elif LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0 //lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_16.bin"); #elif LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 1 // lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_16_swap.bin"); #elif LV_COLOR_DEPTH == 32 // lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_flower_32.bin"); #endif // lv_obj_set_pos(img_bin, 150, 10); /*Align next to the source image*/ // lv_obj_set_drag(img_bin, true); lv_obj_t* img_bin = lv_img_create(scr, NULL); /*Crate an image object*/ // lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/blue_rose_16.bin"); /*Set the created file as image (a red rose)*/ lv_img_set_src(img_bin, "P:/watch1.bin"); lv_obj_set_pos(img_bin, 0, 0); /*Set the positions*/ lv_obj_set_drag(img_bin, true); // static lv_style_t style_blue; // lv_style_copy(&style_blue, &lv_style_plain); // style_blue.image.color = LV_COLOR_BLUE; // // img_bin = lv_img_create(scr, NULL); /*Crate an image object*/ // lv_img_set_src(img_bin, "P:/lv_examples/lv_tutorial/6_images/flower_icon_alpha.bin"); /*Set the created file as image (a red flower icon)*/ // lv_img_set_style(img_bin, LV_IMG_STYLE_MAIN, &style_blue); // lv_obj_set_pos(img_bin, 150, 200); /*Set the positions*/ // lv_obj_set_drag(img_bin, true); #endif // lv_obj_t * img_symbol = lv_img_create(scr, NULL); // lv_img_set_src(img_symbol, LV_SYMBOL_OK); // lv_obj_set_drag(img_symbol, true); // lv_obj_set_pos(img_symbol, 300, 10); /*Set the positions*/ } /********************** * STATIC FUNCTIONS **********************/ #if PC_FILES && LV_USE_FILESYSTEM /** * Open a file from the PC * @param drv pointer to the current driver * @param file_p pointer to a FILE* variable * @param fn name of the file. * @param mode element of 'fs_mode_t' enum or its 'OR' connection (e.g. FS_MODE_WR | FS_MODE_RD) * @return LV_FS_RES_OK: no error, the file is opened * any error from lv_fs_res_t enum */ static lv_fs_res_t pcfs_open(lv_fs_drv_t * drv, void * file_p, const char * fn, lv_fs_mode_t mode) { (void) drv; /*Unused*/ errno = 0; const char * flags = ""; if(mode == LV_FS_MODE_WR) flags = "wb"; else if(mode == LV_FS_MODE_RD) flags = "rb"; else if(mode == (LV_FS_MODE_WR | LV_FS_MODE_RD)) flags = "a+"; /*Make the path relative to the current directory (the projects root folder)*/ char buf[256]; sprintf(buf, "./%s", fn); pc_file_t f = fopen(buf, flags); if(f == NULL) return LV_FS_RES_UNKNOWN; else { fseek(f, 0, SEEK_SET); /* 'file_p' is pointer to a file descriptor and * we need to store our file descriptor here*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *fp = f; } return LV_FS_RES_OK; } static lv_fs_res_t pcfs_write(struct _lv_fs_drv_t* drv, void* file_p, const void* buf, uint32_t btw, uint32_t* bw) { (void)drv; /*Unused*/ pc_file_t* fp = file_p; /*Just avoid the confusing casings*/ *bw = (uint32_t)fwrite(buf, 1, btw, *fp); return LV_FS_RES_OK; } /** * Close an opened file * @param drv pointer to the current driver * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open) * @return LV_FS_RES_OK: no error, the file is read * any error from lv__fs_res_t enum */ static lv_fs_res_t pcfs_close(lv_fs_drv_t * drv, void * file_p) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ fclose(*fp); return LV_FS_RES_OK; } /** * Read data from an opened file * @param drv pointer to the current driver * @param file_p pointer to a FILE variable. * @param buf pointer to a memory block where to store the read data * @param btr number of Bytes To Read * @param br the real number of read bytes (Byte Read) * @return LV_FS_RES_OK: no error, the file is read * any error from lv__fs_res_t enum */ static lv_fs_res_t pcfs_read(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *br = (uint32_t)fread(buf, 1, btr, *fp); return LV_FS_RES_OK; } /** * Set the read write pointer. Also expand the file size if necessary. * @param drv pointer to the current driver * @param file_p pointer to a FILE* variable. (opened with lv_ufs_open ) * @param pos the new position of read write pointer * @return LV_FS_RES_OK: no error, the file is read * any error from lv__fs_res_t enum */ static lv_fs_res_t pcfs_seek(lv_fs_drv_t * drv, void * file_p, uint32_t pos) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ fseek(*fp, pos, SEEK_SET); return LV_FS_RES_OK; } /** * Give the position of the read write pointer * @param drv pointer to the current driver * @param file_p pointer to a FILE* variable. * @param pos_p pointer to to store the result * @return LV_FS_RES_OK: no error, the file is read * any error from lv__fs_res_t enum */ static lv_fs_res_t pcfs_tell(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p) { (void) drv; /*Unused*/ pc_file_t * fp = file_p; /*Just avoid the confusing casings*/ *pos_p = ftell(*fp); return LV_FS_RES_OK; } static lv_fs_res_t pcfs_size(struct _lv_fs_drv_t* drv, void* file_p, uint32_t* size_p) { (void)drv; /*Unused*/ pc_file_t* fp = file_p; /*Just avoid the confusing casings*/ fseek(*fp, 0L, SEEK_END); *size_p = ftell(*fp); fseek(*fp, 0L, SEEK_SET); return LV_FS_RES_OK; } #endif #endif /*LV_USE_TUTORIALS*/鸿蒙字体展示
#pragma execution_character_set("utf-8") LV_FONT_DECLARE(myFont) int main(int argc, char** argv) { /*Initialize LittlevGL*/ lv_init(); init_fs_config(); /*Initialize the HAL for LittlevGL*/ hal_init(); lv_obj_t* scr = lv_scr_act(); lv_obj_t* cont = lv_cont_create(scr, NULL); lv_obj_set_size(cont, LV_HOR_RES_MAX, LV_VER_RES_MAX); lv_obj_t* label = lv_label_create(cont, NULL); lv_obj_align(label, NULL, LV_ALIGN_CENTER, 0, 0); lv_obj_set_auto_realign(label, true); lv_obj_set_style_local_text_font(label, LV_LABEL_PART_MAIN, \ LV_STATE_DEFAULT, &myFont); lv_obj_set_style_local_text_color(label, LV_LABEL_PART_MAIN, \ LV_STATE_DEFAULT, LV_COLOR_MAKE(0XFF,0X00,0XFF)); lv_label_set_text(label, "华为鸿蒙字体!\r\nHuawei Hongmeng font!"); while (1) { /* Periodically call the lv_task handler. * It could be done in a timer interrupt or an OS task too.*/ lv_task_handler(); Sleep(10); /*Just to let the system breathe */ } return 0; }运行效果图