summaryrefslogtreecommitdiff
path: root/inputmethods/dasher/DasherViewSquare.inl
Side-by-side diff
Diffstat (limited to 'inputmethods/dasher/DasherViewSquare.inl') (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/dasher/DasherViewSquare.inl142
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