1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8#ifndef SkTouchGesture_DEFINED
9#define SkTouchGesture_DEFINED
10
11#include "SkTDArray.h"
12#include "SkMatrix.h"
13
14struct SkFlingState {
15    SkFlingState() : fActive(false) {}
16
17    bool isActive() const { return fActive; }
18    void stop() { fActive = false; }
19
20    void reset(float sx, float sy);
21    bool evaluateMatrix(SkMatrix* matrix);
22
23private:
24    SkPoint     fDirection;
25    SkScalar    fSpeed0;
26    double      fTime0;
27    bool        fActive;
28};
29
30class SkTouchGesture {
31public:
32    SkTouchGesture();
33    ~SkTouchGesture();
34
35    void touchBegin(void* owner, float x, float y);
36    void touchMoved(void* owner, float x, float y);
37    void touchEnd(void* owner);
38    void reset();
39
40    bool isActive() { return fFlinger.isActive(); }
41    void stop() { fFlinger.stop(); }
42
43    const SkMatrix& localM();
44    const SkMatrix& globalM() const { return fGlobalM; }
45
46private:
47    enum State {
48        kEmpty_State,
49        kTranslate_State,
50        kZoom_State,
51    };
52
53    struct Rec {
54        void*   fOwner;
55        float   fStartX, fStartY;
56        float   fPrevX, fPrevY;
57        float   fLastX, fLastY;
58        SkMSec  fPrevT, fLastT;
59    };
60    SkTDArray<Rec> fTouches;
61
62    State           fState;
63    SkMatrix        fLocalM, fGlobalM;
64    SkFlingState    fFlinger;
65    SkMSec          fLastUpT;
66    SkPoint         fLastUpP;
67
68
69    void flushLocalM();
70    int findRec(void* owner) const;
71    void appendNewRec(void* owner, float x, float y);
72    float computePinch(const Rec&, const Rec&);
73    float limitTotalZoom(float scale) const;
74    bool handleDblTap(float, float);
75};
76
77#endif
78