summaryrefslogtreecommitdiff
path: root/inputmethods/dasher/FrameRate.h
Side-by-side diff
Diffstat (limited to 'inputmethods/dasher/FrameRate.h') (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/dasher/FrameRate.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/inputmethods/dasher/FrameRate.h b/inputmethods/dasher/FrameRate.h
new file mode 100644
index 0000000..2f86b03
--- a/dev/null
+++ b/inputmethods/dasher/FrameRate.h
@@ -0,0 +1,112 @@
+// FrameRate.h
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2002 David Ward
+//
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __FrameRate_h__
+#define __FrameRate_h__
+
+#include "MSVC_Unannoy.h"
+
+// keeps track of framerate
+// computes the Steps parameter
+// computes RXmax - which controls the maximum rate of zooming in
+
+const double LN2= log(2);
+
+class CFrameRate {
+ public:
+ CFrameRate() ;
+ ~CFrameRate() {};
+ const double Rxmax() const {return m_dRXmax;}
+ const int Steps() const {return m_iSteps;}
+ const double Framerate() const {return m_dFr;}
+ void Reset(unsigned long Time);
+ void NewFrame(unsigned long Time);
+
+ // TODO: These two shouldn't be the same thing:
+ void SetBitrate(double TargetRate);
+ void SetMaxBitrate(double MaxRate);
+ private:
+ double m_dFr;
+ double m_dMaxbitrate; // the maximum rate of entering information
+ double m_dRXmax; // the maximum zoomin per frame
+ int m_iFrames,m_iTime,m_iTime2,m_iSamples;
+ int m_iSteps; // the 'Steps' parameter. See djw thesis.
+};
+
+inline CFrameRate::CFrameRate() {
+
+ // maxbitrate should be user-defined and/or adaptive. Currently it is not.
+#if defined(_WIN32_WCE)
+ m_dMaxbitrate=5;
+#else
+ m_dMaxbitrate=5.5;
+#endif
+
+ m_dRXmax=2; // only a transient effect
+ m_iFrames=0;
+ m_iSamples=1;
+
+ // we dont know the framerate yet - play it safe by setting it high
+ m_dFr=1<<5;
+
+ // start off very slow until we have sampled framerate adequately
+ m_iSteps=2000;
+ m_iTime=0; // Hmmm, User must reset framerate before starting.
+}
+
+inline void CFrameRate::NewFrame(unsigned long Time)
+ // compute framerate if we have sampled enough frames
+{
+
+ m_iFrames++;
+
+ if (m_iFrames==m_iSamples) {
+ m_iTime2=Time;
+ if (m_iTime2-m_iTime < 50)
+ m_iSamples++; // increase sample size
+ else if (m_iTime2-m_iTime > 80) {
+ m_iSamples--;
+ if (m_iSamples <2)
+ m_iSamples=2;
+ }
+ if (m_iTime2-m_iTime) {
+ m_dFr=m_iFrames*1000.0/(m_iTime2-m_iTime);
+ m_iTime=m_iTime2;
+ m_iFrames=0;
+
+ }
+ m_dRXmax=exp(m_dMaxbitrate*LN2/m_dFr);
+ m_iSteps=m_iSteps/2+(int)(-log(0.2)*m_dFr/LN2/m_dMaxbitrate)/2;
+ // dchar debug[256];
+ // _stprintf(debug,TEXT("fr %f Steps %d samples %d time2 %d rxmax %f\n"),fr,Steps,samples,time2,RXmax);
+ // OutputDebugString(debug);
+
+ }
+}
+
+inline void CFrameRate::Reset(unsigned long Time)
+{
+ m_iFrames=0;
+ m_iTime=Time;
+}
+
+
+inline void CFrameRate::SetBitrate(double TargetRate)
+{
+ m_dMaxbitrate = TargetRate;
+}
+
+
+inline void CFrameRate::SetMaxBitrate(double MaxRate)
+{
+ m_dMaxbitrate = MaxRate;
+}
+
+
+
+#endif /* #ifndef __FrameRate_h__ */