Home | History | Annotate | Download | only in views
      1 #ifndef SkTouchGesture_DEFINED
      2 #define SkTouchGesture_DEFINED
      3 
      4 #include "SkTDArray.h"
      5 #include "SkMatrix.h"
      6 
      7 struct SkFlingState {
      8     SkFlingState() : fActive(false) {}
      9 
     10     bool isActive() const { return fActive; }
     11     void stop() { fActive = false; }
     12 
     13     void reset(float sx, float sy);
     14     bool evaluateMatrix(SkMatrix* matrix);
     15 
     16 private:
     17     SkPoint     fDirection;
     18     SkScalar    fSpeed0;
     19     double      fTime0;
     20     bool        fActive;
     21 };
     22 
     23 class SkTouchGesture {
     24 public:
     25     SkTouchGesture();
     26     ~SkTouchGesture();
     27 
     28     void touchBegin(void* owner, float x, float y);
     29     void touchMoved(void* owner, float x, float y);
     30     void touchEnd(void* owner);
     31     void reset();
     32 
     33     bool isActive() { return fFlinger.isActive(); }
     34     void stop() { fFlinger.stop(); }
     35 
     36     const SkMatrix& localM();
     37     const SkMatrix& globalM() const { return fGlobalM; }
     38 
     39 private:
     40     enum State {
     41         kEmpty_State,
     42         kTranslate_State,
     43         kZoom_State,
     44     };
     45 
     46     struct Rec {
     47         void*   fOwner;
     48         float   fStartX, fStartY;
     49         float   fPrevX, fPrevY;
     50         float   fLastX, fLastY;
     51         SkMSec  fPrevT, fLastT;
     52     };
     53     SkTDArray<Rec> fTouches;
     54 
     55     State           fState;
     56     SkMatrix        fLocalM, fGlobalM;
     57     SkFlingState    fFlinger;
     58     SkMSec          fLastUpT;
     59     SkPoint         fLastUpP;
     60 
     61 
     62     void flushLocalM();
     63     int findRec(void* owner) const;
     64     void appendNewRec(void* owner, float x, float y);
     65     float computePinch(const Rec&, const Rec&);
     66     float limitTotalZoom(float scale) const;
     67     bool handleDblTap(float, float);
     68 };
     69 
     70 #endif
     71 
     72 
     73