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 11a7e9f05119174848c6be5028568f46eb5e85398ebungeman#include "../private/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 46e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian void setTransLimit(const SkRect& contentRect, const SkRect& windowRect); 47e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian 4852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.comprivate: 4952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com enum State { 5052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kEmpty_State, 5152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kTranslate_State, 5252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com kZoom_State, 5352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com }; 5452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 5552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com struct Rec { 5652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void* fOwner; 5752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fStartX, fStartY; 5852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fPrevX, fPrevY; 5952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float fLastX, fLastY; 60ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner float fPrevT, fLastT; 6152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com }; 6252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkTDArray<Rec> fTouches; 6352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 6452f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com State fState; 6552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkMatrix fLocalM, fGlobalM; 6652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkFlingState fFlinger; 67ec4d4d784dbb250e572f8e04d18d0fd2ebeee851benjaminwagner double fLastUpMillis; 6852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com SkPoint fLastUpP; 6952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 70e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian // The following rects are used to limit the translation so the content never leaves the window 71e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian SkRect fContentRect, fWindowRect; 72e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian bool fIsTransLimited = false; 7352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 74e46e4f075bfa8acf038aa68a8e7da282d4c1015bliyuqian void limitTrans(); // here we only limit the translation with respect to globalM 7552f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void flushLocalM(); 7652f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com int findRec(void* owner) const; 7752f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com void appendNewRec(void* owner, float x, float y); 7852f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float computePinch(const Rec&, const Rec&); 7952f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com float limitTotalZoom(float scale) const; 8052f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com bool handleDblTap(float, float); 8152f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com}; 8252f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com 8352f57e1d11a00bdc5efb96709446546cdbc1ff9dreed@google.com#endif 84