关于muPDF库API文档中矩阵变换顺序的疑问
问题解答:muPDF pre系列矩阵变换的顺序逻辑
首先明确两个核心点:C语言嵌套函数的执行顺序,以及muPDF pre_*函数的定义。
1. C语言嵌套函数的执行顺序
对于fn3(fn2(fn1(x)))这类嵌套调用,确实是从内到外执行:先调用fn1(x),再将其结果传入fn2,最后将fn2的结果传入fn3。对应到你的代码:
ctm = fz_pre_translate(fz_pre_rotate(fz_scale(sx, sy), r), tx, ty);
执行顺序是:
- 第一步:调用
fz_scale(sx, sy)生成缩放矩阵 - 第二步:将缩放矩阵传入
fz_pre_rotate生成新矩阵 - 第三步:将第二步的矩阵传入
fz_pre_translate得到最终CTM
2. muPDF pre_*函数的核心定义
根据muPDF API文档,pre_*系列函数的关键是将新变换操作应用于现有矩阵所代表的变换链的最前面——也就是先执行新操作,再执行之前所有已定义的变换。
用数学变换复合的逻辑解释(A∘B表示先执行B,再执行A):
- 调用
fz_pre_rotate(S, r)(S是缩放矩阵):生成的矩阵是S∘R,对应变换顺序为「先旋转(R),再缩放(S)」 - 再调用
fz_pre_translate(S∘R, tx, ty):生成的矩阵是(S∘R)∘T,对应变换顺序为「先平移(T),再旋转(R),最后缩放(S)」
最终结论
这段代码构建的矩阵变换顺序是:平移 → 旋转 → 缩放,和C语言嵌套函数的执行顺序(缩放→旋转→平移)完全相反,核心原因是pre_*函数会把新变换插入到现有变换链的最前端,而非追加到末尾。
内容的提问来源于stack exchange,提问作者George Robinson
相关产品推荐
相关产品推荐

