1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#ifndef SkTouchGesture_DEFINED 952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#define SkTouchGesture_DEFINED 1052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 1152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#include "SkTDArray.h" 1252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#include "SkMatrix.h" 1352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 1452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comstruct SkFlingState { 1552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkFlingState() : fActive(false) {} 16fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 1752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool isActive() const { return fActive; } 1852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void stop() { fActive = false; } 19fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 2052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void reset(float sx, float sy); 2152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool evaluateMatrix(SkMatrix* matrix); 22fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com 2352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comprivate: 2452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkPoint fDirection; 2552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkScalar fSpeed0; 2652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com double fTime0; 2752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool fActive; 2852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}; 2952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 3052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comclass SkTouchGesture { 3152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.compublic: 3252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkTouchGesture(); 3352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com ~SkTouchGesture(); 3452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 3552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void touchBegin(void* owner, float x, float y); 3652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void touchMoved(void* owner, float x, float y); 3752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void touchEnd(void* owner); 3852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void reset(); 3952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 4052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool isActive() { return fFlinger.isActive(); } 4152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void stop() { fFlinger.stop(); } 4252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 4352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com const SkMatrix& localM(); 4452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com const SkMatrix& globalM() const { return fGlobalM; } 4552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 4652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comprivate: 4752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com enum State { 4852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kEmpty_State, 4952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kTranslate_State, 5052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kZoom_State, 5152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com }; 5252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 5352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com struct Rec { 5452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void* fOwner; 5552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fStartX, fStartY; 5652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fPrevX, fPrevY; 5752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fLastX, fLastY; 5852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkMSec fPrevT, fLastT; 5952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com }; 6052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkTDArray<Rec> fTouches; 6152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 6252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com State fState; 6352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkMatrix fLocalM, fGlobalM; 6452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkFlingState fFlinger; 6552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkMSec fLastUpT; 6652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkPoint fLastUpP; 6752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 6852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 6952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void flushLocalM(); 7052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com int findRec(void* owner) const; 7152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void appendNewRec(void* owner, float x, float y); 7252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float computePinch(const Rec&, const Rec&); 7352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float limitTotalZoom(float scale) const; 7452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool handleDblTap(float, float); 7552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}; 7652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 7752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#endif 78