improve lcd mono

This commit is contained in:
lixianjing 2019-08-15 09:06:35 +08:00
parent ca0520c76d
commit b70bba6fbd
7 changed files with 119 additions and 68 deletions

View File

@ -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 '

View File

@ -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)

View File

@ -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 通过属性获取。

View File

@ -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 上运行效果不佳。

View File

@ -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);

View File

@ -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

View File

@ -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);
}