mirror of
https://github.com/zlgopen/awtk.git
synced 2025-05-08 19:44:45 +08:00
update docs
This commit is contained in:
parent
be72b75ae4
commit
9d9f67dc47
@ -6,7 +6,9 @@ AWTK 应用程序通常是一个单体的应用程序,里面所有的窗口都
|
||||
|
||||
## 1. 使用方法
|
||||
|
||||
### 1.1 设置小应用程序 (applet) 资源所在的根目录(所有的小应用程序 (applet) 的资源都安装到该目录下)。
|
||||
### 1.1 设置小应用程序 (applet) 资源所在的根目录
|
||||
|
||||
**所有的小应用程序 (applet) 的资源都安装到该目录下。**
|
||||
|
||||
```c
|
||||
/**
|
||||
|
@ -235,8 +235,6 @@ usesSdk 是可选的,表示项目依赖的SDK的信息。
|
||||
|
||||
> 使用 scons 进行编译时,可以通过 AWTK_ROOT 参数手动设置 AWTK 的路径,比如:
|
||||
|
||||
```cmd
|
||||
```bash
|
||||
scons AWTK_ROOT=c:/AWTK/SDK/awtk
|
||||
```
|
||||
|
||||
|
||||
|
@ -45,7 +45,7 @@ scons -j2
|
||||
cd -
|
||||
```
|
||||
|
||||
### 5. 更新绑定代码
|
||||
## 5. 更新绑定代码
|
||||
|
||||
```
|
||||
git clone https://github.com/zlgopen/awtk-binding
|
||||
@ -54,7 +54,7 @@ cd awtk-binding
|
||||
cd -
|
||||
```
|
||||
|
||||
### 6. 同步绑定代码到需要的语言
|
||||
## 6. 同步绑定代码到需要的语言
|
||||
|
||||
```
|
||||
git clone https://github.com/zlgopen/awtk-jerryscript
|
||||
@ -63,7 +63,7 @@ cd awtk-jerryscript
|
||||
scons
|
||||
```
|
||||
|
||||
### 7. 注意
|
||||
## 7. 注意
|
||||
|
||||
* 开发应用程序时记得拷贝自定义控件的 style 到资源中。
|
||||
* 如果代码下载太慢,可以从 fastgit 下载。
|
||||
|
@ -1,6 +1,7 @@
|
||||
# 最新动态
|
||||
|
||||
2022/07/05
|
||||
* 完善文档(感谢雨欣提供补丁)
|
||||
* 支持独立可以安装的applet,让它们具有独立的资源目录。
|
||||
* 增加文档[支持可独立安装的小应用程序 (applet)](applet.md)
|
||||
|
||||
|
@ -245,7 +245,7 @@ tk_object_t* conf_xml_load(const char* url, bool_t create_if_not_exist);
|
||||
ret_t conf_xml_save_as(tk_object_t* obj, const char* url);
|
||||
```
|
||||
|
||||
## 3.3 INI 格式
|
||||
### 3.3 INI 格式
|
||||
|
||||
* 打开
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## 一、输入设备相关问题
|
||||
|
||||
### 1. 指针设备问题的检查列表:
|
||||
### 1.1 指针设备问题的检查列表:
|
||||
|
||||
* 设备名称是否正确。
|
||||
* 电阻屏是否校准。
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
## 二、显示相关问题
|
||||
|
||||
### 1. 图片颜色不正常的检查列表:
|
||||
### 2.1 图片颜色不正常的检查列表:
|
||||
|
||||
* LCD 的格式是否正确。
|
||||
* 图片格式是否正确。
|
||||
|
@ -8,7 +8,7 @@
|
||||
* 长时间运行进行压力测试。
|
||||
* 辅助手工测试。有时出现崩溃的 BUG 时,往往忘记之前是如何操作的了,输入事件记录与重放可以精确重现问题。同时也可以减轻手工测试的工作量。
|
||||
|
||||
## 2.API
|
||||
## 2. API
|
||||
|
||||
```c
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
## FrameBuffer 的几种使用方式
|
||||
|
||||
### 一、单 framebuffer。
|
||||
### 一、单 framebuffer
|
||||
|
||||
系统中只有一个 framebuffer,LCD 使用该 framebuffer 进行显示,GUI 使用该 framebuffer 进行绘制。
|
||||
|
||||
@ -16,7 +16,9 @@
|
||||
|
||||
> 如果硬件能够解决动画颜色不正常的问题或者不需要动画,这种方式是最好的选择。
|
||||
|
||||
### 二、双 framebuffer,一个 online 一个 offline,轮流切换显示。
|
||||
### 二、双 framebuffer(Swap)
|
||||
|
||||
系统有两个 framebuffer,一个 online 一个 offline,轮流切换显示
|
||||
|
||||
* 1.GUI 在 offline 的 framebuffer 上绘制。
|
||||
* 2.LCD 显示 online 的 framebuffer。
|
||||
@ -32,7 +34,9 @@
|
||||
|
||||
* GUI 每次都需要进行完整的绘制,不能只绘制变化的部分。
|
||||
|
||||
### 三、双 framebuffer,一个固定 online 供 LCD 显示,一个固定 offline 供 GUI 绘制。
|
||||
### 三、双 framebuffer(Flush)
|
||||
|
||||
系统有两个 framebuffer,一个固定 online 供 LCD 显示,一个固定 offline 供 GUI 绘制。
|
||||
|
||||

|
||||
|
||||
@ -44,7 +48,9 @@
|
||||
|
||||
* 窗口动画时,可能整个屏幕都在变化,所以拷贝的量比较大。优化方法:对于平移的动画,可以让 GUI 直接往 online 的 framebuffer 上绘制,减少一次内存拷贝,而且不会出现闪烁。
|
||||
|
||||
### 四、三个 framebuffer,一个 online 供 LCD 显示,一个 offline 供 GUI 绘制,一个为下一个要显示的 framebuffer。
|
||||
### 四、三个 framebuffer
|
||||
|
||||
系统有三个 framebuffer,一个 online 供 LCD 显示,一个 offline 供 GUI 绘制,一个为下一个要显示的 framebuffer。
|
||||
|
||||

|
||||
|
||||
|
@ -1451,9 +1451,9 @@ clamp(2, 1, 3)
|
||||
### 4.5 时间函数
|
||||
> 已经移动到扩展模块。
|
||||
|
||||
### 5. 自定义函数
|
||||
## 5. 自定义函数
|
||||
|
||||
#### 5.1 定义函数
|
||||
### 5.1 定义函数
|
||||
|
||||
```c
|
||||
static ret_t func_foo(object_t* obj, fscript_args_t* args, value_t* v) {
|
||||
@ -1463,7 +1463,7 @@ static ret_t func_foo(object_t* obj, fscript_args_t* args, value_t* v) {
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2 注册和使用私有函数
|
||||
### 5.2 注册和使用私有函数
|
||||
|
||||
```c
|
||||
value_t v;
|
||||
@ -1476,7 +1476,7 @@ static ret_t func_foo(object_t* obj, fscript_args_t* args, value_t* v) {
|
||||
OBJECT_UNREF(obj);
|
||||
```
|
||||
|
||||
#### 5.3 注册全局函数
|
||||
### 5.3 注册全局函数
|
||||
|
||||
* 初始化时调用
|
||||
|
||||
@ -1485,7 +1485,7 @@ fscript_register_func("foo", func_foo);
|
||||
|
||||
```
|
||||
|
||||
#### 5.4 定义脚本函数
|
||||
### 5.4 定义脚本函数
|
||||
|
||||
* 函数定义
|
||||
|
||||
@ -1535,7 +1535,7 @@ assert(foo4(10, 20) == 'awtk')
|
||||
assert(foo4(100, 200) == 'react-awtk')
|
||||
```
|
||||
|
||||
### 6. 性能测量与优化
|
||||
## 6. 性能测量与优化
|
||||
|
||||
runFScript 的第二个参数可以指定运行次数,方便测量某个函数的运行时间。
|
||||
|
||||
@ -1553,7 +1553,7 @@ runFScript 的第二个参数可以指定运行次数,方便测量某个函数
|
||||
./bin/runFScript 'set(a, 2); set(b, 3); print(a+b)'
|
||||
```
|
||||
|
||||
### 7. 扩展模块
|
||||
## 7. 扩展模块
|
||||
|
||||
* [字符串扩展模块](fscript_str.md)
|
||||
* [位操作扩展模块](fscript_bits.md)
|
||||
@ -1579,6 +1579,6 @@ runFScript 的第二个参数可以指定运行次数,方便测量某个函数
|
||||
* [读缓冲区扩展模块](fscript_rbuffer.md)
|
||||
* [module扩展模块](fscript_module.md)
|
||||
|
||||
### 8. 更多示例
|
||||
## 8. 更多示例
|
||||
|
||||
请参考 tests/fscripts 目录。
|
||||
|
@ -59,7 +59,7 @@ cksum(binary) => uint16_t
|
||||
cksum("hello")
|
||||
```
|
||||
|
||||
### 4. 更多示例
|
||||
### 更多示例
|
||||
|
||||
```js
|
||||
//test string
|
||||
|
@ -1,6 +1,6 @@
|
||||
# fscript 内存需求评估
|
||||
|
||||
## 一、测试环境
|
||||
## 1. 测试环境
|
||||
|
||||
测试使用的 AWTK 版本:AWTKv1.7,SHA-1: 5f570df4fc42a5a0050bae1d2fe8f99d6aa42532。
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
> 备注:以下测试均为无 GUI 界面的结果,即只跑 fscript 脚本。
|
||||
|
||||
## 二、推荐的栈堆大小
|
||||
## 2. 推荐的栈堆大小
|
||||
|
||||
fscript **最低的栈(Stack)需求为 1.5 KB,最低的堆需求为 4 KB**,以上内存仅够初始化 fscript 基础模块和扩展模块,脚本代码只能做简单的运算以及打印信息。
|
||||
|
||||
@ -67,7 +67,7 @@ fscript **最低的栈(Stack)需求为 1.5 KB,最低的堆需求为 4 KB**
|
||||
3. 使用 if else 条件判断或 while 循环时,堆栈大小请根据条件分支数量以及循环次数适当调整;
|
||||
4. 函数嵌套调用时,会消耗较多的堆栈空间,请尽量避免使用。
|
||||
|
||||
## 三、堆空间的计算
|
||||
## 3. 堆空间的计算
|
||||
|
||||
### 3.1 fscript 本身所需的 Heap
|
||||
|
||||
@ -104,7 +104,7 @@ fscript 初始化所需的 Heap 详见下表:
|
||||
|
||||
在 fscript 脚本中自定义函数(无参数、无返回值、无执行代码)内存(Heap)峰值会增加 350 字节左右。如果有传入参数以及返回值,请参考 3.2 章节计算内存。调用自定义函数与嵌套调用时消耗的内存与 fscript 内置函数一样。
|
||||
|
||||
## 四、堆栈计算示例
|
||||
## 4. 堆栈计算示例
|
||||
|
||||
比如,我们需要计算以下 fscript 脚本所需的堆栈空间,步骤如下:
|
||||
|
||||
|
@ -1,16 +1,17 @@
|
||||
# 如何设置应用程序的图标
|
||||
|
||||
## Windows
|
||||
## 1. Windows
|
||||
|
||||
### 将应用程序的资源放到应用程序目录下的下列位置:
|
||||
### 1.1 将应用程序的资源放到应用程序目录下的下列位置:
|
||||
|
||||
```
|
||||
win32_res/awtk.res
|
||||
```
|
||||
|
||||
### 资源的生成方法
|
||||
### 1.2 资源的生成方法
|
||||
|
||||
可以在awtk/win32\_res基础之上修改,也可以完全自己制作。
|
||||
|
||||
### 参考
|
||||
### 1.3 参考
|
||||
|
||||
* [如何修改 Windows 下应用程序的图标](https://github.com/zlgopen/awtk/blob/master/win32_res/README.md)
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
>PC 版本默认已经定义。
|
||||
|
||||
### 2. 加入相关文件
|
||||
## 2. 加入相关文件
|
||||
|
||||
```
|
||||
3rd/fribidi/fribidi-arabic.c
|
||||
@ -34,13 +34,13 @@ src/base/bidi.c
|
||||
|
||||
>PC 版本默认已经加。
|
||||
|
||||
### 3. 控件的 bidi 属性
|
||||
## 3. 控件的 bidi 属性
|
||||
|
||||
默认情况下,文字的方向自动确定,如果在某些情况下,需要自己指定,可以通过 bidi 属性来实现。
|
||||
默认情况下,文字的方向自动确定,如果在某些情况下,需要自己指定,可以通过 bidi 属性来实现。
|
||||
|
||||
示例:
|
||||
示例:
|
||||
|
||||
```xml
|
||||
```xml
|
||||
<label text="1. جامعة كولومبيا عام." style:font_size="30" style:font_name="trado" bidi="lro"/>
|
||||
```
|
||||
|
||||
|
@ -49,7 +49,7 @@
|
||||
|
||||
2. styles/default
|
||||
|
||||
### 3. 高级用法
|
||||
## 3. 高级用法
|
||||
|
||||
在上面的用法中,所有的下拉选择框,使用相同的样式。在特殊情况下,可能需要为不同的下拉选择框指定不同的样式。此时可以使用下拉选择框的 theme\_of\_popup 属性,为其指定特别样式文件。如:
|
||||
|
||||
|
@ -1,19 +1,19 @@
|
||||
# 如何使用高效的屏幕旋转
|
||||
|
||||
在实际的开发中,屏幕的选择会受到成本,供应商以及效果而影响,会导致横屏的应用无法使用横屏的屏幕,所以就需要高效的屏幕旋转功能来解决该问题。
|
||||
在实际的开发中,屏幕的选择会受到成本,供应商以及效果而影响,会导致横屏的应用无法使用横屏的屏幕,所以就需要高效的屏幕旋转功能来解决该问题。
|
||||
|
||||
AWTK 默认提供了一种基于图像旋转的屏幕旋转功能,这一套逻辑优点是兼容性好,但是缺点就是效率比较低和吃内存。
|
||||
AWTK 默认提供了一种基于图像旋转的屏幕旋转功能,这一套逻辑优点是兼容性好,但是缺点就是效率比较低和吃内存。
|
||||
|
||||
现在提供一种全新的高效旋转机制来解决上面说的所有问题,同时保持高效(和没有旋转的运行效率几乎一样),但是由于这套机制兼容性比较差一点,对 lcd 层,vgcanvas 层和 g2d 的适配层的都有所要求,所以使用的时候需要注意一下。
|
||||
现在提供一种全新的高效旋转机制来解决上面说的所有问题,同时保持高效(和没有旋转的运行效率几乎一样),但是由于这套机制兼容性比较差一点,对 lcd 层,vgcanvas 层和 g2d 的适配层的都有所要求,所以使用的时候需要注意一下。
|
||||
|
||||
>新的旋转机制是一套矢量计算的旋转机制,所以在底层绘图之前需要把相关的数据通过矢量计算转换,所以对 lcd 层,vgcanvas 层和 g2d 的适配层有要求。
|
||||
> 新的旋转机制是一套矢量计算的旋转机制,所以在底层绘图之前需要把相关的数据通过矢量计算转换,所以对 lcd 层,vgcanvas 层和 g2d 的适配层有要求。
|
||||
|
||||
|
||||
## 一、基本用法
|
||||
|
||||
由于该机制需要 lcd 层和 vgcanvas 层配合,所以如果用户是使用 AWTK 提供了的 lcd 适配层(lcd_mem_XXX_create 的函数创建的 lcd )和 vgcanvas 适配层(定义 WITH_NANOVG_AGGE 宏),则只需要定义 **WITH_FAST_LCD_PORTRAIT 宏**,以及在程序运行前调用 tk_enable_fast_lcd_portrait 函数设置开启高效屏幕旋转模式,然后在代码中调用 tk_set_lcd_orientation 函数就可以使用了。
|
||||
由于该机制需要 lcd 层和 vgcanvas 层配合,所以如果用户是使用 AWTK 提供了的 lcd 适配层(lcd_mem_XXX_create 的函数创建的 lcd )和 vgcanvas 适配层(定义 WITH_NANOVG_AGGE 宏),则只需要定义 **WITH_FAST_LCD_PORTRAIT 宏**,以及在程序运行前调用 tk_enable_fast_lcd_portrait 函数设置开启高效屏幕旋转模式,然后在代码中调用 tk_set_lcd_orientation 函数就可以使用了。
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* awtk_global.h */
|
||||
|
||||
/**
|
||||
@ -34,13 +34,13 @@ ret_t tk_set_lcd_orientation(lcd_orientation_t orientation);
|
||||
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
|
||||
*/
|
||||
ret_t tk_enable_fast_lcd_portrait(bool_t enable);
|
||||
~~~
|
||||
```
|
||||
|
||||
但是如果用户重载 lcd 的 flush 的函数的话(主要是高效 lcd 旋转的话,在做 flush 的时候,不需要 image_rotate 调用旋转 fb 了,只需要调用 image_copy 函数直接拷贝就可以了),同时由于脏矩形的计算有所不同, 需要调用需要特殊处理一下,所以需要看一下的下面的代码说明。
|
||||
但是如果用户重载 lcd 的 flush 的函数的话(主要是高效 lcd 旋转的话,在做 flush 的时候,不需要 image_rotate 调用旋转 fb 了,只需要调用 image_copy 函数直接拷贝就可以了),同时由于脏矩形的计算有所不同, 需要调用需要特殊处理一下,所以需要看一下的下面的代码说明。
|
||||
|
||||
这里用 awtk-linux-fb 的代码来说明,如果修改用户重载的 flush 代码。
|
||||
这里用 awtk-linux-fb 的代码来说明,如果修改用户重载的 flush 代码。
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* awtk-linux-fb/lcd_linux/lcd_linux_fb.c */
|
||||
|
||||
static ret_t lcd_linux_flush(lcd_t* base, int fbid) {
|
||||
@ -69,38 +69,37 @@ static ret_t lcd_linux_flush(lcd_t* base, int fbid) {
|
||||
}
|
||||
/*...省略无关代码...*/
|
||||
}
|
||||
~~~
|
||||
```
|
||||
|
||||
#### 注意实现:
|
||||
### 1.1 注意实现
|
||||
|
||||
1. 为了可以高效贴图,所以贴图在加载到内存前就会被旋转到指定的角度了,所以使用 data 格式的位图时候需要提前调用脚本命令来生成资源。(最后一个参数为旋转角度,单位为角度,支持 0 度,90 度,180 度和 270 度)
|
||||
1. 为了可以高效贴图,所以贴图在加载到内存前就会被旋转到指定的角度了,所以使用 data 格式的位图时候需要提前调用脚本命令来生成资源。(最后一个参数为旋转角度,单位为角度,支持 0 度,90 度,180 度和 270 度)
|
||||
|
||||
~~~shell
|
||||
python .\scripts\update_res.py all x1 bgra+bgr565 0
|
||||
~~~
|
||||
```bash
|
||||
python .\scripts\update_res.py all x1 bgra+bgr565 0
|
||||
```
|
||||
|
||||
2. 如果 data 格式的位图的旋转角度为 0 度的话,可以支持动态 lcd 旋转,但是效率会下降,而使用文件系统或者 res 格式的位图数据则不会降低效率。
|
||||
2. 如果 data 格式的位图的旋转角度为 0 度的话,可以支持动态 lcd 旋转,但是效率会下降,而使用文件系统或者 res 格式的位图数据则不会降低效率。
|
||||
|
||||
3. 在没有定义 WITH_STB_IMAGE 宏(使用 data 格式的位图数据)的情况下,并且是位图旋转角度不为 0 度的话,是**不支持程序动态旋转**,需要在程序开始前就需要设置好旋转的角度,同时旋转角度应该和资源保持一致。
|
||||
3. 在没有定义 WITH_STB_IMAGE 宏(使用 data 格式的位图数据)的情况下,并且是位图旋转角度不为 0 度的话,是**不支持程序动态旋转**,需要在程序开始前就需要设置好旋转的角度,同时旋转角度应该和资源保持一致。
|
||||
|
||||
4. 在使用的时候,需要特别注意 bitmap_t,lcd_t 和 graphic_buffer_t 类型是分为有**逻辑数据**和**真实的物理数据**的,所有的真实的物理数据只能通过接口获取,一般名称都会带有 **“physical”** 的字眼。
|
||||
4. 在使用的时候,需要特别注意 bitmap_t,lcd_t 和 graphic_buffer_t 类型是分为有**逻辑数据**和**真实的物理数据**的,所有的真实的物理数据只能通过接口获取,一般名称都会带有 **“physical”** 的字眼。
|
||||
|
||||
5. WITH_FAST_LCD_PORTRAIT 宏只是把功能增加到工程中,还需要用户自行调用 tk_enable_fast_lcd_portrait 来开启,如果没有调用 tk_enable_fast_lcd_portrait 函数的话,默认不启用,退化为以前就的 lcd 旋转方案。
|
||||
5. WITH_FAST_LCD_PORTRAIT 宏只是把功能增加到工程中,还需要用户自行调用 tk_enable_fast_lcd_portrait 来开启,如果没有调用 tk_enable_fast_lcd_portrait 函数的话,默认不启用,退化为以前就的 lcd 旋转方案。
|
||||
|
||||
> 如果是使用 Desiger 工具的话,第 1 点和第 3 点都以及相关函数的调用都会处理好的,用户只要注意代码中动态 lcd 旋转的问题。
|
||||
|
||||
|
||||
## 二、功能移植
|
||||
|
||||
由于在某些情况下,用户会自行适配 lcd, vgcanvas 或者 g2d,所以用户需要在自行适配的层中加入相关的代码既可。
|
||||
由于在某些情况下,用户会自行适配 lcd, vgcanvas 或者 g2d,所以用户需要在自行适配的层中加入相关的代码既可。
|
||||
|
||||
在贴图的时候,需要注意的是为了高效的贴图,所以贴图在加载到内存前就会被旋转到指定的角度了(又名为已旋转的贴图),如果 vgcanvas 层不支持显示旋转后的图片的话,需要定义 **WITHOUT_FAST_LCD_PORTRAIT_FOR_IMAGE宏**,来让贴图不要旋转,如果贴图为 data 格式的位图数据话,这生成位图数据时候把 LCD_ORIENTATION 设置为 0 度。
|
||||
在贴图的时候,需要注意的是为了高效的贴图,所以贴图在加载到内存前就会被旋转到指定的角度了(又名为已旋转的贴图),如果 vgcanvas 层不支持显示旋转后的图片的话,需要定义**WITHOUT_FAST_LCD_PORTRAIT_FOR_IMAGE宏**,来让贴图不要旋转,如果贴图为 data 格式的位图数据话,这生成位图数据时候把 LCD_ORIENTATION 设置为 0 度。
|
||||
|
||||
> 如果使用 data 格式的位图数据的话,屏幕的旋转角度一定要和图片旋转角度一致否则会出现断言。
|
||||
|
||||
已旋转的贴图的旋转角度一般和 lcd 旋转的角度一致,为了高效贴图而不需要旋转贴图,以及以前的 bitmap->w,bitmap->h 和 bitmap->line_length 都为逻辑数据,逻辑数据则为图片原来未旋转时的数据,下列是获取位图的真实物理数据的接口:
|
||||
已旋转的贴图的旋转角度一般和 lcd 旋转的角度一致,为了高效贴图而不需要旋转贴图,以及以前的 bitmap->w,bitmap->h 和 bitmap->line_length 都为逻辑数据,逻辑数据则为图片原来未旋转时的数据,下列是获取位图的真实物理数据的接口:
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* awtk/base/bitmap.h */
|
||||
|
||||
/**
|
||||
@ -130,15 +129,15 @@ uint32_t bitmap_get_physical_width(bitmap_t* bitmap);
|
||||
* @return {uint32_t} 返回图片高度。
|
||||
*/
|
||||
uint32_t bitmap_get_physical_height(bitmap_t* bitmap);
|
||||
~~~
|
||||
```
|
||||
|
||||
> 除了上述的接口,其他接口获取出来都是逻辑数据。
|
||||
|
||||
### 1. LCD 层适配
|
||||
### 2.1 LCD 层适配
|
||||
|
||||
需要在各个的 lcd 层的绘图函数中加入坐标数据转化的机制,例如:
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* awtk/lcd/lcd_mem.inc */
|
||||
|
||||
/* 填充矩形 */
|
||||
@ -158,19 +157,18 @@ static ret_t lcd_mem_fill_rect_with_color(lcd_t* lcd, xy_t x, xy_t y, wh_t w, wh
|
||||
lcd_mem_init_drawing_fb(lcd, &fb);
|
||||
return image_fill(&fb, &rr, c);
|
||||
}
|
||||
```
|
||||
|
||||
~~~
|
||||
在 WITH_FAST_LCD_PORTRAIT 宏中,我们可以看到把填充的矩形坐标数据通过 lcd_orientation_rect_rotate_by_anticlockwise 函数转化为新的一个矩形坐标,然后再调用相关的填充函数来填充颜色。
|
||||
|
||||
在 WITH_FAST_LCD_PORTRAIT 宏中,我们可以看到把填充的矩形坐标数据通过 lcd_orientation_rect_rotate_by_anticlockwise 函数转化为新的一个矩形坐标,然后再调用相关的填充函数来填充颜色。
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* lcd_orientation_helper.inc */
|
||||
|
||||
/* 输入一个矩形数据通过旋转计算后返回的一个矩形数据 */
|
||||
rect_t lcd_orientation_rect_rotate_by_anticlockwise(const rect_t* rect, lcd_orientation_t o, wh_t src_limit_w, wh_t src_limit_h);
|
||||
~~~
|
||||
```
|
||||
|
||||
lcd 适配层一共需要适配下面的函数:(适配的思路可以查看 lcd_mem.inc 中的代码)
|
||||
lcd 适配层一共需要适配下面的函数:(适配的思路可以查看 lcd_mem.inc 中的代码)
|
||||
|
||||
| 函数 | 作用 |
|
||||
| ------------------- | ---------------- |
|
||||
@ -183,17 +181,17 @@ rect_t lcd_orientation_rect_rotate_by_anticlockwise(const rect_t* rect, lcd_orie
|
||||
| get_physical_width | 获取真实物理宽度 |
|
||||
| get_physical_height | 获取真实物理高度 |
|
||||
|
||||
上面的基本的适配函数,可能在实际运行的时候,还需要适配其他的函数(例如:set_orientation 函数)。
|
||||
上面的基本的适配函数,可能在实际运行的时候,还需要适配其他的函数(例如:set_orientation 函数)。
|
||||
|
||||
### 2. VGCANVAS 层适配
|
||||
### 2.2 VGCANVAS 层适配
|
||||
|
||||
而 vgcanvas 层的适配和 lcd 层的适配基本是大同小异的都是适配绘图的函数就好了,但是**需要特别注意的就是贴图的旋转的问题**,因为有一些矢量画布库是不支持使用以及旋转的贴图。
|
||||
而 vgcanvas 层的适配和 lcd 层的适配基本是大同小异的都是适配绘图的函数就好了,但是**需要特别注意的就是贴图的旋转的问题**,因为有一些矢量画布库是不支持使用以及旋转的贴图。
|
||||
|
||||
### 3. G2D 层适配
|
||||
### 2.3 G2D 层适配
|
||||
|
||||
而 g2d 层的适配其实主要是增加了两个适配函数:
|
||||
而 g2d 层的适配其实主要是增加了两个适配函数:
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/* awtk/base/g2d.h */
|
||||
|
||||
/**
|
||||
@ -227,9 +225,8 @@ ret_t g2d_rotate_image_ex(bitmap_t* dst, bitmap_t* src, const rect_t* src_r, xy_
|
||||
*/
|
||||
ret_t g2d_blend_image_rotate(bitmap_t* dst, bitmap_t* src, const rectf_t* dst_r, const rectf_t* src_r,
|
||||
uint8_t alpha, lcd_orientation_t o);
|
||||
~~~
|
||||
```
|
||||
|
||||
备注:
|
||||
|
||||
1. 如果不实现这两个函数的话,则会调用 soft_rotate_image_ex 和 soft_blend_image_rotate 进行软件旋转绘制图片。
|
||||
2. g2d 层的这两个函数主要是用来处理图片旋转角度为 0 的 lcd 旋转的情况,如果可以保证图片旋转角度和 lcd 旋转角度一样的话,这两个函数可以不实现。
|
||||
> 备注:
|
||||
> 1. 如果不实现这两个函数的话,则会调用 soft_rotate_image_ex 和 soft_blend_image_rotate 进行软件旋转绘制图片。
|
||||
> 2. g2d 层的这两个函数主要是用来处理图片旋转角度为 0 的 lcd 旋转的情况,如果可以保证图片旋转角度和 lcd 旋转角度一样的话,这两个函数可以不实现。
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#### 1.可识别手指类型
|
||||
|
||||
```h
|
||||
```c
|
||||
/**
|
||||
* @method multi_gesture_gesture_touch_fingers_destroy
|
||||
* 释放可识别手指类型的对象
|
||||
@ -54,7 +54,7 @@ ret_t multi_gesture_post_event_from_fingers(main_loop_t* loop, multi_gesture_tou
|
||||
|
||||
#### 2.不可识别手指类型
|
||||
|
||||
```h
|
||||
```c
|
||||
/**
|
||||
* @method multi_gesture_gesture_touch_points_destroy
|
||||
* 释放不可识别手指类型的对象
|
||||
|
@ -63,7 +63,7 @@
|
||||
|
||||
### 3.1 UI 文件
|
||||
|
||||
```xml<window>
|
||||
```xml
|
||||
<window>
|
||||
<view style="image_packed" x="c" y="m" w="320" h="216" children_layout="default(r=4,c=3)">
|
||||
<button style="num_1"/>
|
||||
|
@ -7,7 +7,7 @@
|
||||
|
||||
开启该功能,需要定义 HAS_STB_YUV_TO_RGB_G2D 宏,然后需要实现 stbi__YCbCr_to_RGB_g2d 函数,该函数是给用户在外部写硬件转换的代码,可选定义的宏是 STB_YUV_DATA_PIXEL_BTYE,该宏是用于定义 yuv 的数据流的字节数,默认为 4 字节(32 位对齐)。
|
||||
|
||||
~~~c
|
||||
```c
|
||||
/**
|
||||
* @method stbi__YCbCr_to_RGB_g2d
|
||||
* stb 外部的硬件 YUV 转换 RGB
|
||||
@ -24,5 +24,4 @@
|
||||
* @return {ret_t} 返回RET_OK表示成功,否则表示失败。
|
||||
*/
|
||||
int stbi__YCbCr_to_RGB_g2d(unsigned char* out_data, int out_data_size, unsigned char* yuv_data, int yuv_data_size, int w, int h, int* out_channel_order);
|
||||
~~~
|
||||
|
||||
```
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
对话框有模态和非模态两种,具体用法如下:
|
||||
|
||||
## 非模态对话框
|
||||
## 一、非模态对话框
|
||||
|
||||
非模态对话框的使用方法与普通窗口完全一样,只是对话框的大小和位置可以改变。通常情况下,尽量使用非模态对话框。
|
||||
|
||||
@ -33,7 +33,7 @@ static ret_t on_open_dialog(void* ctx, event_t* e) {
|
||||
}
|
||||
```
|
||||
|
||||
## 模态对话框
|
||||
## 二、模态对话框
|
||||
|
||||
对于模态对话框,需要调用函数 dialog\_modal 等待对话框退出,dialog\_modal 函数会阻塞直到 dialog\_quit 被调用。
|
||||
|
||||
|
@ -110,7 +110,7 @@ static ret_t lcd_mem_fragment_flush(lcd_t* lcd) {
|
||||
}
|
||||
```
|
||||
|
||||
### 3 基于 framebuffer 实现的 LCD
|
||||
### 3. 基于 framebuffer 实现的 LCD
|
||||
|
||||
#### 3.1 介绍
|
||||
|
||||
@ -179,12 +179,12 @@ lcd_t* stm32f767_create_lcd(wh_t w, wh_t h) {
|
||||
|
||||
此时可以使用 lcd\_mem\_special。在 flush 函数中把数据转成目标格式,或者提交到 SPI 屏。具体实现可以参考:https://github.com/zlgopen/awtk-linux-fb/blob/master/awtk-port/lcd_mem_others.c
|
||||
|
||||
### 四、基于 vgcanvas 实现的 LCD
|
||||
### 4. 基于 vgcanvas 实现的 LCD
|
||||
|
||||
在支持 OpenGL 3D 硬件加速的平台上(如 PC 和手机),我们使用 nanovg 把 OpenGL 封装成 vgcanvas 的接口,在 vgcanvas 基础之上实现 LCD。lcd\_vgcanvas.inc 将 vgcanvas 封装成 LCD 的接口,这里出于可移植性考虑,并没有直接基于 nanovg 的函数,而是基于 vgcanvas 的接口,所以在没有 GPU 时,如果 CPU 够强大,也是可以基于 agg/picasso 去实现的 LCD。
|
||||
|
||||
> 这种方式实现,一般不会在嵌入平台上使用,读者不需要关注它。
|
||||
|
||||
### 总结
|
||||
### 5. 总结
|
||||
|
||||
以上几种实现方式,基本上涵盖了最常用的场景,所以在移植 AWTK 到新的平台时,并不需要在实现 LCD 接口上费多少功夫。
|
||||
|
@ -14,7 +14,7 @@ freetype 解析矢量字体的过程是将字形关键点按照规则连线变
|
||||
|
||||
## 二、针对 freetype 缺陷所做优化
|
||||
|
||||
### 3.1 提高 freetype 解析字体的精度
|
||||
### 2.1 提高 freetype 解析字体的精度
|
||||
|
||||
虽然 freetype 解析字体时精度丢失无法避免,但提高运算精度依然可以优化显示效果。
|
||||
|
||||
@ -27,7 +27,7 @@ uint32_t flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER | FT_LOAD_NO_AUTOHINT | FT_OUT
|
||||
...
|
||||
```
|
||||
|
||||
### 3.2 关闭 auto\_hint
|
||||
### 2.2 关闭 auto\_hint
|
||||
|
||||
要了解 auto\_hint 首先需要知道什么是 hinting 。
|
||||
|
||||
@ -45,4 +45,3 @@ hinting 用来优化字体显示的方法。由于屏幕像素有限,矢量字
|
||||
uint32_t flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER | FT_LOAD_NO_AUTOHINT | FT_OUTLINE_HIGH_PRECISION;
|
||||
...
|
||||
```
|
||||
|
||||
|
@ -429,7 +429,7 @@ struct _widget_t {
|
||||
char* state;
|
||||
/**
|
||||
* @property {uint8_t} opacity
|
||||
* @annotation ["readable"]
|
||||
* @annotation ["set_prop","get_prop","readable","persitent","design","scriptable"]
|
||||
* 不透明度(0-255),0完全透明,255完全不透明。
|
||||
*/
|
||||
uint8_t opacity;
|
||||
|
@ -2,9 +2,8 @@
|
||||
|
||||
如果需要修改应用程序的图标,有两种方法:
|
||||
|
||||
* 1. 用 VC 创建的 .res 文件代替 awtk.res,
|
||||
|
||||
* 2. 用 [ResEdit](http://rsdt.free.fr/ResEdit-x64.7z) 直接编辑 awtk.res 文件。
|
||||
1. 用 VC 创建的 .res 文件代替 awtk.res,
|
||||
2. 用 [ResEdit](http://rsdt.free.fr/ResEdit-x64.7z) 直接编辑 awtk.res 文件。
|
||||
|
||||
兼容 mingw 的话:
|
||||
|
||||
@ -12,9 +11,6 @@
|
||||
2. 注释 rc 文件中的 #include "targetver.h" 代码
|
||||
3. windres 工具重新导出 res 文件。(windres 是 mingw 提供的 exe)
|
||||
|
||||
~~~cmd
|
||||
```bash
|
||||
windres awtk.rc -O coff awtk.res
|
||||
~~~
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
Loading…
x
Reference in New Issue
Block a user