180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc. 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkTouchGesture_DEFINED 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkTouchGesture_DEFINED 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDArray.h" 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrix.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkFlingState { 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkFlingState() : fActive(false) {} 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isActive() const { return fActive; } 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void stop() { fActive = false; } 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(float sx, float sy); 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool evaluateMatrix(SkMatrix* matrix); 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint fDirection; 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkScalar fSpeed0; 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru double fTime0; 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool fActive; 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkTouchGesture { 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic: 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTouchGesture(); 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ~SkTouchGesture(); 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void touchBegin(void* owner, float x, float y); 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void touchMoved(void* owner, float x, float y); 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void touchEnd(void* owner); 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void reset(); 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool isActive() { return fFlinger.isActive(); } 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void stop() { fFlinger.stop(); } 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkMatrix& localM(); 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const SkMatrix& globalM() const { return fGlobalM; } 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate: 4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru enum State { 4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kEmpty_State, 4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kTranslate_State, 5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru kZoom_State, 5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru struct Rec { 5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void* fOwner; 5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float fStartX, fStartY; 5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float fPrevX, fPrevY; 5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float fLastX, fLastY; 5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMSec fPrevT, fLastT; 5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru }; 6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkTDArray<Rec> fTouches; 6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru State fState; 6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMatrix fLocalM, fGlobalM; 6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkFlingState fFlinger; 6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkMSec fLastUpT; 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkPoint fLastUpP; 6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void flushLocalM(); 7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru int findRec(void* owner) const; 7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru void appendNewRec(void* owner, float x, float y); 7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float computePinch(const Rec&, const Rec&); 7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru float limitTotalZoom(float scale) const; 7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru bool handleDblTap(float, float); 7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}; 7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 78