blob: 4d4c0312d3304ef3391e48256aba36257c9d0316 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
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 */
reed@google.com52f57e12011-03-16 12:10:02 +00008#ifndef SkTouchGesture_DEFINED
9#define SkTouchGesture_DEFINED
10
bungemana7e9f052016-02-18 08:53:33 -080011#include "../private/SkTDArray.h"
reed@google.com52f57e12011-03-16 12:10:02 +000012#include "SkMatrix.h"
13
14struct SkFlingState {
15 SkFlingState() : fActive(false) {}
rmistry@google.comfbfcd562012-08-23 18:09:54 +000016
reed@google.com52f57e12011-03-16 12:10:02 +000017 bool isActive() const { return fActive; }
18 void stop() { fActive = false; }
rmistry@google.comfbfcd562012-08-23 18:09:54 +000019
reed@google.com52f57e12011-03-16 12:10:02 +000020 void reset(float sx, float sy);
21 bool evaluateMatrix(SkMatrix* matrix);
rmistry@google.comfbfcd562012-08-23 18:09:54 +000022
reed@google.com52f57e12011-03-16 12:10:02 +000023private:
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
liyuqiane46e4f02016-05-20 07:32:19 -070046 void setTransLimit(const SkRect& contentRect, const SkRect& windowRect);
47
reed@google.com52f57e12011-03-16 12:10:02 +000048private:
49 enum State {
50 kEmpty_State,
51 kTranslate_State,
52 kZoom_State,
53 };
54
55 struct Rec {
56 void* fOwner;
57 float fStartX, fStartY;
58 float fPrevX, fPrevY;
59 float fLastX, fLastY;
benjaminwagnerec4d4d72016-03-25 12:59:53 -070060 float fPrevT, fLastT;
reed@google.com52f57e12011-03-16 12:10:02 +000061 };
62 SkTDArray<Rec> fTouches;
63
64 State fState;
65 SkMatrix fLocalM, fGlobalM;
66 SkFlingState fFlinger;
benjaminwagnerec4d4d72016-03-25 12:59:53 -070067 double fLastUpMillis;
reed@google.com52f57e12011-03-16 12:10:02 +000068 SkPoint fLastUpP;
69
liyuqiane46e4f02016-05-20 07:32:19 -070070 // The following rects are used to limit the translation so the content never leaves the window
71 SkRect fContentRect, fWindowRect;
72 bool fIsTransLimited = false;
reed@google.com52f57e12011-03-16 12:10:02 +000073
liyuqiane46e4f02016-05-20 07:32:19 -070074 void limitTrans(); // here we only limit the translation with respect to globalM
reed@google.com52f57e12011-03-16 12:10:02 +000075 void flushLocalM();
76 int findRec(void* owner) const;
77 void appendNewRec(void* owner, float x, float y);
78 float computePinch(const Rec&, const Rec&);
79 float limitTotalZoom(float scale) const;
80 bool handleDblTap(float, float);
81};
82
83#endif