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