Index: src/views/SkTouchGesture.cpp |
diff --git a/src/views/SkTouchGesture.cpp b/src/views/SkTouchGesture.cpp |
index 5fc8d7ee90b1e5c3fb371576e9cffbcfa6659115..752828e37f3a866edc2dc66ae86717ec64bce956 100644 |
--- a/src/views/SkTouchGesture.cpp |
+++ b/src/views/SkTouchGesture.cpp |
@@ -5,7 +5,7 @@ |
* found in the LICENSE file. |
*/ |
- |
+#include <algorithm> |
#include "SkTouchGesture.h" |
#include "SkMatrix.h" |
@@ -109,6 +109,7 @@ SkTouchGesture::~SkTouchGesture() { |
} |
void SkTouchGesture::reset() { |
+ fIsTransLimited = false; |
fTouches.reset(); |
fState = kEmpty_State; |
fLocalM.reset(); |
@@ -293,6 +294,8 @@ void SkTouchGesture::touchEnd(void* owner) { |
} |
fTouches.removeShuffle(index); |
+ |
+ limitTrans(); |
} |
float SkTouchGesture::computePinch(const Rec& rec0, const Rec& rec1) { |
@@ -327,3 +330,24 @@ bool SkTouchGesture::handleDblTap(float x, float y) { |
fLastUpP.set(x, y); |
return found; |
} |
+ |
+void SkTouchGesture::setTransLimit(const SkRect& contentRect, const SkRect& windowRect) { |
+ fIsTransLimited = true; |
+ fContentRect = contentRect; |
+ fWindowRect = windowRect; |
+} |
+ |
+void SkTouchGesture::limitTrans() { |
+ if (!fIsTransLimited) { |
+ return; |
+ } |
+ |
+ SkRect scaledContent = fContentRect; |
+ fGlobalM.mapRect(&scaledContent); |
+ const SkScalar ZERO = 0; |
+ |
+ fGlobalM.postTranslate(ZERO, std::min(ZERO, fWindowRect.fBottom - scaledContent.fTop)); |
+ fGlobalM.postTranslate(ZERO, std::max(ZERO, fWindowRect.fTop - scaledContent.fBottom)); |
+ fGlobalM.postTranslate(std::min(ZERO, fWindowRect.fRight - scaledContent.fLeft), ZERO); |
+ fGlobalM.postTranslate(std::max(ZERO, fWindowRect.fLeft - scaledContent.fRight), ZERO); |
+} |