feat(gnome.pango*): 文本排版那条线接上了 —— 三个成员,各带模块 - #325
Merged
Conversation
§19.7 说 pango 被 gio 挡住。gio 到位(#322),闸门就开了:PangoFontMap 声明 G_IMPLEMENT_INTERFACE(G_TYPE_LIST_MODEL, …),没有 gio 它连注册都做不到。测试在 **运行期**断言这一点,而不是拿构建通过当证据。 gnome.pango 分项、bidi、断行、markup 851 个模块导出 gnome.pangoft2 fontconfig 选文件,FreeType 出字形 88 gnome.pangocairo cairo 后端 284 判据仍是生成器不是行数。pango 有三个,fork 再加一个(模块包装体),树里没有 sh 也没有 python。⚠️ config.h 是特殊的:上游 configure_file 没有 input 模板,meson 按 key 逐条发 #define,树里没有可替换的东西。文件必须写出来,每个值都是决定。两个是算术 —— PANGO_BINARY_AGE = minor*100+micro、PANGO_INTERFACE_AGE = minor 奇数 ? 0 : micro —— 而 pango_version_check 读第一个,写错不会构建失败,只会让一次正确的版本比较 给出错误答案。 ⭐ 唯一一个产出像素的测试:pangocairo 把 "Hello 世界" 画到 ARGB32 surface,数非 透明像素 —— 1,492 个。走到那一步要七个包,空白图片意味着其中之一没干活。它诚实 地降级:runner 没有字体时那条断言不跑,而且**说出来**,因为「0 个字体族所以没跑」 和「文字画出来了」不能长得一样。⚠️ 本 fork 踩到的一次静默降级:HAVE_CAIRO_FREETYPE 被编辑失误弄丢,什么都没有构建 失败,pangocairo 只是一个后端都没注册,运行期死于空的 "Available backends are:" 然后段错误。测试现在读 font map 的字体类型并要求 CAIRO_FONT_TYPE_FT。⚠️ 待办:freedesktop.cairo 的模块自己不够用 —— 1.18.2 实测 470 个名字、零个枚举 量、没有 cairo_t。索引自己的 cairo 示例没发现,因为它同时写了 #include <cairo.h> 和 import,头文件补上了模块缺的那半;也就是说那个 import 从没被单独检验过。 pangocairo 不能混用两条路,所以自己扫了 cairo.h;cairo 修好后可以去掉。 消费者点名 gnome.pangocairo 一个就够:另外两个是它的 workspace path 依赖。 本地:三个示例 × 两条路线 × 两条工具链全绿;fork CI 三个 job 全绿。
渲染检查原来写的是 `drawn > 100`。在我这台 184 个字体族的机器上得到 216 像素、 通过;在只有 4 个字体族的 CI runner 上得到 72 像素、失败 —— 几乎没有字体时 「世界」渲染成豆腐块,墨迹更薄。 那让它变成了对**机器**的断言而不是对这次构建的断言,正是周围注释一直在警告的那 类错误:gnome.gio 的 xdgmime 检查刻意不断言具体 MIME,理由完全相同。 墨迹就是墨迹:任何正数都证明七个包把像素放下去了。 tarball 重切:sha256 → 9be92e7f…,CN 容器 tag → 1.56.1-2。
在只有 4 个字体族的 CI runner 上,模块路线的测试画出 0 个像素,而头文件路线的 测试画出 116 —— 同一台机器、同一批字体、逐字节相同的绘制代码。唯一的差别是 pango_font_map_list_families 调用的位置:一个在绘制前,一个在绘制后。 现在两者位置相同,并且都把计数打印出来,于是两个测试可以互相对照,而不是各自 说一句 ok。**两个测同一件事的测试,如果在无关的地方不一致,就不是两个测试。** tarball 重切:sha256 → d520087d…,CN 容器 tag → 1.56.1-3。
`families > 0` 看着够用,其实不够,花了两轮 CI 才看清。同一个 CI runner 报告 四个字体族,然后把同一个 layout 量成 80x858545(一个进程)和 80x346398(另一 个)—— 在 100px surface 上都是荒谬的高度,因为那里的「四个字体族」是 fontconfig 有条目而背后没有可用字体。字形落到 surface 之外,墨迹数变成任意的:两个逐字节 相同绘制代码的孪生测试,一个 0 一个 116。 上一轮的修法(ink > 0 而不是 > 100)是必要但不充分的,底层原因相同:两者都在 **推断**机器的适用性,而不是**检验**它。 闸门现在是 w > 0 && h > 0 && h <= 100,不满足时运行会说出来 —— 「这条检查被跳 过了」和「文字画出来了」不能长得一样。两个测试现在都打印 layout 尺寸和字体族数, 于是孪生测试可以互相对照。 tarball 重切:sha256 → b470a658…,CN 容器 tag → 1.56.1-4。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
gio 到位,闸门就开了
§19.7说 pango 被 gio 挡住 —— 那条判断在 #322 里被推翻并修正。现在:PangoFontMap声明G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, …),没有 gio 它连注册都做不到。 测试在运行期断言g_type_is_a(pango_font_map_get_type(), g_list_model_get_type()),而不是拿「构建通过」当证据。gnome.pangognome.pangoft2gnome.pangocairopango_cairo_show_layout⭐ 唯一一个产出像素的测试
pangocairo把"Hello 世界"画到 ARGB32 surface 上,数非透明像素:1,492。走到那一步要七个包:空白图片意味着其中之一没干活。
freedesktop.fontconfig故意把运行期路径编译成空,所以没有字体的 runner 合法地得到 0 个字体族 —— 那条断言就不跑,并且说出来。「0 个字体族所以没跑」和「文字画出来了」不能长得一样。上游写的是
configure_file(output: 'config.h', configuration: pango_conf),没有input:—— meson 按 key 逐条发#define,树里根本没有可替换的模板。文件必须写出来,每个值都是本包的决定。两个是算术:pango_version_check()读第一个,所以写错不会构建失败,只会让一次正确的版本比较给出错误答案。测试两个方向都断言。HAVE_CAIRO_FREETYPE被一次编辑失误弄丢。什么都没有构建失败。pangocairo-fontmap.c只是一个后端都没注册:然后段错误。测试现在读 font map 的字体类型并要求
CAIRO_FONT_TYPE_FT。freedesktop.cairo的模块自己不够用1.18.2 实测:470 个名字、零个枚举量(没有
CAIRO_FORMAT_ARGB32、没有CAIRO_FONT_TYPE_FT)、没有cairo_t。索引自己的 cairo 示例没发现,因为它同时写了
#include <cairo.h>和import freedesktop.cairo;—— 头文件补上了模块缺的那半。也就是说那个import从来没有被单独检验过。pangocairo 不能混用两条路(
pangocairo.h经 glib 到<stdio.h>,混用让struct _IO_FILE变成两个实体),所以gnome.pangocairo自己扫了cairo.h。从两个模块导出同一实体是无害的,所以这是追加而非冲突 —— cairo 修好后那行可以去掉。两条消费路线,各带测试
两条不能混用。选哪条由宏决定:模块带不了宏,用
PANGO_TYPE_*/G_OBJECT的走头文件,用函数 API 的走模块。每个成员各带两个测试。依赖形态
点名
gnome.pangocairo一个就够 —— 另外两个是它的 workspace path 依赖,再点名会得到requested as both a version dep and a path dep。那条错误就是这个 fork 第一次构建时学到的。验证
upstream/未改文本排版那条线接上了。