1cb93a386Sopenharmony_ci 2cb93a386Sopenharmony_ci/* 3cb93a386Sopenharmony_ci * Copyright 2011 Google Inc. 4cb93a386Sopenharmony_ci * 5cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 6cb93a386Sopenharmony_ci * found in the LICENSE file. 7cb93a386Sopenharmony_ci */ 8cb93a386Sopenharmony_ci#ifndef TouchGesture_DEFINED 9cb93a386Sopenharmony_ci#define TouchGesture_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkMatrix.h" 12cb93a386Sopenharmony_ci#include "include/private/SkTDArray.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ciclass TouchGesture { 15cb93a386Sopenharmony_cipublic: 16cb93a386Sopenharmony_ci TouchGesture(); 17cb93a386Sopenharmony_ci ~TouchGesture(); 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ci void touchBegin(void* owner, float x, float y); 20cb93a386Sopenharmony_ci void touchMoved(void* owner, float x, float y); 21cb93a386Sopenharmony_ci void touchEnd(void* owner); 22cb93a386Sopenharmony_ci void reset(); 23cb93a386Sopenharmony_ci void resetTouchState(); 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci bool isActive() { return fFlinger.isActive(); } 26cb93a386Sopenharmony_ci void stop() { fFlinger.stop(); } 27cb93a386Sopenharmony_ci bool isBeingTouched() { return kEmpty_State != fState; } 28cb93a386Sopenharmony_ci bool isFling(SkPoint* dir); 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci void startZoom(); 31cb93a386Sopenharmony_ci void updateZoom(float scale, float startX, float startY, float lastX, float lastY); 32cb93a386Sopenharmony_ci void endZoom(); 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci const SkMatrix& localM(); 35cb93a386Sopenharmony_ci const SkMatrix& globalM() const { return fGlobalM; } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci void setTransLimit(const SkRect& contentRect, const SkRect& windowRect, 38cb93a386Sopenharmony_ci const SkMatrix& preTouchM); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ciprivate: 41cb93a386Sopenharmony_ci enum State { 42cb93a386Sopenharmony_ci kEmpty_State, 43cb93a386Sopenharmony_ci kTranslate_State, 44cb93a386Sopenharmony_ci kZoom_State, 45cb93a386Sopenharmony_ci }; 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci struct Rec { 48cb93a386Sopenharmony_ci void* fOwner; 49cb93a386Sopenharmony_ci float fStartX, fStartY; 50cb93a386Sopenharmony_ci float fPrevX, fPrevY; 51cb93a386Sopenharmony_ci float fLastX, fLastY; 52cb93a386Sopenharmony_ci float fPrevT, fLastT; 53cb93a386Sopenharmony_ci }; 54cb93a386Sopenharmony_ci SkTDArray<Rec> fTouches; 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci State fState; 57cb93a386Sopenharmony_ci SkMatrix fLocalM, fGlobalM, fPreTouchM; 58cb93a386Sopenharmony_ci 59cb93a386Sopenharmony_ci struct FlingState { 60cb93a386Sopenharmony_ci FlingState() : fActive(false) {} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci bool isActive() const { return fActive; } 63cb93a386Sopenharmony_ci void stop() { fActive = false; } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci void reset(float sx, float sy); 66cb93a386Sopenharmony_ci bool evaluateMatrix(SkMatrix* matrix); 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci void get(SkPoint* dir, SkScalar* speed) { 69cb93a386Sopenharmony_ci *dir = fDirection; 70cb93a386Sopenharmony_ci *speed = fSpeed0; 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci private: 74cb93a386Sopenharmony_ci SkPoint fDirection; 75cb93a386Sopenharmony_ci SkScalar fSpeed0; 76cb93a386Sopenharmony_ci double fTime0; 77cb93a386Sopenharmony_ci bool fActive; 78cb93a386Sopenharmony_ci }; 79cb93a386Sopenharmony_ci FlingState fFlinger; 80cb93a386Sopenharmony_ci double fLastUpMillis; 81cb93a386Sopenharmony_ci SkPoint fLastUpP; 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci // The following rects are used to limit the translation so the content never leaves the window 84cb93a386Sopenharmony_ci SkRect fContentRect, fWindowRect; 85cb93a386Sopenharmony_ci bool fIsTransLimited = false; 86cb93a386Sopenharmony_ci 87cb93a386Sopenharmony_ci void limitTrans(); // here we only limit the translation with respect to globalM 88cb93a386Sopenharmony_ci void flushLocalM(); 89cb93a386Sopenharmony_ci int findRec(void* owner) const; 90cb93a386Sopenharmony_ci void appendNewRec(void* owner, float x, float y); 91cb93a386Sopenharmony_ci float computePinch(const Rec&, const Rec&); 92cb93a386Sopenharmony_ci bool handleDblTap(float, float); 93cb93a386Sopenharmony_ci}; 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_ci#endif 96