180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkTouchGesture_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkTouchGesture_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTDArray.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkMatrix.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustruct SkFlingState {
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkFlingState() : fActive(false) {}
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool isActive() const { return fActive; }
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void stop() { fActive = false; }
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset(float sx, float sy);
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool evaluateMatrix(SkMatrix* matrix);
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPoint     fDirection;
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkScalar    fSpeed0;
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    double      fTime0;
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool        fActive;
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkTouchGesture {
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTouchGesture();
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ~SkTouchGesture();
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void touchBegin(void* owner, float x, float y);
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void touchMoved(void* owner, float x, float y);
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void touchEnd(void* owner);
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset();
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool isActive() { return fFlinger.isActive(); }
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void stop() { fFlinger.stop(); }
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMatrix& localM();
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkMatrix& globalM() const { return fGlobalM; }
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum State {
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kEmpty_State,
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kTranslate_State,
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kZoom_State,
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    struct Rec {
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        void*   fOwner;
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        float   fStartX, fStartY;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        float   fPrevX, fPrevY;
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        float   fLastX, fLastY;
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkMSec  fPrevT, fLastT;
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<Rec> fTouches;
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    State           fState;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrix        fLocalM, fGlobalM;
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkFlingState    fFlinger;
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMSec          fLastUpT;
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPoint         fLastUpP;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void flushLocalM();
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int findRec(void* owner) const;
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void appendNewRec(void* owner, float x, float y);
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    float computePinch(const Rec&, const Rec&);
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    float limitTotalZoom(float scale) const;
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    bool handleDblTap(float, float);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
78