mirror of
https://gitee.com/zlgopen/awtk.git
synced 2024-12-01 19:49:11 +08:00
rename to awtk
This commit is contained in:
parent
a11386cd1c
commit
084c127b04
58
README.md
58
README.md
@ -1,10 +1,27 @@
|
||||
# LFTK = Light Funny Toolkit
|
||||
# AWTK = Toolkit AnyWhere
|
||||
|
||||
[FTK](https://github.com/xianjimli/ftk)是一个嵌入式GUI库,而[LFTK](https://github.com/xianjimli/lftk)是吸取了[FTK](https://github.com/xianjimli/ftk)和[CanTK](https://github.com/drawapp8/cantk)的精华,针对低端嵌入式设备,重新开发的嵌入式GUI库。其主要特色有:
|
||||
[AWTK](https://github.com/xianjimli/awtk)是吸取了[FTK](https://github.com/xianjimli/ftk)和[CanTK](https://github.com/drawapp8/cantk)的精华,重新开发的通用GUI,计划分以下几个阶段实施:
|
||||
|
||||
* 第一阶段专注于嵌入式系统,到达并超越TouchGfx/Embedded Wizard的功能。计划在2018/9前完成。
|
||||
* 第二阶段用AWTK本身开发界面编辑器(或组态软件IDE),从而验证AWTK支持PC软件开发的能力。计划在2018年底完成。
|
||||
* 第三阶段支持Mobile应用程序开发,这一步比较容易,因为在第一阶段就是要把手机上的现代GUI推广到传统嵌入式系统中去。计划在2019/3完成。
|
||||
* 第四阶段支持2D游戏开发,把以前开发游戏引擎的经验融合到AWTK中,方便开发交互式的多媒体应用。计划在2019/6完成。
|
||||
|
||||
最终目标:
|
||||
|
||||
* 支持开发嵌入式软件。
|
||||
* 支持开发Linux应用程序。
|
||||
* 支持开发MacOS应用程序。
|
||||
* 支持开发Windows应用程序。
|
||||
* 支持开发Android应用程序。
|
||||
* 支持开发iOS应用程序。
|
||||
* 支持开发2D游戏。
|
||||
|
||||
[FTK](https://github.com/xianjimli/ftk)是一个嵌入式GUI库,而[AWTK](https://github.com/xianjimli/awtk)是吸取了[FTK](https://github.com/xianjimli/ftk)和[CanTK](https://github.com/drawapp8/cantk)的精华,针对低端嵌入式设备,重新开发的嵌入式GUI库。其主要特色有:
|
||||
|
||||
1. 小巧。在精简配置下,不依赖第三方软件包,仅需要8K RAM+32K FLASH即可开发一些简单的图形应用程序。
|
||||
|
||||
2. 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率。
|
||||
2. 高效。采用脏矩形裁剪算法,每次只绘制和更新变化的部分,极大提高运行效率和能源利用率
|
||||
|
||||
3. 稳定。通过良好的架构设计和编程风格、单元测试、动态(valgrind)检查和Code Review保证其运行的稳定性。
|
||||
|
||||
@ -20,7 +37,7 @@
|
||||
|
||||
9. 支持裸系统,无需OS和文件系统。字体、图片、主题和界面描述数据都编译到代码中,以常量数据的形式存放,运行时无需加载到内存。
|
||||
|
||||
10. 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC系统上运行。
|
||||
10. 可移植。支持移植到各种RTOS和嵌入式Linux系统,并通过SDL在各种流行的PC/手机系统上运行。
|
||||
|
||||
11. 脚本化。从API注释中提取API的描述信息,通过这些信息可以自动生成各种脚本的绑定代码。
|
||||
|
||||
@ -73,26 +90,29 @@ bin\demo1
|
||||
|
||||
## 各个平台的移植
|
||||
|
||||
[stm32f103ze](https://github.com/xianjimli/lftk-stm32f103ze-raw.git)
|
||||
[stm32f103ze](https://github.com/xianjimli/awtk-stm32f103ze-raw.git)
|
||||
|
||||
## 文档
|
||||
|
||||
* [LFTK脚本绑定的实现原理 - lua绑定](docs/binding_lua.md)
|
||||
* [LFTK控件的布局参数介绍](docs/layout.md)
|
||||
* [LFTK界面描述文件介绍](docs/ui_desc.md)
|
||||
* [LFTK移植到STM32裸系统](docs/porting_to_stm32.md)
|
||||
* [LFTK中的图片显示方式](docs/image_draw_type.md)
|
||||
* [LFTK中的矢量图绘图函数](docs/vgcanvas.md)
|
||||
* [LFTK中的事件处理函数](docs/event_listener.md)
|
||||
* [LFTK中的主题](docs/theme.md)
|
||||
* [LFTK中的资源管理器](docs/resource_manager.md)
|
||||
* [LFTK中的窗口动画](docs/window_animator.md)
|
||||
* [AWTK脚本绑定的实现原理 - lua绑定](docs/binding_lua.md)
|
||||
* [AWTK控件的布局参数介绍](docs/layout.md)
|
||||
* [AWTK界面描述文件介绍](docs/ui_desc.md)
|
||||
* [AWTK移植到STM32裸系统](docs/porting_to_stm32.md)
|
||||
* [AWTK中的图片显示方式](docs/image_draw_type.md)
|
||||
* [AWTK中的矢量图绘图函数](docs/vgcanvas.md)
|
||||
* [AWTK中的事件处理函数](docs/event_listener.md)
|
||||
* [AWTK中的主题](docs/theme.md)
|
||||
* [AWTK中的资源管理器](docs/resource_manager.md)
|
||||
* [AWTK中的窗口动画](docs/window_animator.md)
|
||||
|
||||
## 任务完成情况
|
||||
[TODO.md](TODO.md)
|
||||
|
||||
## 最新动态
|
||||
|
||||
* 2018/05/05
|
||||
* lftk改名为awtk。
|
||||
|
||||
* 2018/05/03
|
||||
* 增加locale,支持多国语言字符串翻译。
|
||||
|
||||
@ -156,7 +176,7 @@ bin\demo1
|
||||
* 重构window/button/label/check\_buton,使用同一个绘制函数。
|
||||
|
||||
* 2018/03/27
|
||||
* [Luncher](https://github.com/Luncher) 加入LFTK核心团队。
|
||||
* [Luncher](https://github.com/Luncher) 加入AWTK核心团队。
|
||||
* 完善文档。
|
||||
|
||||
* 2018/03/26
|
||||
@ -173,9 +193,9 @@ bin\demo1
|
||||
* 重新设计资源管理器。
|
||||
|
||||
* 2018/03/17
|
||||
* 支持将Qt的UI文件转成LFTK的UI文件。
|
||||
* 支持将VC的RC文件转成LFTK的UI文件。
|
||||
* 编写LFTK UI界面描述的文档。
|
||||
* 支持将Qt的UI文件转成AWTK的UI文件。
|
||||
* 支持将VC的RC文件转成AWTK的UI文件。
|
||||
* 编写AWTK UI界面描述的文档。
|
||||
* 增加事件队列,解决在触屏中断中分发事件的问题。
|
||||
* 编写STM32移植文档。
|
||||
|
||||
|
@ -69,7 +69,7 @@ elif OS_NAME == 'Windows':
|
||||
OS_SUBSYSTEM_CONSOLE='/SUBSYSTEM:CONSOLE '
|
||||
OS_SUBSYSTEM_WINDOWS='/SUBSYSTEM:WINDOWS '
|
||||
|
||||
LIBS=['lftk', 'picasso', 'agg', 'nanovg'] + OS_LIBS
|
||||
LIBS=['awtk', 'picasso', 'agg', 'nanovg'] + OS_LIBS
|
||||
|
||||
CCFLAGS=OS_FLAGS + COMMON_CCFLAGS
|
||||
CPPPATH=[TK_ROOT,
|
||||
|
2
TODO.md
2
TODO.md
@ -68,7 +68,7 @@
|
||||
* 支持tween动画
|
||||
|
||||
## 长期计划
|
||||
* 用LFTK实现界面编辑器
|
||||
* 用AWTK实现界面编辑器
|
||||
* 支持粒子产生器
|
||||
* 支持骨骼动画
|
||||
* flash播放器支持
|
||||
|
@ -1,5 +1,5 @@
|
||||
<dialog name="" anim_hint="bottom_to_top" icon="info" x="0" y="bottom" w="100%" h="160" text="Dialog">
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="LFTK is cool!"/>
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="AWTK is cool!"/>
|
||||
<button name="ok" x="10" y="bottom:10" w="40%" h="30" text="确定"/>
|
||||
<button name="cancel" x="right:10" y="bottom:10" w="40%" h="30" text="取消"/>
|
||||
</dialog>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<dialog name="" icon="info" x="10" y="120" w="300" h="160" text="Dialog">
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="LFTK is cool!"/>
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="AWTK is cool!"/>
|
||||
<button name="ok" x="10" y="bottom:10" w="40%" h="30" text="确定"/>
|
||||
<button name="cancel" x="right:10" y="bottom:10" w="40%" h="30" text="取消"/>
|
||||
</dialog>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<dialog name="" anim_hint="top_to_bottom" icon="info" x="0" y="0" w="100%" h="160" text="Dialog">
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="LFTK is cool!"/>
|
||||
<label name="" x="center" y="middle:-20" w="200" h="30" text="AWTK is cool!"/>
|
||||
<button name="ok" x="10" y="bottom:10" w="40%" h="30" text="确定"/>
|
||||
<button name="cancel" x="right:10" y="bottom:10" w="40%" h="30" text="取消"/>
|
||||
</dialog>
|
||||
|
@ -1,6 +1,6 @@
|
||||
# LFTK脚本绑定的实现原理 - lua绑定
|
||||
# AWTK脚本绑定的实现原理 - lua绑定
|
||||
|
||||
脚本化是[LFTK](https://github.com/xianjimli/lftk)的一个基本功能。[LFTK](https://github.com/xianjimli/lftk)计划支持嵌入式系统中常用的脚本,如lua、python和jerryscript。脚本绑定说简单也简单,说复杂也复杂,采用FFI(calling external C functions)和SWIG绑定一些简单的函数是很方便的,但绑定一个复杂的GUI系统还是很有挑战的。之所以不采用通用的工具,而是实现自己的代码产生器,主要有以下考虑:
|
||||
脚本化是[AWTK](https://github.com/xianjimli/awtk)的一个基本功能。[AWTK](https://github.com/xianjimli/awtk)计划支持嵌入式系统中常用的脚本,如lua、python和jerryscript。脚本绑定说简单也简单,说复杂也复杂,采用FFI(calling external C functions)和SWIG绑定一些简单的函数是很方便的,但绑定一个复杂的GUI系统还是很有挑战的。之所以不采用通用的工具,而是实现自己的代码产生器,主要有以下考虑:
|
||||
|
||||
* 我使用FFI和SWIG的经验很有限,觉得有些功能不太好实现,至少目前我还不知道实现这些功能的方法和思路。
|
||||
|
||||
@ -10,11 +10,11 @@
|
||||
|
||||
* 代码风格。不同语言有不同的代码风格,特别是命名风格,直接把C言语的风格映射过去,对于开发者不太友好。FFI和SWIG都需要做额外的工作才能实现这个功能。
|
||||
|
||||
* LFTK采用面向对象设计,并用C实现面向对象编程的。而通用的绑定机制对此并不友好,实现起来非常困难。
|
||||
* AWTK采用面向对象设计,并用C实现面向对象编程的。而通用的绑定机制对此并不友好,实现起来非常困难。
|
||||
|
||||
* 自定义的代码产生器并不复杂,而且具有更大的灵活性。
|
||||
|
||||
基于以上这些原因,我决定自己实现[LFTK](https://github.com/xianjimli/lftk)的脚本绑定机制。它的实现原理如下:用特定格式的API注释来描述要脚本化的API,用一个名为gen_idl的工具把注释提取出来生成JSON的接口描述文件,然后用不同的代码产生器生成对应语言的绑定:
|
||||
基于以上这些原因,我决定自己实现[AWTK](https://github.com/xianjimli/awtk)的脚本绑定机制。它的实现原理如下:用特定格式的API注释来描述要脚本化的API,用一个名为gen_idl的工具把注释提取出来生成JSON的接口描述文件,然后用不同的代码产生器生成对应语言的绑定:
|
||||
|
||||
![1](images/script_binding.png)
|
||||
|
||||
@ -145,7 +145,7 @@ static int wrap_tk_quit(lua_State* L) {
|
||||
|
||||
### 二、构造函数的绑定
|
||||
|
||||
* 1.实现wrap函数。构造函数的wrap函数和普通函数的wrap差不多,只是最后要调用lftk\_newuserdata创建一个userdata对象,并关联metatable。我开始用的lua\_pushlightuserdata函数,后来发现lua里全部的ligthuserdata用的是一个metatable,修改一个对象的metatable,其它类型的对象的metatable也被修改了(我感觉这种做法并不合理)。
|
||||
* 1.实现wrap函数。构造函数的wrap函数和普通函数的wrap差不多,只是最后要调用awtk\_newuserdata创建一个userdata对象,并关联metatable。我开始用的lua\_pushlightuserdata函数,后来发现lua里全部的ligthuserdata用的是一个metatable,修改一个对象的metatable,其它类型的对象的metatable也被修改了(我感觉这种做法并不合理)。
|
||||
|
||||
```
|
||||
static int wrap_button_create(lua_State* L) {
|
||||
@ -157,7 +157,7 @@ static int wrap_button_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)button_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/button_t/widget_t", "lftk.button_t");
|
||||
return tk_newuserdata(L, ret, "/button_t/widget_t", "awtk.button_t");
|
||||
}
|
||||
```
|
||||
|
||||
@ -238,7 +238,7 @@ static int wrap_check_button_t_get_prop(lua_State* L) {
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
luaL_newmetatable(L, "lftk.check_button_t");
|
||||
luaL_newmetatable(L, "awtk.check_button_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
|
@ -1,4 +1,4 @@
|
||||
# LFTK中的事件处理函数
|
||||
# AWTK中的事件处理函数
|
||||
|
||||
emitter实现了通用的事件注册、注销和分发功能,widget对此做了进一步包装,使用起来非常方便。
|
||||
|
||||
|
@ -1,8 +1,8 @@
|
||||
# LFTK中的图片显示方式
|
||||
# AWTK中的图片显示方式
|
||||
|
||||
## 一、显示方式
|
||||
|
||||
LFTK提供了多种图片显示方式:
|
||||
AWTK提供了多种图片显示方式:
|
||||
|
||||
* 居中显示。将图片按原大小显示在目标矩形的中央。
|
||||
* 缩放显示。将图片缩放至目标矩形的大小(不保证宽高成比例)。
|
||||
|
@ -1,4 +1,4 @@
|
||||
# LFTK控件的布局参数
|
||||
# AWTK控件的布局参数
|
||||
|
||||
## 一、为什么需要布局参数
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
* 需要适应不同大小的屏幕。
|
||||
* 界面上的元素是动态的,需要用程序创建界面。
|
||||
|
||||
[LFTK](https://github.com/xianjimli/lftk)提供了简单而又强大的布局参数。
|
||||
[AWTK](https://github.com/xianjimli/awtk)提供了简单而又强大的布局参数。
|
||||
|
||||
## 二、控件自身的布局参数
|
||||
|
||||
@ -108,7 +108,7 @@ widget_layout(btn);
|
||||
|
||||
## 三、子控件的布局参数
|
||||
|
||||
为了方便父控件布局子控件,LFTK提供了下面4个参数:
|
||||
为了方便父控件布局子控件,AWTK提供了下面4个参数:
|
||||
|
||||
* rows 行数
|
||||
* cols 列数
|
||||
@ -173,4 +173,4 @@ ret_t widget_set_children_layout_params(widget_t* widget, uint8_t rows, uint8_t
|
||||
|
||||
```
|
||||
./demos/prefix_xml_ui demos/layouts/demo2.xml
|
||||
```
|
||||
```
|
||||
|
@ -1,7 +1,7 @@
|
||||
## LFTK中显示优化技术
|
||||
## AWTK中显示优化技术
|
||||
|
||||
### 一、裁剪
|
||||
|
||||
### 二、脏矩形
|
||||
|
||||
### 三、极速模式
|
||||
### 三、极速模式
|
||||
|
@ -1,10 +1,10 @@
|
||||
## 将LFTK移植到STM32裸系统
|
||||
## 将AWTK移植到STM32裸系统
|
||||
|
||||
LFTK的可移植性很高,在移植时需要实现平台初始化、lcd和mainloop三个方面的东西。本文以STM32为例介绍移植LFTK到新平台的过程。
|
||||
AWTK的可移植性很高,在移植时需要实现平台初始化、lcd和mainloop三个方面的东西。本文以STM32为例介绍移植AWTK到新平台的过程。
|
||||
|
||||
### 一、平台初始化
|
||||
|
||||
除了基本的libc函数外,LFTK对平台没有特别要求,在stm32上需要实现一个获取当前时间的函数get\_time\_ms。
|
||||
除了基本的libc函数外,AWTK对平台没有特别要求,在stm32上需要实现一个获取当前时间的函数get\_time\_ms。
|
||||
|
||||
```
|
||||
31 #include "stdlib.h"
|
||||
@ -40,7 +40,7 @@ LFTK的可移植性很高,在移植时需要实现平台初始化、lcd和main
|
||||
|
||||
### 二、实现lcd
|
||||
|
||||
lcd\_t接口提供基本的显示功能,实现lcd_t接口是很容易的。LFTK提供基于寄存器和基于framebuffer两种缺省实现,在此基础上实现自己的lcd\_t接口就更方便了。stm32使用基于寄存器的lcd的缺省实现,只需要提供set\_window\_func和write\_data\_func两个函数/宏即可。这里直接使用TFT\_SetWindow和TFT\_WriteData两个函数。
|
||||
lcd\_t接口提供基本的显示功能,实现lcd_t接口是很容易的。AWTK提供基于寄存器和基于framebuffer两种缺省实现,在此基础上实现自己的lcd\_t接口就更方便了。stm32使用基于寄存器的lcd的缺省实现,只需要提供set\_window\_func和write\_data\_func两个函数/宏即可。这里直接使用TFT\_SetWindow和TFT\_WriteData两个函数。
|
||||
|
||||
```
|
||||
#include "gui.h"
|
||||
|
@ -1,4 +1,4 @@
|
||||
#LFTK中的资源管理
|
||||
#AWTK中的资源管理
|
||||
|
||||
## 基本架构
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
|
||||
* 让上层不需要了解资源的具体格式。比如一个名为earth的图片,没有文件系统或内存紧缺,图片直接用位图数据格式存在ROM中,而有文件系统时,则用PNG格式存放在文件系统中。资源管理器让上层不需要关心图片的格式,访问时指定图片的名称即可(不用指定扩展名)。
|
||||
|
||||
* 让上层不需要了解屏幕的密度。不同的屏幕密度下需要加载不同的图片,比如MacPro的Retina屏就需要用双倍解析度的图片,否则就出现界面模糊。LFTK以后会支持PC软件和手机软件的开发,所以资源管理器需要为此提供支持,让上层不需关心屏幕的密度。
|
||||
* 让上层不需要了解屏幕的密度。不同的屏幕密度下需要加载不同的图片,比如MacPro的Retina屏就需要用双倍解析度的图片,否则就出现界面模糊。AWTK以后会支持PC软件和手机软件的开发,所以资源管理器需要为此提供支持,让上层不需关心屏幕的密度。
|
||||
|
||||
* 对资源进行内存缓存。不同类型的资源使用方式是不一样的,比如字体和主题加载之后会一直使用,UI文件在生成界面之后就暂时不需要了,PNG文件解码之后就只需要保留解码的位图数据即可。资源管理器配合图片管理器等其它组件实现资源的自动缓存。
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
## 资源的生成
|
||||
|
||||
LFTK中的资源需要进行格式转换才能使用:
|
||||
AWTK中的资源需要进行格式转换才能使用:
|
||||
|
||||
* 在没有文件系统时或者内存紧缺时,需要把资源转成常量数组直接编译到代码中。
|
||||
* XML格式的UI文件需要转换成二进制的格式。
|
||||
|
@ -1,6 +1,6 @@
|
||||
#SDL + OpenGL使用笔记
|
||||
|
||||
[LFTK](https://github.com/xianjimli/lftk) 是一个嵌入式GUI,为了开发方便,需要提供PC运行环境。我选择了[SDL2](https://www.libsdl.org)+OpenGL+[nanovg](https://github.com/memononen/nanovg)来实现底层的渲染,让[LFTK](https://github.com/xianjimli/lftk)可以运行在各个平台上。[GLFW](http://www.glfw.org/)+OpenGL也是一个不错的选择,但是GLFW没有Android和iOS的移植,而且没有提供原生输入法的支持。[LFTK](https://github.com/xianjimli/lftk)虽然最初是为嵌入式系统而生,但也有一个小目标:可以用于开发嵌入式系统,也可以开发PC软件和移动APP,所以最后选择了SDL2+OpenGL+nanovg。在使用SDL2+OpenGL+nanovg的过程中,踩了一些坑,这里做个笔记,给需要的朋友参考:
|
||||
[AWTK](https://github.com/xianjimli/awtk) 是一个嵌入式GUI,为了开发方便,需要提供PC运行环境。我选择了[SDL2](https://www.libsdl.org)+OpenGL+[nanovg](https://github.com/memononen/nanovg)来实现底层的渲染,让[AWTK](https://github.com/xianjimli/awtk)可以运行在各个平台上。[GLFW](http://www.glfw.org/)+OpenGL也是一个不错的选择,但是GLFW没有Android和iOS的移植,而且没有提供原生输入法的支持。[AWTK](https://github.com/xianjimli/awtk)虽然最初是为嵌入式系统而生,但也有一个小目标:可以用于开发嵌入式系统,也可以开发PC软件和移动APP,所以最后选择了SDL2+OpenGL+nanovg。在使用SDL2+OpenGL+nanovg的过程中,踩了一些坑,这里做个笔记,给需要的朋友参考:
|
||||
|
||||
## 一、在MacPro上显示模糊的问题。
|
||||
|
||||
@ -13,7 +13,7 @@ SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "nearest");
|
||||
花了一些时间去看SDL的源码后,发现其实SDL在创建窗口时提供了SDL\_WINDOW\_ALLOW\_HIGHDPI标志,可以用来解决模糊的问题:
|
||||
|
||||
```
|
||||
SDL_CreateWindow("LFTK Simulator", x, y, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||
SDL_CreateWindow("AWTK Simulator", x, y, w, h, SDL_WINDOW_OPENGL | SDL_WINDOW_ALLOW_HIGHDPI);
|
||||
```
|
||||
|
||||
如果设置了SDL\_WINDOW\_ALLOW\_HIGHDPI标志,窗口大小和Drawable的大小可能不一致,在绘图时需要做相应缩放:
|
||||
@ -26,7 +26,7 @@ ratio = (float)fw / (float)ww;
|
||||
|
||||
## 二、nanovg裁剪算法无效。
|
||||
|
||||
使用低级的OpenGL去绘图是一个比较麻烦的事情。在[LFTK](https://github.com/xianjimli/lftk)中,采用了[nanovg](https://github.com/memononen/nanovg)矢量图绘图函数库,nanovg缺省使用的[GLFW](http://www.glfw.org/),要移植到[SDL2](https://www.libsdl.org)上也不难。但是我发现nanovg的示例在SDL上和在GLFW上的效果有些差异,仔细观察后,初步判断与用stencil进行裁剪有关,以为是没有启用stencil测试引起的,于是加了下面的代码:
|
||||
使用低级的OpenGL去绘图是一个比较麻烦的事情。在[AWTK](https://github.com/xianjimli/awtk)中,采用了[nanovg](https://github.com/memononen/nanovg)矢量图绘图函数库,nanovg缺省使用的[GLFW](http://www.glfw.org/),要移植到[SDL2](https://www.libsdl.org)上也不难。但是我发现nanovg的示例在SDL上和在GLFW上的效果有些差异,仔细观察后,初步判断与用stencil进行裁剪有关,以为是没有启用stencil测试引起的,于是加了下面的代码:
|
||||
|
||||
```
|
||||
glEnable(GL_STENCIL_TEST);
|
||||
|
@ -1,9 +1,9 @@
|
||||
## LFTK中的主题
|
||||
## AWTK中的主题
|
||||
|
||||
设计漂亮的界面并非程序员的强项,LFTK通过主题提供这样一种机制,让设计漂亮的界面变得非常容易。通过主题,可以改变控件的背景颜色、边框颜色、字体颜色、字体、字体大小、背景图片、背景图片的显示方式和图标等属性。同时LFTK也提供了一些主题重用的机制,让主题文件的开发和维护变得容易。
|
||||
设计漂亮的界面并非程序员的强项,AWTK通过主题提供这样一种机制,让设计漂亮的界面变得非常容易。通过主题,可以改变控件的背景颜色、边框颜色、字体颜色、字体、字体大小、背景图片、背景图片的显示方式和图标等属性。同时AWTK也提供了一些主题重用的机制,让主题文件的开发和维护变得容易。
|
||||
|
||||
### 一、主题的结构
|
||||
LFTK的主题按控件进行分类,每种控件可以有多种不同的风格,每种风格下又有不同状态下的配置。比如:
|
||||
AWTK的主题按控件进行分类,每种控件可以有多种不同的风格,每种风格下又有不同状态下的配置。比如:
|
||||
|
||||
```
|
||||
<button>
|
||||
@ -64,7 +64,7 @@ LFTK的主题按控件进行分类,每种控件可以有多种不同的风格
|
||||
|
||||
> 颜色可使用标准名称,#开头的16进制值和rgba合成的值。
|
||||
|
||||
参考: [LFTK中图片的绘制方式](docs/image_draw_type.md)
|
||||
参考: [AWTK中图片的绘制方式](docs/image_draw_type.md)
|
||||
|
||||
### 三、编译主题
|
||||
|
||||
|
@ -1,16 +1,16 @@
|
||||
# LFTK中的界面描述数据
|
||||
# AWTK中的界面描述数据
|
||||
|
||||
LFTK可以直接加载XML格式的和二进制格式的界面描述数据,从性能和资源开销的角度考虑,二进制格式是更好的选择,LFTK提供了工具将XML格式转换成二进制格式的界面描述数据,也提供了将QT的UI文件和微软的RC文件转换成LFTK XML格式的界面描述文件的工具,其工作流程如下:
|
||||
AWTK可以直接加载XML格式的和二进制格式的界面描述数据,从性能和资源开销的角度考虑,二进制格式是更好的选择,AWTK提供了工具将XML格式转换成二进制格式的界面描述数据,也提供了将QT的UI文件和微软的RC文件转换成AWTK XML格式的界面描述文件的工具,其工作流程如下:
|
||||
|
||||
![](images/ui_desc.png)
|
||||
|
||||
> LFTK的UI Builder还在意淫之中,打算用LFTK本身来开发,可能需要等到2018年底了,目前可以使用Qt Designer或微软的VC来做界面(主要生成各个控件的坐标),再转换成LFTK XML UI文件,适当的编辑之后,转换成LFTK二进制的UI数据。
|
||||
> AWTK的UI Builder还在意淫之中,打算用AWTK本身来开发,可能需要等到2018年底了,目前可以使用Qt Designer或微软的VC来做界面(主要生成各个控件的坐标),再转换成AWTK XML UI文件,适当的编辑之后,转换成AWTK二进制的UI数据。
|
||||
|
||||
## 一、界面描述数据的使用方法
|
||||
|
||||
### 1.创建XML格式的界面描述文件
|
||||
|
||||
LFTK XML界面描述数据非常紧凑和直观:
|
||||
AWTK XML界面描述数据非常紧凑和直观:
|
||||
|
||||
* name 是控件的名称,创建完成之后可以用widget\_look\_up函数找到指定名称的控件。
|
||||
* x x坐标
|
||||
@ -20,7 +20,7 @@ LFTK XML界面描述数据非常紧凑和直观:
|
||||
* text 文本
|
||||
* value 值
|
||||
|
||||
x/y/w/h 可以使用[LFTK的layout参数](layout.md)。
|
||||
x/y/w/h 可以使用[AWTK的layout参数](layout.md)。
|
||||
|
||||
```
|
||||
<window name="main" x="0" y="0" w="320" h="480">
|
||||
|
@ -1,4 +1,4 @@
|
||||
# LFTK中的矢量图绘图函数
|
||||
# AWTK中的矢量图绘图函数
|
||||
|
||||
### 一、工作模式
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
* [nanovg](https://github.com/memononen/nanovg)
|
||||
* [agg](http://www.antigrain.com/)
|
||||
|
||||
其中最后4个是开源的,skia和cairo很强但也很大,不太适合嵌入式环境。nanovg是最简洁最优雅的,可惜它只支持OpenGL。agg是用纯软件实现的,速度相对来说也很快,虽然使用起来有点复杂,但也不失为一个好的选择。经过一番考虑之后,LFTK的canvas根据硬件环境分为三个层次:
|
||||
其中最后4个是开源的,skia和cairo很强但也很大,不太适合嵌入式环境。nanovg是最简洁最优雅的,可惜它只支持OpenGL。agg是用纯软件实现的,速度相对来说也很快,虽然使用起来有点复杂,但也不失为一个好的选择。经过一番考虑之后,AWTK的canvas根据硬件环境分为三个层次:
|
||||
|
||||
* 简约模式。支持基本的绘图函数,但不支持Vector graphics绘图函数,能实现GUI常见功能。适用于低端的硬件环境,如CPU主频小余100M,RAM小余1M的情况。
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
### 二、接口函数
|
||||
|
||||
vgcanvas的接口如何定义呢,nanovg和agg的接口差异极大,必须为LFTK上层提供统一的接口。LFTK采用了[HTML5 canvas](http://www.w3school.com.cn/tags/html_ref_canvas.asp)类似的接口,这套接口非常好用,但由于底层的agg和nanovg的限制,在有GPU和无GPU时,效果可能不太一样,甚至不兼容,所以在使用时尽量保守一点:)
|
||||
vgcanvas的接口如何定义呢,nanovg和agg的接口差异极大,必须为AWTK上层提供统一的接口。AWTK采用了[HTML5 canvas](http://www.w3school.com.cn/tags/html_ref_canvas.asp)类似的接口,这套接口非常好用,但由于底层的agg和nanovg的限制,在有GPU和无GPU时,效果可能不太一样,甚至不兼容,所以在使用时尽量保守一点:)
|
||||
|
||||
```
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
# LFTK中的窗口动画
|
||||
# AWTK中的窗口动画
|
||||
|
||||
窗口动画是现代GUI最基本的功能之一,在窗口打开或关闭时,引入一个过渡动画,让用户感觉这个过程是流畅的。窗口动画的基本原理很简单:在打开或关闭窗口时,把前后两个窗口预先绘制到两张内存图片上,按照指定规则显示两张图片,形成动画效果。
|
||||
|
||||
|
@ -20,11 +20,11 @@ static int tk_newuserdata(lua_State* L, void* data, const char* info, const char
|
||||
udata->data = data;
|
||||
udata->info = info;
|
||||
|
||||
if (strstr(info, "/widget_t") != NULL && strcmp(metatable, "lftk.widget_t") == 0) {
|
||||
if (strstr(info, "/widget_t") != NULL && strcmp(metatable, "awtk.widget_t") == 0) {
|
||||
widget_t* widget = (widget_t*)data;
|
||||
const key_type_value_t* kv = widget_type_find_by_value(widget->type);
|
||||
if (kv != NULL) {
|
||||
snprintf(str, sizeof(str), "lftk.%s_t", kv->name);
|
||||
snprintf(str, sizeof(str), "awtk.%s_t", kv->name);
|
||||
metatable = str;
|
||||
}
|
||||
}
|
||||
@ -33,7 +33,7 @@ static int tk_newuserdata(lua_State* L, void* data, const char* info, const char
|
||||
int ret = luaL_getmetatable(L, metatable);
|
||||
if (ret == 0 && strstr(info, "/widget_t") != NULL) {
|
||||
lua_pop(L, 1);
|
||||
ret = luaL_getmetatable(L, "lftk.widget_t");
|
||||
ret = luaL_getmetatable(L, "awtk.widget_t");
|
||||
}
|
||||
lua_setmetatable(L, -2);
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "tk.h"
|
||||
#include "demos/resource.h"
|
||||
|
||||
extern void luaL_openlftk(lua_State* L);
|
||||
extern void luaL_openawtk(lua_State* L);
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
lua_State* L = luaL_newstate();
|
||||
@ -12,7 +12,7 @@ int main(int argc, char* argv[]) {
|
||||
const char* lua_file = argc == 2 ? argv[1] : "./demo2.lua";
|
||||
|
||||
luaL_openlibs(L);
|
||||
luaL_openlftk(L);
|
||||
luaL_openawtk(L);
|
||||
|
||||
tk_init(320, 480, s_heap_mem, sizeof(s_heap_mem));
|
||||
resource_init();
|
||||
|
112
lua/tk_lua.c
112
lua/tk_lua.c
@ -104,7 +104,7 @@ static int wrap_button_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)button_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/button_t/widget_t", "lftk.button_t");
|
||||
return tk_newuserdata(L, ret, "/button_t/widget_t", "awtk.button_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg button_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -140,7 +140,7 @@ static void button_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_button_t_get_prop}, {"__newindex", wrap_button_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.button_t");
|
||||
luaL_newmetatable(L, "awtk.button_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -182,7 +182,7 @@ static void canvas_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_canvas_t_get_prop}, {"__newindex", wrap_canvas_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.canvas_t");
|
||||
luaL_newmetatable(L, "awtk.canvas_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -199,7 +199,7 @@ static int wrap_check_button_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)check_button_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/check_button_t/widget_t", "lftk.check_button_t");
|
||||
return tk_newuserdata(L, ret, "/check_button_t/widget_t", "awtk.check_button_t");
|
||||
}
|
||||
|
||||
static int wrap_check_button_create_radio(lua_State* L) {
|
||||
@ -211,7 +211,7 @@ static int wrap_check_button_create_radio(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)check_button_create_radio(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/check_button_t/widget_t", "lftk.check_button_t");
|
||||
return tk_newuserdata(L, ret, "/check_button_t/widget_t", "awtk.check_button_t");
|
||||
}
|
||||
|
||||
static int wrap_check_button_set_value(lua_State* L) {
|
||||
@ -270,7 +270,7 @@ static void check_button_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_check_button_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.check_button_t");
|
||||
luaL_newmetatable(L, "awtk.check_button_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -287,7 +287,7 @@ static int wrap_dialog_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)dialog_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/dialog_t/widget_t", "lftk.dialog_t");
|
||||
return tk_newuserdata(L, ret, "/dialog_t/widget_t", "awtk.dialog_t");
|
||||
}
|
||||
|
||||
static int wrap_dialog_open(lua_State* L) {
|
||||
@ -295,7 +295,7 @@ static int wrap_dialog_open(lua_State* L) {
|
||||
char* name = (char*)luaL_checkstring(L, 1);
|
||||
ret = (widget_t*)dialog_open(name);
|
||||
|
||||
return tk_newuserdata(L, ret, "/dialog_t/widget_t", "lftk.dialog_t");
|
||||
return tk_newuserdata(L, ret, "/dialog_t/widget_t", "awtk.dialog_t");
|
||||
}
|
||||
|
||||
static int wrap_dialog_set_title(lua_State* L) {
|
||||
@ -367,7 +367,7 @@ static void dialog_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_dialog_t_get_prop}, {"__newindex", wrap_dialog_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.dialog_t");
|
||||
luaL_newmetatable(L, "awtk.dialog_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -418,7 +418,7 @@ static int wrap_edit_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)edit_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/edit_t/widget_t", "lftk.edit_t");
|
||||
return tk_newuserdata(L, ret, "/edit_t/widget_t", "awtk.edit_t");
|
||||
}
|
||||
|
||||
static int wrap_edit_set_text_limit(lua_State* L) {
|
||||
@ -531,7 +531,7 @@ static void edit_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_edit_t_get_prop}, {"__newindex", wrap_edit_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.edit_t");
|
||||
luaL_newmetatable(L, "awtk.edit_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -672,7 +672,7 @@ static void event_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_event_t_get_prop}, {"__newindex", wrap_event_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.event_t");
|
||||
luaL_newmetatable(L, "awtk.event_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -685,7 +685,7 @@ static int wrap_pointer_event_cast(lua_State* L) {
|
||||
event_t* event = (event_t*)tk_checkudata(L, 1, "event_t");
|
||||
ret = (pointer_event_t*)pointer_event_cast(event);
|
||||
|
||||
return tk_newuserdata(L, ret, "/pointer_event_t/event_t", "lftk.pointer_event_t");
|
||||
return tk_newuserdata(L, ret, "/pointer_event_t/event_t", "awtk.pointer_event_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg pointer_event_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -772,7 +772,7 @@ static void pointer_event_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_pointer_event_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.pointer_event_t");
|
||||
luaL_newmetatable(L, "awtk.pointer_event_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -785,7 +785,7 @@ static int wrap_key_event_cast(lua_State* L) {
|
||||
event_t* event = (event_t*)tk_checkudata(L, 1, "event_t");
|
||||
ret = (key_event_t*)key_event_cast(event);
|
||||
|
||||
return tk_newuserdata(L, ret, "/key_event_t/event_t", "lftk.key_event_t");
|
||||
return tk_newuserdata(L, ret, "/key_event_t/event_t", "awtk.key_event_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg key_event_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -858,7 +858,7 @@ static void key_event_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_key_event_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.key_event_t");
|
||||
luaL_newmetatable(L, "awtk.key_event_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -871,7 +871,7 @@ static int wrap_paint_event_cast(lua_State* L) {
|
||||
event_t* event = (event_t*)tk_checkudata(L, 1, "event_t");
|
||||
ret = (paint_event_t*)paint_event_cast(event);
|
||||
|
||||
return tk_newuserdata(L, ret, "/paint_event_t/event_t", "lftk.paint_event_t");
|
||||
return tk_newuserdata(L, ret, "/paint_event_t/event_t", "awtk.paint_event_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg paint_event_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -901,7 +901,7 @@ static int wrap_paint_event_t_get_prop(lua_State* L) {
|
||||
return 1;
|
||||
}
|
||||
if (strcmp(name, "c") == 0) {
|
||||
return tk_newuserdata(L, obj->c, "/canvas_t", "lftk.canvas_t");
|
||||
return tk_newuserdata(L, obj->c, "/canvas_t", "awtk.canvas_t");
|
||||
} else {
|
||||
return wrap_event_t_get_prop(L);
|
||||
}
|
||||
@ -914,7 +914,7 @@ static void paint_event_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_paint_event_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.paint_event_t");
|
||||
luaL_newmetatable(L, "awtk.paint_event_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -931,7 +931,7 @@ static int wrap_group_box_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)group_box_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/group_box_t/widget_t", "lftk.group_box_t");
|
||||
return tk_newuserdata(L, ret, "/group_box_t/widget_t", "awtk.group_box_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg group_box_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -968,7 +968,7 @@ static void group_box_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_group_box_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.group_box_t");
|
||||
luaL_newmetatable(L, "awtk.group_box_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1003,7 +1003,7 @@ static int wrap_image_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)image_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/image_t/widget_t", "lftk.image_t");
|
||||
return tk_newuserdata(L, ret, "/image_t/widget_t", "awtk.image_t");
|
||||
}
|
||||
|
||||
static int wrap_image_set_image_name(lua_State* L) {
|
||||
@ -1064,7 +1064,7 @@ static void image_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_image_t_get_prop}, {"__newindex", wrap_image_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.image_t");
|
||||
luaL_newmetatable(L, "awtk.image_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1081,7 +1081,7 @@ static int wrap_label_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)label_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/label_t/widget_t", "lftk.label_t");
|
||||
return tk_newuserdata(L, ret, "/label_t/widget_t", "awtk.label_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg label_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -1117,7 +1117,7 @@ static void label_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_label_t_get_prop}, {"__newindex", wrap_label_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.label_t");
|
||||
luaL_newmetatable(L, "awtk.label_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1134,7 +1134,7 @@ static int wrap_progress_bar_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)progress_bar_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/progress_bar_t/widget_t", "lftk.progress_bar_t");
|
||||
return tk_newuserdata(L, ret, "/progress_bar_t/widget_t", "awtk.progress_bar_t");
|
||||
}
|
||||
|
||||
static int wrap_progress_bar_set_value(lua_State* L) {
|
||||
@ -1231,7 +1231,7 @@ static void progress_bar_t_init(lua_State* L) {
|
||||
{"__newindex", wrap_progress_bar_t_set_prop},
|
||||
{NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.progress_bar_t");
|
||||
luaL_newmetatable(L, "awtk.progress_bar_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1290,7 +1290,7 @@ static void point_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_point_t_get_prop}, {"__newindex", wrap_point_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.point_t");
|
||||
luaL_newmetatable(L, "awtk.point_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1363,7 +1363,7 @@ static void rect_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_rect_t_get_prop}, {"__newindex", wrap_rect_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.rect_t");
|
||||
luaL_newmetatable(L, "awtk.rect_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1380,7 +1380,7 @@ static int wrap_slider_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)slider_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/slider_t/widget_t", "lftk.slider_t");
|
||||
return tk_newuserdata(L, ret, "/slider_t/widget_t", "awtk.slider_t");
|
||||
}
|
||||
|
||||
static int wrap_slider_set_value(lua_State* L) {
|
||||
@ -1510,7 +1510,7 @@ static void slider_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_slider_t_get_prop}, {"__newindex", wrap_slider_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.slider_t");
|
||||
luaL_newmetatable(L, "awtk.slider_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -1698,7 +1698,7 @@ static int wrap_value_set_bool(lua_State* L) {
|
||||
bool_t value = (bool_t)lua_toboolean(L, 2);
|
||||
ret = (value_t*)value_set_bool(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_bool(lua_State* L) {
|
||||
@ -1717,7 +1717,7 @@ static int wrap_value_set_int8(lua_State* L) {
|
||||
int8_t value = (int8_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_int8(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_int8(lua_State* L) {
|
||||
@ -1736,7 +1736,7 @@ static int wrap_value_set_uint8(lua_State* L) {
|
||||
uint8_t value = (uint8_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_uint8(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_uint8(lua_State* L) {
|
||||
@ -1755,7 +1755,7 @@ static int wrap_value_set_int16(lua_State* L) {
|
||||
int16_t value = (int16_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_int16(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_int16(lua_State* L) {
|
||||
@ -1774,7 +1774,7 @@ static int wrap_value_set_uint16(lua_State* L) {
|
||||
uint16_t value = (uint16_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_uint16(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_uint16(lua_State* L) {
|
||||
@ -1793,7 +1793,7 @@ static int wrap_value_set_int32(lua_State* L) {
|
||||
int32_t value = (int32_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_int32(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_int32(lua_State* L) {
|
||||
@ -1812,7 +1812,7 @@ static int wrap_value_set_uint32(lua_State* L) {
|
||||
uint32_t value = (uint32_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_uint32(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_uint32(lua_State* L) {
|
||||
@ -1831,7 +1831,7 @@ static int wrap_value_set_int64(lua_State* L) {
|
||||
int64_t value = (int64_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_int64(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_int64(lua_State* L) {
|
||||
@ -1850,7 +1850,7 @@ static int wrap_value_set_uint64(lua_State* L) {
|
||||
uint64_t value = (uint64_t)luaL_checkinteger(L, 2);
|
||||
ret = (value_t*)value_set_uint64(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_uint64(lua_State* L) {
|
||||
@ -1869,7 +1869,7 @@ static int wrap_value_set_float(lua_State* L) {
|
||||
float value = (float)luaL_checknumber(L, 2);
|
||||
ret = (value_t*)value_set_float(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_float(lua_State* L) {
|
||||
@ -1888,7 +1888,7 @@ static int wrap_value_set_double(lua_State* L) {
|
||||
double value = (double)luaL_checknumber(L, 2);
|
||||
ret = (value_t*)value_set_double(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_double(lua_State* L) {
|
||||
@ -1907,7 +1907,7 @@ static int wrap_value_set_str(lua_State* L) {
|
||||
char* value = (char*)luaL_checkstring(L, 2);
|
||||
ret = (value_t*)value_set_str(v, value);
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_str(lua_State* L) {
|
||||
@ -1952,7 +1952,7 @@ static int wrap_value_create(lua_State* L) {
|
||||
value_t* ret = NULL;
|
||||
ret = (value_t*)value_create();
|
||||
|
||||
return tk_newuserdata(L, ret, "/value_t", "lftk.value_t");
|
||||
return tk_newuserdata(L, ret, "/value_t", "awtk.value_t");
|
||||
}
|
||||
|
||||
static int wrap_value_destroy(lua_State* L) {
|
||||
@ -2033,7 +2033,7 @@ static void value_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_value_t_get_prop}, {"__newindex", wrap_value_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.value_t");
|
||||
luaL_newmetatable(L, "awtk.value_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -2050,7 +2050,7 @@ static int wrap_view_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)view_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/view_t/widget_t", "lftk.view_t");
|
||||
return tk_newuserdata(L, ret, "/view_t/widget_t", "awtk.view_t");
|
||||
}
|
||||
|
||||
static const struct luaL_Reg view_t_member_funcs[] = {{NULL, NULL}};
|
||||
@ -2086,7 +2086,7 @@ static void view_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_view_t_get_prop}, {"__newindex", wrap_view_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.view_t");
|
||||
luaL_newmetatable(L, "awtk.view_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -2246,7 +2246,7 @@ static int wrap_widget_get_child(lua_State* L) {
|
||||
uint32_t index = (uint32_t)luaL_checkinteger(L, 2);
|
||||
ret = (widget_t*)widget_get_child(widget, index);
|
||||
|
||||
return tk_newuserdata(L, ret, "/widget_t", "lftk.widget_t");
|
||||
return tk_newuserdata(L, ret, "/widget_t", "awtk.widget_t");
|
||||
}
|
||||
|
||||
static int wrap_widget_move(lua_State* L) {
|
||||
@ -2445,7 +2445,7 @@ static int wrap_widget_lookup(lua_State* L) {
|
||||
bool_t recursive = (bool_t)lua_toboolean(L, 3);
|
||||
ret = (widget_t*)widget_lookup(widget, name, recursive);
|
||||
|
||||
return tk_newuserdata(L, ret, "/widget_t", "lftk.widget_t");
|
||||
return tk_newuserdata(L, ret, "/widget_t", "awtk.widget_t");
|
||||
}
|
||||
|
||||
static int wrap_widget_set_visible(lua_State* L) {
|
||||
@ -2656,11 +2656,11 @@ static int wrap_widget_t_get_prop(lua_State* L) {
|
||||
|
||||
return 1;
|
||||
} else if (strcmp(name, "parent") == 0) {
|
||||
return tk_newuserdata(L, obj->parent, "/widget_t", "lftk.widget_t");
|
||||
return tk_newuserdata(L, obj->parent, "/widget_t", "awtk.widget_t");
|
||||
} else {
|
||||
widget_t* child = widget_lookup(obj, name, FALSE);
|
||||
if (child != NULL) {
|
||||
return tk_newuserdata(L, child, "/widget_t", "lftk.widget_t");
|
||||
return tk_newuserdata(L, child, "/widget_t", "awtk.widget_t");
|
||||
}
|
||||
printf("%s: not supported %s\n", __func__, name);
|
||||
return 0;
|
||||
@ -2673,7 +2673,7 @@ static void widget_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_widget_t_get_prop}, {"__newindex", wrap_widget_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.widget_t");
|
||||
luaL_newmetatable(L, "awtk.widget_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -2690,7 +2690,7 @@ static int wrap_window_create(lua_State* L) {
|
||||
wh_t h = (wh_t)luaL_checkinteger(L, 5);
|
||||
ret = (widget_t*)window_create(parent, x, y, w, h);
|
||||
|
||||
return tk_newuserdata(L, ret, "/window_t/widget_t", "lftk.window_t");
|
||||
return tk_newuserdata(L, ret, "/window_t/widget_t", "awtk.window_t");
|
||||
}
|
||||
|
||||
static int wrap_window_open(lua_State* L) {
|
||||
@ -2698,7 +2698,7 @@ static int wrap_window_open(lua_State* L) {
|
||||
char* name = (char*)luaL_checkstring(L, 1);
|
||||
ret = (widget_t*)window_open(name);
|
||||
|
||||
return tk_newuserdata(L, ret, "/window_t/widget_t", "lftk.window_t");
|
||||
return tk_newuserdata(L, ret, "/window_t/widget_t", "awtk.window_t");
|
||||
}
|
||||
|
||||
static int wrap_window_close(lua_State* L) {
|
||||
@ -2745,7 +2745,7 @@ static void window_t_init(lua_State* L) {
|
||||
static const struct luaL_Reg index_funcs[] = {
|
||||
{"__index", wrap_window_t_get_prop}, {"__newindex", wrap_window_t_set_prop}, {NULL, NULL}};
|
||||
|
||||
luaL_newmetatable(L, "lftk.window_t");
|
||||
luaL_newmetatable(L, "awtk.window_t");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
@ -2754,7 +2754,7 @@ static void window_t_init(lua_State* L) {
|
||||
lua_settop(L, 0);
|
||||
}
|
||||
|
||||
void luaL_openlftk(lua_State* L) {
|
||||
void luaL_openawtk(lua_State* L) {
|
||||
globals_init(L);
|
||||
button_t_init(L);
|
||||
canvas_t_init(L);
|
||||
|
@ -26,5 +26,5 @@ else:
|
||||
sources += Glob('vgcanvas/vgcanvas_picasso.cpp')
|
||||
|
||||
env=DefaultEnvironment().Clone()
|
||||
env.Library(os.path.join(LIB_DIR, 'lftk'), sources)
|
||||
env.Library(os.path.join(LIB_DIR, 'awtk'), sources)
|
||||
env.Program(os.path.join(BIN_DIR, 'mem_test'), ["base/mem_test.cc"])
|
||||
|
@ -213,7 +213,7 @@ static ret_t main_loop_nanovg_create_window(main_loop_nanovg_t* l, font_manager_
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
|
||||
#endif
|
||||
|
||||
l->sdl_window = SDL_CreateWindow("LFTK Simulator", x, y, w, h, flags);
|
||||
l->sdl_window = SDL_CreateWindow("AWTK Simulator", x, y, w, h, flags);
|
||||
return_value_if_fail(l->sdl_window != NULL, RET_FAIL);
|
||||
|
||||
l->gl_context = SDL_GL_CreateContext(l->sdl_window);
|
||||
|
@ -188,7 +188,7 @@ static ret_t main_loop_sdl2_create_window(main_loop_sdl2_t* l, font_manager_t* f
|
||||
SDL_Init(SDL_INIT_VIDEO);
|
||||
|
||||
l->sdl_window =
|
||||
SDL_CreateWindow("LFTK Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, 0);
|
||||
SDL_CreateWindow("AWTK Simulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, 0);
|
||||
return_value_if_fail(l->sdl_window != NULL, RET_FAIL);
|
||||
|
||||
l->sdl_render =
|
||||
|
4
src/tk.c
4
src/tk.c
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* File: lftk.c
|
||||
* File: awtk.c
|
||||
* Author: Li XianJing <xianjimli@hotmail.com>
|
||||
* Brief: lftk
|
||||
* Brief: awtk
|
||||
*
|
||||
* Copyright (c) 2018 - 2018 Li XianJing <xianjimli@hotmail.com>
|
||||
*
|
||||
|
4
src/tk.h
4
src/tk.h
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* File: lftk.h
|
||||
* File: awtk.h
|
||||
* Author: Li XianJing <xianjimli@hotmail.com>
|
||||
* Brief: lftk
|
||||
* Brief: awtk
|
||||
*
|
||||
* Copyright (c) 2018 - 2018 Li XianJing <xianjimli@hotmail.com>
|
||||
*
|
||||
|
@ -102,7 +102,7 @@ function genAll(json) {
|
||||
str += ' return 1;\n';
|
||||
} else if (type.indexOf('*') >= 0) {
|
||||
const typeName = type.replace(/\*/g, "");
|
||||
str += ` return tk_newuserdata(L, ${name}, "${genClassChain(typeName)}", "lftk.${typeName}");\n`;
|
||||
str += ` return tk_newuserdata(L, ${name}, "${genClassChain(typeName)}", "awtk.${typeName}");\n`;
|
||||
} else if (type.indexOf('int') >= 0) {
|
||||
str = ` lua_pushinteger(L,(lua_Integer)(${name}));\n\n`;
|
||||
str += ' return 1;\n';
|
||||
@ -256,7 +256,7 @@ function genAll(json) {
|
||||
if(cls.name === 'widget_t') {
|
||||
str += ` widget_t* child = widget_lookup(obj, name, FALSE);\n`;
|
||||
str += ` if(child != NULL) {\n`;
|
||||
str += ` return tk_newuserdata(L, child, "/widget_t", "lftk.widget_t");\n`;
|
||||
str += ` return tk_newuserdata(L, child, "/widget_t", "awtk.widget_t");\n`;
|
||||
str += ` }\n`;
|
||||
}
|
||||
str += ` printf("%s: not supported %s\\n", __func__, name);\n`;
|
||||
@ -293,7 +293,7 @@ function genAll(json) {
|
||||
str += ` {NULL, NULL}\n`;
|
||||
str += ' };\n\n'
|
||||
|
||||
str += ` luaL_newmetatable(L, "lftk.${cls.name}");\n`;
|
||||
str += ` luaL_newmetatable(L, "awtk.${cls.name}");\n`;
|
||||
str += ` lua_pushstring(L, "__index");\n`;
|
||||
str += ' lua_pushvalue(L, -2);\n';
|
||||
str += ' lua_settable(L, -3);\n';
|
||||
@ -418,7 +418,7 @@ function genAll(json) {
|
||||
function genInit(json) {
|
||||
let result = '';
|
||||
|
||||
result += `\nvoid luaL_openlftk(lua_State* L) {\n`;
|
||||
result += `\nvoid luaL_openawtk(lua_State* L) {\n`;
|
||||
result += ` globals_init(L);\n`;
|
||||
json.forEach(iter => {
|
||||
if (iter.type === 'class' || iter.type === 'enum') {
|
||||
|
@ -1,10 +1,10 @@
|
||||
## 位图生成工具
|
||||
|
||||
在嵌入式系统中,RAM比较少,虽然PNG/JPG等文件可以大幅度降低存储空间,但是需要解码到内存中,不太适合直接使用。LFTK提供了imagegen工具,将图片转换成位图数据,直接编译到代码中,放在flash中,不占用内存空间。
|
||||
在嵌入式系统中,RAM比较少,虽然PNG/JPG等文件可以大幅度降低存储空间,但是需要解码到内存中,不太适合直接使用。AWTK提供了imagegen工具,将图片转换成位图数据,直接编译到代码中,放在flash中,不占用内存空间。
|
||||
|
||||
```
|
||||
./bin/imagegen in_filename out_filename
|
||||
```
|
||||
|
||||
* in_filename png/jpg 文件
|
||||
* out_filename 位图数据文件
|
||||
* out_filename 位图数据文件
|
||||
|
@ -1,5 +1,5 @@
|
||||
## UI数据转换工具
|
||||
|
||||
* qt\_to\_xml 将QT的UI文件转成LFTK XML的文件。
|
||||
* rc\_to\_xml 将MS的RC文件转成LFTK XML的文件。
|
||||
* xml\_to\_ui 将LFTK XML的文件转成LFTK二进制的UI文件。
|
||||
* qt\_to\_xml 将QT的UI文件转成AWTK XML的文件。
|
||||
* rc\_to\_xml 将MS的RC文件转成AWTK XML的文件。
|
||||
* xml\_to\_ui 将AWTK XML的文件转成AWTK二进制的UI文件。
|
||||
|
@ -56,7 +56,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "确定",IDOK,68,90,50,30
|
||||
PUSHBUTTON "取消",IDCANCEL,142,90,50,30
|
||||
LTEXT "LFTK is cool!",IDC_STATIC,50,38,138,23
|
||||
LTEXT "AWTK is cool!",IDC_STATIC,50,38,138,23
|
||||
END
|
||||
|
||||
IDD_DIALOG2 DIALOGEX 0, 0, 216, 122
|
||||
@ -71,7 +71,7 @@ BEGIN
|
||||
CONTROL "",IDC_PROGRESS1,"msctls_progress32",WS_BORDER,16,93,80,30
|
||||
CONTROL "Radio1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,151,16,37,30
|
||||
CONTROL "Radio2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,151,52,37,30
|
||||
LTEXT "LFTK is cool!",IDC_STATIC,116,160,63,30
|
||||
LTEXT "AWTK is cool!",IDC_STATIC,116,160,63,30
|
||||
END
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user