update docs

This commit is contained in:
lixianjing 2022-07-05 17:10:18 +08:00
parent be72b75ae4
commit 9d9f67dc47
23 changed files with 105 additions and 106 deletions

View File

@ -6,7 +6,9 @@ AWTK 应用程序通常是一个单体的应用程序,里面所有的窗口都
## 1. 使用方法
### 1.1 设置小应用程序 (applet) 资源所在的根目录(所有的小应用程序 (applet) 的资源都安装到该目录下)。
### 1.1 设置小应用程序 (applet) 资源所在的根目录
**所有的小应用程序 (applet) 的资源都安装到该目录下。**
```c
/**

View File

@ -235,8 +235,6 @@ usesSdk 是可选的表示项目依赖的SDK的信息。
> 使用 scons 进行编译时,可以通过 AWTK_ROOT 参数手动设置 AWTK 的路径,比如:
```cmd
```bash
scons AWTK_ROOT=c:/AWTK/SDK/awtk
```

View File

@ -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 下载。

View File

@ -1,6 +1,7 @@
# 最新动态
2022/07/05
* 完善文档(感谢雨欣提供补丁)
* 支持独立可以安装的applet让它们具有独立的资源目录。
* 增加文档[支持可独立安装的小应用程序 (applet)](applet.md)

View File

@ -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 格式
* 打开

View File

@ -4,7 +4,7 @@
## 一、输入设备相关问题
### 1. 指针设备问题的检查列表:
### 1.1 指针设备问题的检查列表:
* 设备名称是否正确。
* 电阻屏是否校准。
@ -12,7 +12,7 @@
## 二、显示相关问题
### 1. 图片颜色不正常的检查列表:
### 2.1 图片颜色不正常的检查列表:
* LCD 的格式是否正确。
* 图片格式是否正确。

View File

@ -8,7 +8,7 @@
* 长时间运行进行压力测试。
* 辅助手工测试。有时出现崩溃的 BUG 时,往往忘记之前是如何操作的了,输入事件记录与重放可以精确重现问题。同时也可以减轻手工测试的工作量。
## 2.API
## 2. API
```c
/**

View File

@ -1,6 +1,6 @@
## FrameBuffer 的几种使用方式
### 一、单 framebuffer
### 一、单 framebuffer
系统中只有一个 framebufferLCD 使用该 framebuffer 进行显示GUI 使用该 framebuffer 进行绘制。
@ -16,7 +16,9 @@
> 如果硬件能够解决动画颜色不正常的问题或者不需要动画,这种方式是最好的选择。
### 二、双 framebuffer一个 online 一个 offline轮流切换显示。
### 二、双 framebufferSwap
系统有两个 framebuffer一个 online 一个 offline轮流切换显示
* 1.GUI 在 offline 的 framebuffer 上绘制。
* 2.LCD 显示 online 的 framebuffer。
@ -32,7 +34,9 @@
* GUI 每次都需要进行完整的绘制,不能只绘制变化的部分。
### 三、双 framebuffer一个固定 online 供 LCD 显示,一个固定 offline 供 GUI 绘制。
### 三、双 framebufferFlush
系统有两个 framebuffer一个固定 online 供 LCD 显示,一个固定 offline 供 GUI 绘制。
![3](images/fb3.png)
@ -44,7 +48,9 @@
* 窗口动画时,可能整个屏幕都在变化,所以拷贝的量比较大。优化方法:对于平移的动画,可以让 GUI 直接往 online 的 framebuffer 上绘制,减少一次内存拷贝,而且不会出现闪烁。
### 四、三个 framebuffer一个 online 供 LCD 显示,一个 offline 供 GUI 绘制,一个为下一个要显示的 framebuffer。
### 四、三个 framebuffer
系统有三个 framebuffer一个 online 供 LCD 显示,一个 offline 供 GUI 绘制,一个为下一个要显示的 framebuffer。
![4](images/fb4.png)

View File

@ -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 目录。

View File

@ -59,7 +59,7 @@ cksum(binary) => uint16_t
cksum("hello")
```
### 4. 更多示例
### 更多示例
```js
//test string

View File

@ -1,6 +1,6 @@
# fscript 内存需求评估
## 一、测试环境
## 1. 测试环境
测试使用的 AWTK 版本AWTKv1.7SHA-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 脚本所需的堆栈空间,步骤如下:

View File

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

View File

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

View File

@ -49,7 +49,7 @@
2. styles/default
### 3. 高级用法
## 3. 高级用法
在上面的用法中,所有的下拉选择框,使用相同的样式。在特殊情况下,可能需要为不同的下拉选择框指定不同的样式。此时可以使用下拉选择框的 theme\_of\_popup 属性,为其指定特别样式文件。如:

View File

@ -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_tlcd_t 和 graphic_buffer_t 类型是分为有**逻辑数据**和**真实的物理数据**的,所有的真实的物理数据只能通过接口获取,一般名称都会带有 **“physical”** 的字眼。
4. 在使用的时候,需要特别注意 bitmap_tlcd_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->wbitmap->h 和 bitmap->line_length 都为逻辑数据,逻辑数据则为图片原来未旋转时的数据,下列是获取位图的真实物理数据的接口:
已旋转的贴图的旋转角度一般和 lcd 旋转的角度一致,为了高效贴图而不需要旋转贴图,以及以前的 bitmap->wbitmap->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 旋转角度一样的话,这两个函数可以不实现。

View File

@ -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
* 释放不可识别手指类型的对象

View File

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

View File

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

View File

@ -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 被调用。

View File

@ -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 接口上费多少功夫。

View File

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

View File

@ -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)0255
*/
uint8_t opacity;

View File

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