|
//定义SinCos函数: 同时计算sin(Angle)和cos(Angle)的内嵌x86汇编函数
void __declspec(naked) __stdcall SinCos(const double Angle,double& sina,double& cosa) { asm { fld qword ptr [esp+4]//Angle mov eax,[esp+12]//&sina mov edx,[esp+16]//&cosa fsincos fstp qword ptr [edx] fstp qword ptr [eax] ret 16 } } |
3.用定点数代替浮点计算
void PicRotary2(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 tmprZoomXY=1.0/(ZoomX*ZoomY); double rZoomX=tmprZoomXY*ZoomY; double rZoomY=tmprZoomXY*ZoomX; double sinA,cosA; SinCos(RotaryAngle,sinA,cosA); long Ax_16=(long)(rZoomX*cosA*(1<<16)); long Ay_16=(long)(rZoomX*sinA*(1<<16)); long Bx_16=(long)(-rZoomY*sinA*(1<<16)); long By_16=(long)(rZoomY*cosA*(1<<16)); double rx0=Src.width*0.5; //(rx0,ry0)为旋转中心 double ry0=Src.height*0.5; long Cx_16=(long)((-(rx0+move_x)*rZoomX*cosA+(ry0+move_y)*rZoomY*sinA+rx0)*(1<<16)); long Cy_16=(long)((-(rx0+move_x)*rZoomX*sinA-(ry0+move_y)*rZoomY*cosA+ry0)*(1<<16));
TARGB32* pDstLine=Dst.pdata; long srcx0_16=(Cx_16); long srcy0_16=(Cy_16); for (long y=0;y { long srcx_16=srcx0_16; long srcy_16=srcy0_16; for (long x=0;x { long srcx=(srcx_16>>16); long srcy=(srcy_16>>16); if (PixelsIsInPic(Src,srcx,srcy)) pDstLine[x]=Pixels(Src,srcx,srcy); srcx_16+=Ax_16; srcy_16+=Ay_16; } srcx0_16+=Bx_16; srcy0_16+=By_16; ((TUInt8*&)pDstLine)+=Dst.byte_width; } }
|
////////////////////////////////////////////////////////////////////////////////
//速度测试:
//==============================================================================
// PicRotary2 84.4 fps
////////////////////////////////////////////////////////////////////////////////
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页
 【责编:Kittoy】
|