几天前,我下载了SumatraPDF的源代码,并开始探索它。我发现库MuPDFс支持有趣的函数,但不理解它。
static inline int fz_mul255(int a, int b) {
int x = a * b + 128;
x += x >> 8;
return x >> 8;
}在其他一些来源中,我找到了mul255函数的另一个定义:
(a+1)*b >> 8那是什么?帮助。
发布于 2014-07-03 23:15:22
如果不是第二行(x += x >> 8),我就会确切地知道这个方法是做什么的。如果我们删除它,为了讨论的目的:
static inline int fz_mul255(int a, int b) {
int x = a * b + 128;
// x += x >> 8;
return x >> 8;
}该方法现在是a* b的倍数,a*b是不动点数,有8个小数位,舍入到最近的结果。具体来说,a * b是倍数,+ 128循环是最近的(请记住,这会被移出,所以只有当它导致进位到第7位之后的下一个最重要的位位置时才有效果),并且>> 8校正了点的位置(因为使用整数算术将两个不动点值与8个小数位相乘会产生一个固定点值和16个小数位)。
唯一的问题是“x += x >> 8”是为了什么,恐怕我现在知道了。实际上,它将结果乘以(1 + 1/256)。
发布于 2014-07-10 13:35:23
在图形中,我们通常使用缩放整数值(范围0到255)来表示在0.0到1.0范围内的颜色值。
mul255函数将两个这样的缩放整数相乘,使255 * 255 = 255。
在MuPDF中的实现是基于Jim的精确缩放方法,该方法来自Jim的“脏像素”一书。引用(a+1)*b >> 8的另一个实现是一个更快但不太准确的近似。
https://stackoverflow.com/questions/24563434
复制相似问题