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     bool isBeingTouched() { return kEmpty_State != fState; }
     43 
     44     const SkMatrix& localM();
     45     const SkMatrix& globalM() const { return fGlobalM; }
     46 
     47     void setTransLimit(const SkRect& contentRect, const SkRect& windowRect,
     48                        const SkMatrix& preTouchM);
     49 
     50 private:
     51     enum State {
     52         kEmpty_State,
     53         kTranslate_State,
     54         kZoom_State,
     55     };
     56 
     57     struct Rec {
     58         void*   fOwner;
     59         float   fStartX, fStartY;
     60         float   fPrevX, fPrevY;
     61         float   fLastX, fLastY;
     62         float   fPrevT, fLastT;
     63     };
     64     SkTDArray<Rec> fTouches;
     65 
     66     State           fState;
     67     SkMatrix        fLocalM, fGlobalM, fPreTouchM;
     68     SkFlingState    fFlinger;
     69     double          fLastUpMillis;
     70     SkPoint         fLastUpP;
     71 
     72     // The following rects are used to limit the translation so the content never leaves the window
     73     SkRect          fContentRect, fWindowRect;
     74     bool            fIsTransLimited = false;
     75 
     76     void limitTrans(); // here we only limit the translation with respect to globalM
     77     void flushLocalM();
     78     int findRec(void* owner) const;
     79     void appendNewRec(void* owner, float x, float y);
     80     float computePinch(const Rec&, const Rec&);
     81     float limitTotalZoom(float scale) const;
     82     bool handleDblTap(float, float);
     83 };
     84 
     85 #endif
     86