|  | 
 | /* | 
 |  * Copyright 2011 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #ifndef SkTouchGesture_DEFINED | 
 | #define SkTouchGesture_DEFINED | 
 |  | 
 | #include "SkTDArray.h" | 
 | #include "SkMatrix.h" | 
 |  | 
 | struct SkFlingState { | 
 |     SkFlingState() : fActive(false) {} | 
 |  | 
 |     bool isActive() const { return fActive; } | 
 |     void stop() { fActive = false; } | 
 |  | 
 |     void reset(float sx, float sy); | 
 |     bool evaluateMatrix(SkMatrix* matrix); | 
 |  | 
 | private: | 
 |     SkPoint     fDirection; | 
 |     SkScalar    fSpeed0; | 
 |     double      fTime0; | 
 |     bool        fActive; | 
 | }; | 
 |  | 
 | class SkTouchGesture { | 
 | public: | 
 |     SkTouchGesture(); | 
 |     ~SkTouchGesture(); | 
 |  | 
 |     void touchBegin(void* owner, float x, float y); | 
 |     void touchMoved(void* owner, float x, float y); | 
 |     void touchEnd(void* owner); | 
 |     void reset(); | 
 |  | 
 |     bool isActive() { return fFlinger.isActive(); } | 
 |     void stop() { fFlinger.stop(); } | 
 |  | 
 |     const SkMatrix& localM(); | 
 |     const SkMatrix& globalM() const { return fGlobalM; } | 
 |  | 
 | private: | 
 |     enum State { | 
 |         kEmpty_State, | 
 |         kTranslate_State, | 
 |         kZoom_State, | 
 |     }; | 
 |  | 
 |     struct Rec { | 
 |         void*   fOwner; | 
 |         float   fStartX, fStartY; | 
 |         float   fPrevX, fPrevY; | 
 |         float   fLastX, fLastY; | 
 |         SkMSec  fPrevT, fLastT; | 
 |     }; | 
 |     SkTDArray<Rec> fTouches; | 
 |  | 
 |     State           fState; | 
 |     SkMatrix        fLocalM, fGlobalM; | 
 |     SkFlingState    fFlinger; | 
 |     SkMSec          fLastUpT; | 
 |     SkPoint         fLastUpP; | 
 |  | 
 |  | 
 |     void flushLocalM(); | 
 |     int findRec(void* owner) const; | 
 |     void appendNewRec(void* owner, float x, float y); | 
 |     float computePinch(const Rec&, const Rec&); | 
 |     float limitTotalZoom(float scale) const; | 
 |     bool handleDblTap(float, float); | 
 | }; | 
 |  | 
 | #endif |