LCUI 1.0 Alpha 2 开发日志

2017年04月30日  ·  2708 字  ·  阅读

2017-07-09

测试各个级别的缩放时,TextView 内的文本位置会有偏移,经过调试后发现,它的最大尺寸和固定尺寸在缩放比例变化后一直没有更新,看样子需要加一个回调函数,让 TextView 在样式刷新后刷新当前缓存的文本尺寸相关数据。

2017-07-02

测试编译 UWP 版的 LCUI,在链接时出现错误:

ccorlibd.lib(init.obj) : error LNK2038: 检测到“vccorlib_lib_should_be_specified_before_msvcrt_lib_to_linker”的不匹配项: 值“1”不匹配值“0”(MSVCRTD.lib(app_appinit.obj) 中)

看字面意思是说 vccorlib.lib 应该在 msvcrt.lib 之前链接,解决方法是在链接器设置忽略这两个默认库,然后在附加依赖项里添加 vccorlib.lib;msvcrt.lib,手动调整链接顺序。

已经添加 UWP 版的支持代码,UWP 版的 helloworld 的实现代码在这里,效果如下:

2017-06-25

设置缩放比例后,部件重绘会有残留内容,看上去是因为计算出来的无效区域与部件实际区域不一致而导致的。

2017-06-10

已经解决了所有内存泄漏问题,本地用 valgrind 检测的结果是 0 个错误,然而 Travis-CI 上的 valgrind 却检测到了 144 个错误。

主要错误出在 malloc()、wcslen()、inflateReset2() 这三个函数调用上。

==9844== Conditional jump or move depends on uninitialised value(s)
==9844==    at 0x69354E0: inflateReset2 (in /lib/x86_64-linux-gnu/libz.so.1.2.3.4)
...
==9844== Invalid read of size 8
==9844==    at 0x56646DF: wcslen (wcslen.S:48)
...
==9844==  Address 0x72e6da0 is 48 bytes inside a block of size 52 alloc'd
==9844==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
...

奇怪的是 wcslen() 都会出现错误,而测试时发现字符串内容却是正常的。花了一些时间搜索相关资料,最后找到了这个 wchar_t valgrind issue - Invalid read of size 8,据说是 wcslen() 使用了 SSE 指令去判断字符串中的结束符,然而 valgrind 认为这是未初始化的读取,升级 valgrind 可以解决这个问题。

Travis-CI 上安装的 valgrind 是 3.7.0 版本,最新版是 3.12.0,而包管理器默认用的是 Precise 版的源,参考 Travis-CI 的文档添加了 Zesty 版的源,然而在安装依赖包时报错:dpkg: error: configuration error: /etc/dpkg/dpkg.cfg.d/multiarch:1: unknown option 'foreign-architecture'。最后看到了这篇文档 The Trusty beta Build Environment,可以通过添加 dist: trusty 配置项来使用 Trusty 版的源,Trusty 源里的 valgrind 版本是 3.10,可以试试。更新 .travis.yml 配置文件后问题解决。

2017-06-08

完善了一些测试用例,以后改完代码再跑一次测试就能够知道有没有出现新问题。准备再加上内存泄漏检测支持,方便解决潜在的内存泄漏问题。

2017-05-20

关于部件的尺寸计算问题,当父部件定位绝对且宽度为自适应时,父部件和子部件的宽度该如何计算?在浏览器中,父元素的宽度为最宽的子元素的宽度,即使子元素宽度设置为 50%,计算出来的父元素宽度也是 100% 的宽度。LCUI 要实现这个效果的话,需要保存各个部件的原始宽度,计算父元素宽度时则按子元素的原始宽度来算。看上去实现起来很麻烦,也没多大用处,谁会在绝对定位的元素中将它的子元素宽度设为百分比单位?所以,在 LCUI 中计算这种子部件的宽度时就直接给 0。

2017-05-13

部件的边框、阴影和背景已经做了调整,部件的实际区域可以在绘制时计算,不用缓存。

感觉用 left、top、right、bottom 表示矩形更好些,矩形溢出判断和裁剪操作可以省去 x + width 这样的加法运算。

在设置全局缩放比例后,获取到的屏幕尺寸需要除以缩放比例,鼠标坐标也需要做转换,底层的接口获取到的屏幕尺寸和鼠标坐标保持不变,仅在部件层做转换。

文字的行高需要统一像素值,但 TextLayer 支持设置部分文字的大小,行高固定的话会影响文字显示效果,要么撤销文字大小设置功能?

2017-05-09

Widget_InvalidateArea() 看上去可以移除了,没必要让每个部件记录自己的脏矩形,都改用 Widget_PushInvalidArea(),将所有脏矩形都集中放到一个地方,这样一来可以删掉一些代码。

2017-05-07

实际值(Actual values)用于最终渲染,主要包括坐标、尺寸、边框、阴影、背景等的值,且都为整数。搞那么多样式,最终的计算结果也就这么几个值。

目前需要解决的问题是边框、阴影、背景的实际值的存放位置,有两个可选方案:

  • 现有的结构体。例如背景的结构体是 LCUI_Background,再为它加个 actual 成员来存放计算后的实际值,绘制背景时直接根据 actual 成员里的值进行绘制。这样做的好处是只需要一个结构体,不会有重复的属性,节省内存占用;但坏处是 draw/background.c 会依赖 gui/metrics.c 的实际值计算接口,增加了耦合度。
  • 独立的结构体。同样以背景的结构体为例,要么新建个 LCUI_ActualBackground 结构体,要么将现有的 LCUI_Background 重命名为 LCUI_BackgroundStyle,然后新建个 LCUI_Background 结构体,并将它作为 background.c 实际使用的值。LCUI_Background 由 LCUI_BackgroundStyle 计算而来,计算在 widget_background.c 中进行。

2017-04-30

新开了一篇文章来记录 1.0 alpha 2 版本的开发日志,以后版本需要更新频繁点,每个版本修复几个 BUG 再添加几个新功能就差不多了。

文章版权归作者所有,未经许可不得转载。

问题反馈

对此文章有疑问?你可以点击 这里 反馈