rename to awtk

This commit is contained in:
xianjimli 2018-05-05 16:47:58 +08:00
parent a11386cd1c
commit 084c127b04
30 changed files with 162 additions and 142 deletions

View File

@ -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移植文档。

View File

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

View File

@ -68,7 +68,7 @@
* 支持tween动画
## 长期计划
* 用LFTK实现界面编辑器
* 用AWTK实现界面编辑器
* 支持粒子产生器
* 支持骨骼动画
* flash播放器支持

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
# LFTK中的事件处理函数
# AWTK中的事件处理函数
emitter实现了通用的事件注册、注销和分发功能widget对此做了进一步包装使用起来非常方便。

View File

@ -1,8 +1,8 @@
# LFTK中的图片显示方式
# AWTK中的图片显示方式
## 一、显示方式
LFTK提供了多种图片显示方式
AWTK提供了多种图片显示方式
* 居中显示。将图片按原大小显示在目标矩形的中央。
* 缩放显示。将图片缩放至目标矩形的大小(不保证宽高成比例)。

View File

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

View File

@ -1,7 +1,7 @@
## LFTK中显示优化技术
## AWTK中显示优化技术
### 一、裁剪
### 二、脏矩形
### 三、极速模式
### 三、极速模式

View File

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

View File

@ -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文件需要转换成二进制的格式。

View File

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

View File

@ -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)
### 三、编译主题

View File

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

View File

@ -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主频小余100MRAM小余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时效果可能不太一样甚至不兼容所以在使用时尽量保守一点:)
```

View File

@ -1,4 +1,4 @@
# LFTK中的窗口动画
# AWTK中的窗口动画
窗口动画是现代GUI最基本的功能之一在窗口打开或关闭时引入一个过渡动画让用户感觉这个过程是流畅的。窗口动画的基本原理很简单在打开或关闭窗口时把前后两个窗口预先绘制到两张内存图片上按照指定规则显示两张图片形成动画效果。

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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 位图数据文件

View File

@ -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文件。

View File

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