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