情况一:
在该函数出现无限循环在如下两句代码:
while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len)
{
sx = (lp.x1 + sx) >> 1;
sy = (lp.y1 + sy) >> 1;
}
断点调试的时候,出现无限循环的结果是因为取值出现如下的问题:
sx=0x3d00
lp.x1=0x3d01
sy=0x7a00
lp.y1=0x7a01
lp2.len=1
在这种情况下,sx和sy的值永远不变,并且循环的条件永远成立(while(2>1).
尝试修改如下:
sx = lp.x1 + ((sx - lp.x1) >> 1);
sy = lp.y1 + ((sy - lp.y1) >> 1);
修改的目的只是最终跳出循环。并没有了解代码的逻辑。
情况二:
还有如下的代码也会出现无限循环:
while(abs(ex - lp.x2) + abs(ey - lp.y2) >
lp2.len)
{
/* original
ex = (lp.x2 + ex) >> 1;
ey = (lp.y2 + ey) >> 1;
*/
ex = lp.x2 + ((ex - lp.x2 ) >> 1);
ey = lp.y2 + ((ey - lp.y2 ) >> 1);
}
情况三:
agg_renderer_outline_aa文件1801行 (clipbox enabled):
while(abs(sx - lp.x1) + abs(sy - lp.y1) >lp2.len)
{
sx = (lp.x1 + sx) >> 1;
sy = (lp.y1 + sy) >> 1;
}
sx = 365433
sy = -512
lp.x1 = 365434
lp.y1 = -511
sx/sy永远保持相同的值: (-511 + -512 ) >> 1 =-512;
修改如下:
while(abs(sx - lp.x1) + abs(sy - lp.y1) > (lp2.len +1) )
{
...
}
lp2.len加1。
it is very pleasure to offer me point
摘自:
http://vector-agg-general.narkive.com/Zl9USSxj/renderer-outline-aa-line3-infinite-loop-and-fix
http://vector-agg-general.narkive.com/pJq7asry/infinite-loop-in-renderer-outline-aa