Diffstat (limited to 'inputmethods/dasher/DasherViewSquare.inl') (more/less context) (ignore whitespace changes)
-rw-r--r-- | inputmethods/dasher/DasherViewSquare.inl | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/inputmethods/dasher/DasherViewSquare.inl b/inputmethods/dasher/DasherViewSquare.inl new file mode 100644 index 0000000..c22c32c --- a/dev/null +++ b/inputmethods/dasher/DasherViewSquare.inl @@ -0,0 +1,142 @@ +// DasherViewSquare.inl +// +///////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2001-2002 David Ward +// +///////////////////////////////////////////////////////////////////////////// + +namespace Dasher { + +inline const void CDasherViewSquare::screen2dasher(int *mousex, int *mousey) +{ + int dashery=*mousey; + + double x=1.0*(CanvasX-*mousex)/CanvasX; + dashery*=DasherModel().DasherY(); + dashery/=CanvasY; + + if (DasherModel().Dimensions()==false) { + if (dashery>m_Y2) + dashery= (dashery-m_Y2)*m_Y1 + m_Y2; + else if (dashery<m_Y3) + dashery= (dashery-m_Y3)*m_Y1+m_Y3; + } + + x=ixmap(x)*DasherModel().DasherY(); + + if (DasherModel().Dimensions()==true) { + double distx, disty; + + distx=2048-x; + disty=DasherModel().DasherY()/2-dashery; + + if (disty>1500) { + dashery=548+(548-dashery); + disty=1298-dashery; + if(disty<-750) { + x=2048; + dashery=2048; + } else { + x=2048+pow(pow(750,2)-pow(disty,2),0.5)*10; + } + *mousex=int(x); + *mousey=dashery; + return; + } + else if (disty <-1500) { + dashery=3548+(3548-dashery); + disty=2798-dashery; + if(disty>750) { + x=2048; + dashery=2048; + } else { + x=2048+pow(pow(750,2)-pow(disty,2),0.5)*10; + } + *mousex=int(x); + *mousey=dashery; + return; + } else { + x=pow(pow(1500,2)-pow(disty,2),0.5); + } + x=2048-x; + } + *mousex=int(x); + *mousey=dashery; +} + +inline const int CDasherViewSquare::dasherx2screen(const myint sx) +{ + double x=1.0*sx/(DasherModel().DasherY()); + x=xmap(x); +// return CanvasX-int(x*CanvasY); + return CanvasX-int(x*CanvasX); + +} + + +inline const int CDasherViewSquare::dashery2screen(myint y) +{ + if (y > m_Y2 ) + y= m_Y2 + (y-m_Y2)/m_Y1; + else if (y<m_Y3) + y= m_Y3+ (y-m_Y3 )/m_Y1; + +// y*=CanvasY*Screen().GetFontSize(); + y*=CanvasY; + y/=DasherModel().DasherY(); +// y-=(CanvasY*Screen().GetFontSize()-CanvasY)/2; + return int(y); +} + + +inline void CDasherViewSquare::Crosshair(myint sx) +{ + CDasherScreen::point crosshair[2]; + + crosshair[0].x = dasherx2screen(sx); + crosshair[0].y = 0; + crosshair[1].x = crosshair[0].x; + crosshair[1].y = CanvasY; + + MapScreen(&crosshair[0].x, &crosshair[0].y); + MapScreen(&crosshair[1].x, &crosshair[1].y); + Screen().Polyline(crosshair,2); + + crosshair[0].x = dasherx2screen(12*sx/14); + crosshair[0].y = CanvasY/2; + crosshair[1].x = dasherx2screen(17*sx/14); + crosshair[1].y = CanvasY/2; + + MapScreen(&crosshair[0].x, &crosshair[0].y); + MapScreen(&crosshair[1].x, &crosshair[1].y); + Screen().Polyline(crosshair,2); +} + + + + + +inline double CDasherViewSquare::ixmap(double x) +// invert x non-linearity +{ + if (x<m_dXmpb*m_dXmpc) + return x/m_dXmpc; + else + return m_dXmpb-m_dXmpa + m_dXmpa * exp( (x/m_dXmpc - m_dXmpb) / m_dXmpa); + +} + + +inline double CDasherViewSquare::xmap(double x) +// x non-linearity +{ + if (x<m_dXmpb) + return m_dXmpc*x; + else + return m_dXmpc*(m_dXmpa*log((x+m_dXmpa-m_dXmpb)/m_dXmpa) +m_dXmpb); +} + + + +} // namespace Dasher |