From b70bba6fbd88ddefea35207865a72a3211a96162 Mon Sep 17 00:00:00 2001 From: lixianjing Date: Thu, 15 Aug 2019 09:06:35 +0800 Subject: [PATCH] improve lcd mono --- awtk_config.py | 3 +- docs/README.md | 1 + docs/changes.md | 93 +++++++++++++++++---------------- docs/how_to_support_mono_lcd.md | 49 +++++++++++++++++ src/lcd/lcd_mono.c | 4 +- src/lcd/lcd_mono.h | 10 ++-- src/lcd/lcd_sdl2_mono.c | 27 +++++----- 7 files changed, 119 insertions(+), 68 deletions(-) create mode 100644 docs/how_to_support_mono_lcd.md diff --git a/awtk_config.py b/awtk_config.py index fca074453..87ced65fd 100644 --- a/awtk_config.py +++ b/awtk_config.py @@ -43,7 +43,7 @@ else: #NANOVG_BACKEND='GLES2' #NANOVG_BACKEND='GLES3' #NANOVG_BACKEND='AGG' -#NANOVG_BACKEND='AGGE' +NANOVG_BACKEND='AGGE' #NANOVG_BACKEND='BGFX' FRAME_BUFFER_FORMAT='' @@ -77,6 +77,7 @@ COMMON_CFLAGS='' if LCD == 'SDL_GPU': COMMON_CCFLAGS = COMMON_CCFLAGS + ' -DWITH_NANOVG_GPU -DWITH_VGCANVAS_LCD' elif LCD == 'SDL_FB_MONO': + NANOVG_BACKEND='AGGE' COMMON_CCFLAGS = COMMON_CCFLAGS + ' -DWITH_LCD_MONO -DWITH_NANOVG_SOFT ' else: COMMON_CCFLAGS = COMMON_CCFLAGS + ' -DWITH_BITMAP_BGRA -DWITH_NANOVG_SOFT ' diff --git a/docs/README.md b/docs/README.md index 733cd9c4b..8c240094c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -40,6 +40,7 @@ * [如何实现"back"键和"home"键](how_to_impl_back_and_home_key.md) * [如何实现自定义的软键盘](how_to_impl_custom_soft_keyboard.md) * [如何编译Windows 32位版本](how_to_build_windows_32bit_version.md) +* [如何支持单色LCD](how_to_support_mono_lcd.md) ### 3.内部原理 * [AWTK脚本绑定原理](script_binding.md) diff --git a/docs/changes.md b/docs/changes.md index 41aed78ac..f63c1afdd 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -1,101 +1,102 @@ # 最新动态 * 2019/08/15 - * 修改cairo/pixman config.h冲突的问题(感谢陈谭提供补丁) - * 由于生成单色字体需要freetype,而且freetype的效果比stb稍微好一点,所以PC版本采用freetype作为字体引擎。 + * 修改 cairo/pixman config.h 冲突的问题(感谢陈谭提供补丁) + * 由于生成单色字体需要 freetype,而且 freetype 的效果比 stb 稍微好一点,所以 PC 版本采用 freetype 作为字体引擎。 + * 增加单色 LCD 的文档。 * 2019/08/14 * 完善文档。 - * 增加宏TK\_XML\_MAX\_ATTRS用于控制XML属性的最大个数(缺省24)。 - * 通过widget factory触发EVT\_WIDGET\_CREATED事件。 - * 修改在stm32f103上的问题。 - * 完善window\_animator(感谢智明提供补丁) + * 增加宏 TK\_XML\_MAX\_ATTRS 用于控制 XML 属性的最大个数(缺省 24)。 + * 通过 widget factory 触发 EVT\_WIDGET\_CREATED 事件。 + * 修改在 stm32f103 上的问题。 + * 完善 window\_animator(感谢智明提供补丁) * 2019/08/13 * 模拟器支持单色屏。 - * 修复native window初始化顺序的BUG(感谢智明提供补丁) + * 修复 native window 初始化顺序的 BUG(感谢智明提供补丁) * 2019/08/12 - * 增加mono图片生成工具。 + * 增加 mono 图片生成工具。 * 2019/08/11 - * 增加mono字体生成工具。 + * 增加 mono 字体生成工具。 * 2019/08/10 - * edit/mledit set\_text 触发EVT\_VALUE\_CHANGED。 - * 增加lcd mono。 + * edit/mledit set\_text 触发 EVT\_VALUE\_CHANGED。 + * 增加 lcd mono。 * 2019/08/09 * 重构窗口管理器。 * 完善缺省输入法。 - * 当前窗口为keyboard时,不触发TO\_BACKGROUND/TO\_FOREGROUND。 - * 修改slider资源加载的问题(感谢朝泽提供补丁) - * 修改fill rect坐标的问题(感谢智明提供补丁) - * 修改color tile边框颜色的问题(感谢智明提供补丁) + * 当前窗口为 keyboard 时,不触发 TO\_BACKGROUND/TO\_FOREGROUND。 + * 修改 slider 资源加载的问题(感谢朝泽提供补丁) + * 修改 fill rect 坐标的问题(感谢智明提供补丁) + * 修改 color tile 边框颜色的问题(感谢智明提供补丁) * 2019/08/08 * 重构 - * 完善mutable image(感谢智明提供补丁) - * 完善expr eval,支持十六进制数。 - * mledit支持value changing事件。 - * 完善slider拖动效果。 + * 完善 mutable image(感谢智明提供补丁) + * 完善 expr eval,支持十六进制数。 + * mledit 支持 value changing 事件。 + * 完善 slider 拖动效果。 * 2019/08/07 - * 修改valgrind发现的问题。 - * 修改shortcut的BUG。 - * 完善SDL事件处理(感谢朝泽提供补丁) - * 完善pages控件(感谢朝泽提供补丁) - * 修改event文档的BUG(感谢朝泽提供补丁) + * 修改 valgrind 发现的问题。 + * 修改 shortcut 的 BUG。 + * 完善 SDL 事件处理(感谢朝泽提供补丁) + * 完善 pages 控件(感谢朝泽提供补丁) + * 修改 event 文档的 BUG(感谢朝泽提供补丁) * 2019/08/06 - * 优化nanovg GL fragment shader(draw text)。 - * 禁用点击scrollview中控件时自动滚动到可视区的功能。 - * 完善slider拖动效果。 + * 优化 nanovg GL fragment shader(draw text)。 + * 禁用点击 scrollview 中控件时自动滚动到可视区的功能。 + * 完善 slider 拖动效果。 * 2019/08/05 - * 修改uiloader/window base/style mutable/layouter等BUG(感谢尧燊提供补丁)。 + * 修改 uiloader/window base/style mutable/layouter 等 BUG(感谢尧燊提供补丁)。 * 2019/08/04-05 - * 优化nanovg GL fragment shader。 - * 完善Android移植。 - * 完善slide view控件(感谢朝泽提供补丁) + * 优化 nanovg GL fragment shader。 + * 完善 Android 移植。 + * 完善 slide view 控件(感谢朝泽提供补丁) * 2019/08/03 - * 完善Android移植。 + * 完善 Android 移植。 * 2019/07/20-8/1 - * window manager抽象成接口。 - * 引入native\_window接口。 + * window manager 抽象成接口。 + * 引入 native\_window 接口。 * 2019/08/02 - * 禁用label/button/image/hscroll\_label的缓存。 + * 禁用 label/button/image/hscroll\_label 的缓存。 * 2019/07/29 - * fix edit clone的问题。 + * fix edit clone 的问题。 * 2019/07/26 - * 完善text edit(感谢智明提供补丁) + * 完善 text edit(感谢智明提供补丁) * 2019/07/24 - * 完善preview\_ui(感谢俊杰提供补丁) + * 完善 preview\_ui(感谢俊杰提供补丁) * 2019/07/20 - * 完善list\_view\_h。 + * 完善 list\_view\_h。 * 2019/07/19 - * Slider的图标用ICON方式绘制。 - * 增加属性with\_focus\_state,如果希望控件具有焦点状态,有不希望焦点停留,可以用本属性代替focusable属性。 + * Slider 的图标用 ICON 方式绘制。 + * 增加属性 with\_focus\_state,如果希望控件具有焦点状态,有不希望焦点停留,可以用本属性代替 focusable 属性。 * 完善控件动画。 * 2019/07/18 - * gles的canvas画直线和画矩形边框的线宽问题,gles统一和agge一样为1线宽(感谢智明提供补丁)。 + * gles 的 canvas 画直线和画矩形边框的线宽问题,gles 统一和 agge 一样为 1 线宽(感谢智明提供补丁)。 * 2019/07/17 - * 完善switch控件(感谢朝泽提供补丁) + * 完善 switch 控件(感谢朝泽提供补丁) * 2019/07/15 - * 完善agge后端(感谢智明提供补丁) - * 完善cairo后端(感谢智明提供补丁) - * 完善demoui。 + * 完善 agge 后端(感谢智明提供补丁) + * 完善 cairo 后端(感谢智明提供补丁) + * 完善 demoui。 * 2019/07/12 * 改进 widget\_get\_type 通过属性获取。 diff --git a/docs/how_to_support_mono_lcd.md b/docs/how_to_support_mono_lcd.md new file mode 100644 index 000000000..f1c218599 --- /dev/null +++ b/docs/how_to_support_mono_lcd.md @@ -0,0 +1,49 @@ +# 支持单色 LCD + +## lcd_mono 实现 + +src/lcd/lcd_mono.c 提供单色 LCD 的 framebuffer(每个像素占用一个比特),实现了 LCD 的基本绘制函数,在使用时调用者需要提供 flush 函数,负责把脏矩形内的像素提交到 LCD 硬件。 + +## 模拟器 + +在 awtk_config.py 中可以打开单色 LCD 的配置。 + +``` +LCD='SDL_FB_MONO' +``` + +## 单色字体生成 + +字体生成工具 fontgen 支持生成单色字体,加上可选参数 mono 即可。 + +``` +fontgen.exe ttf_filename str_filename out_filename font_size [mono] +``` + +## 单色图片生成 + +图片生成工具 imagegen 支持生成单色图片,加上可选参数 mono 即可。 + +``` +imagegen.exe in_filename out_filename (bgra|bgr565|mono) +``` + +> 由于单色图片只有两种颜色,所以在设计图片上只能使用白色 (#ffffff) 和黑色 (#000000),否则转换出来的效果不是期望的。 + +## 主题配置 + +主题中只能使用白色 (#ffffff) 和黑色 (#000000) 两种颜色。 + +## 资源生成 + +生成资源时需要加上 mono 参数,该参数会被传递给 fontgen 和 imagegen。 + +``` +python scripts/update_res.py all mono +w_to_support_mono_lcd + +## 应用程序 + +应用程序 UI 设计请考虑单色 LCD 的特殊性。 + +> demoui 没有考虑单色 LCD,在单色 LCD 上运行效果不佳。 diff --git a/src/lcd/lcd_mono.c b/src/lcd/lcd_mono.c index abea4b45a..5cac69f83 100644 --- a/src/lcd/lcd_mono.c +++ b/src/lcd/lcd_mono.c @@ -156,7 +156,7 @@ static ret_t lcd_mono_destroy(lcd_t* lcd) { } lcd_t* lcd_mono_create(wh_t w, wh_t h, lcd_flush_t flush, lcd_destroy_t on_destroy, - void* on_destroy_ctx) { + void* ctx) { lcd_mono_t* mono = TKMEM_ZALLOC(lcd_mono_t); system_info_t* info = system_info(); lcd_t* lcd = (lcd_t*)mono; @@ -168,7 +168,7 @@ lcd_t* lcd_mono_create(wh_t w, wh_t h, lcd_flush_t flush, lcd_destroy_t on_destr lcd->type = LCD_MONO; mono->data = bitmap_mono_create_data(w, h); mono->on_destroy = on_destroy; - mono->on_destroy_ctx = on_destroy_ctx; + mono->ctx = ctx; ENSURE(mono->data != NULL); diff --git a/src/lcd/lcd_mono.h b/src/lcd/lcd_mono.h index 2695f9e72..11fe4ed47 100644 --- a/src/lcd/lcd_mono.h +++ b/src/lcd/lcd_mono.h @@ -49,11 +49,11 @@ typedef struct _lcd_mono_t { uint8_t* data; /** - * @property {void*} on_destroy_ctx + * @property {void*} ctx * @annotation ["private"] - * on_destroy回调函数的上下文信息。 + * flush/on_destroy回调函数的上下文信息。 */ - void* on_destroy_ctx; + void* ctx; /** * @property {lcd_destroy_t} on_destroy @@ -72,12 +72,12 @@ typedef struct _lcd_mono_t { * @param {wh_t} h 高度。 * @param {lcd_flush_t} flush 用于刷新数据到硬件的回调函数。 * @param {lcd_destroy_t} on_destroy 销毁lcd时的回调函数。 - * @param {void*} on_destroy_ctx 销毁lcd时的回调函数的上下文。 + * @param {void*} ctx flush/on_destroy回调函数的上下文。 * * @return {lcd_t*} lcd对象。 */ lcd_t* lcd_mono_create(wh_t w, wh_t h, lcd_flush_t flush, lcd_destroy_t on_destroy, - void* on_destroy_ctx); + void* ctx); END_C_DECLS diff --git a/src/lcd/lcd_sdl2_mono.c b/src/lcd/lcd_sdl2_mono.c index 7b2b12934..c98622e5a 100644 --- a/src/lcd/lcd_sdl2_mono.c +++ b/src/lcd/lcd_sdl2_mono.c @@ -23,13 +23,13 @@ #include "lcd/lcd_mono.h" #include "lcd/lcd_sdl2_mono.h" -typedef struct _special_info_t { +typedef struct _mono_info_t { SDL_Renderer* render; SDL_Texture* texture; -} special_info_t; +} mono_info_t; -static special_info_t* special_info_create(SDL_Renderer* render) { - special_info_t* info = TKMEM_ZALLOC(special_info_t); +static mono_info_t* mono_info_create(SDL_Renderer* render) { + mono_info_t* info = TKMEM_ZALLOC(mono_info_t); return_value_if_fail(info != NULL, NULL); info->render = render; @@ -37,7 +37,7 @@ static special_info_t* special_info_create(SDL_Renderer* render) { return info; } -static ret_t special_info_create_texture(special_info_t* info, wh_t w, wh_t h) { +static ret_t mono_info_create_texture(mono_info_t* info, wh_t w, wh_t h) { int flags = SDL_TEXTUREACCESS_STREAMING; /*SDL ABGR is rgba from low address to high address*/ @@ -47,7 +47,7 @@ static ret_t special_info_create_texture(special_info_t* info, wh_t w, wh_t h) { return info->texture != NULL ? RET_OK : RET_FAIL; } -static ret_t special_info_destroy(special_info_t* info) { +static ret_t mono_info_destroy(mono_info_t* info) { return_value_if_fail(info != NULL, RET_BAD_PARAMS); SDL_DestroyTexture(info->texture); @@ -64,8 +64,7 @@ static ret_t lcd_sdl2_mono_flush(lcd_t* lcd) { lcd_mono_t* mono = (lcd_mono_t*)(lcd); rect_t* dr = &(lcd->dirty_rect); rect_t* fps_r = &(lcd->fps_rect); - lcd_mono_t* special = (lcd_mono_t*)lcd; - special_info_t* info = (special_info_t*)(special->ctx); + mono_info_t* info = (mono_info_t*)(mono->ctx); memset(&src, 0x00, sizeof(src)); memset(&dst, 0x00, sizeof(dst)); @@ -110,10 +109,10 @@ static ret_t lcd_sdl2_mono_flush(lcd_t* lcd) { } static ret_t lcd_sdl2_mono_destroy(lcd_t* lcd) { - lcd_mono_t* special = (lcd_mono_t*)lcd; + lcd_mono_t* mono = (lcd_mono_t*)lcd; - special_info_destroy((special_info_t*)(special->ctx)); - special->ctx = NULL; + mono_info_destroy((mono_info_t*)(mono->ctx)); + mono->ctx = NULL; return RET_OK; } @@ -121,14 +120,14 @@ static ret_t lcd_sdl2_mono_destroy(lcd_t* lcd) { lcd_t* lcd_sdl2_mono_init(SDL_Renderer* render) { int w = 0; int h = 0; - special_info_t* info = NULL; + mono_info_t* info = NULL; return_value_if_fail(render != NULL, NULL); SDL_GetRendererOutputSize(render, &w, &h); - info = special_info_create(render); + info = mono_info_create(render); return_value_if_fail(info != NULL, NULL); - ENSURE(special_info_create_texture(info, w, h) == RET_OK); + ENSURE(mono_info_create_texture(info, w, h) == RET_OK); return lcd_mono_create(w, h, lcd_sdl2_mono_flush, lcd_sdl2_mono_destroy, info); }