Home | History | Annotate | Download | only in views
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #ifndef SkTouchGesture_DEFINED
      9 #define SkTouchGesture_DEFINED
     10 
     11 #include "../private/SkTDArray.h"
     12 #include "SkMatrix.h"
     13 
     14 struct SkFlingState {
     15     SkFlingState() : fActive(false) {}
     16 
     17     bool isActive() const { return fActive; }
     18     void stop() { fActive = false; }
     19 
     20     void reset(float sx, float sy);
     21     bool evaluateMatrix(SkMatrix* matrix);
     22 
     23 private:
     24     SkPoint     fDirection;
     25     SkScalar    fSpeed0;
     26     double      fTime0;
     27     bool        fActive;
     28 };
     29 
     30 class SkTouchGesture {
     31 public:
     32     SkTouchGesture();
     33     ~SkTouchGesture();
     34 
     35     void touchBegin(void* owner, float x, float y);
     36     void touchMoved(void* owner, float x, float y);
     37     void touchEnd(void* owner);
     38     void reset();
     39 
     40     bool isActive() { return fFlinger.isActive(); }
     41     void stop() { fFlinger.stop(); }
     42 
     43     const SkMatrix& localM();
     44     const SkMatrix& globalM() const { return fGlobalM; }
     45 
     46     void setTransLimit(const SkRect& contentRect, const SkRect& windowRect);
     47 
     48 private:
     49     enum State {
     50         kEmpty_State,
     51         kTranslate_State,
     52         kZoom_State,
     53     };
     54 
     55     struct Rec {
     56         void*   fOwner;
     57         float   fStartX, fStartY;
     58         float   fPrevX, fPrevY;
     59         float   fLastX, fLastY;
     60         float   fPrevT, fLastT;
     61     };
     62     SkTDArray<Rec> fTouches;
     63 
     64     State           fState;
     65     SkMatrix        fLocalM, fGlobalM;
     66     SkFlingState    fFlinger;
     67     double          fLastUpMillis;
     68     SkPoint         fLastUpP;
     69 
     70     // The following rects are used to limit the translation so the content never leaves the window
     71     SkRect          fContentRect, fWindowRect;
     72     bool            fIsTransLimited = false;
     73 
     74     void limitTrans(); // here we only limit the translation with respect to globalM
     75     void flushLocalM();
     76     int findRec(void* owner) const;
     77     void appendNewRec(void* owner, float x, float y);
     78     float computePinch(const Rec&, const Rec&);
     79     float limitTotalZoom(float scale) const;
     80     bool handleDblTap(float, float);
     81 };
     82 
     83 #endif
     84