|
优化后的函数为:
|
void PicRotary1(const TPicRegion& Dst,const TPicRegion& Src,double RotaryAngle,double ZoomX,double ZoomY,double move_x,double move_y) { if ( (fabs(ZoomX*Src.width)<1.0e-4) || (fabs(ZoomY*Src.height)<1.0e-4) ) return; //太小的缩放比例认为已经不可见 double rZoomX=1.0/ZoomX; double rZoomY=1.0/ZoomY; double sinA=sin(RotaryAngle); double cosA=cos(RotaryAngle); double Ax=(rZoomX*cosA); double Ay=(rZoomX*sinA); double Bx=(-rZoomY*sinA); double By=(rZoomY*cosA); double rx0=Src.width*0.5; //(rx0,ry0)为旋转中心 double ry0=Src.height*0.5; double Cx=(-(rx0+move_x)*rZoomX*cosA+(ry0+move_y)*rZoomY*sinA+rx0); double Cy=(-(rx0+move_x)*rZoomX*sinA-(ry0+move_y)*rZoomY*cosA+ry0);
TARGB32* pDstLine=Dst.pdata; double srcx0_f=(Cx); double srcy0_f=(Cy); for (long y=0;y { double srcx_f=srcx0_f; double srcy_f=srcy0_f; for (long x=0;x { long srcx=(long)(srcx_f); long srcy=(long)(srcy_f); if (PixelsIsInPic(Src,srcx,srcy)) pDstLine[x]=Pixels(Src,srcx,srcy); srcx_f+=Ax; srcy_f+=Ay; } srcx0_f+=Bx; srcy0_f+=By; ((TUInt8*&)pDstLine)+=Dst.byte_width; } } |
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicRotary1 20.3 fps
////////////////////////////////////////////////////////////////////////////////
D:更深入的优化、定点数优化
(浮点数到整数的转化也是应该优化的一个地方,这里不再处理,可以参见《图形图像处理-之-高质量的快速的图像缩放 上篇 近邻取样插值和其速度优化》中的PicZoom3_float函数)
1.优化除法:
原: double rZoomX=1.0/ZoomX;
double rZoomY=1.0/ZoomY;
改写为(优化掉了一次除法):
double tmprZoomXY=1.0/(ZoomX*ZoomY);
double rZoomX=tmprZoomXY*ZoomY;
double rZoomY=tmprZoomXY*ZoomX;
2.x86的浮点计算单元(FPU)有一条指令"fsincos"可以同时计算出sin和cos值
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
 【责编:Kittoy】
|