From 0edab9d2fcc30667c79aa9221dbb27f042d8b455 Mon Sep 17 00:00:00 2001
From: Satoshi Kataoka <satok@google.com>
Date: Mon, 24 Sep 2012 18:29:31 +0900
Subject: [PATCH] Use touch position correction in the geometric input

bug: 7108161

Change-Id: I72d51bcfa26f241bec8fa907d64384e7eebe5c5e
---
 native/jni/src/proximity_info.cpp       | 18 +++++++++++++++---
 native/jni/src/proximity_info.h         |  4 +---
 native/jni/src/proximity_info_state.cpp |  6 +++---
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp
index c9f83b62c2..d6990325e5 100644
--- a/native/jni/src/proximity_info.cpp
+++ b/native/jni/src/proximity_info.cpp
@@ -134,10 +134,22 @@ static inline float getNormalizedSquaredDistanceFloat(float x1, float y1, float
     return (SQUARE_FLOAT(deltaX) + SQUARE_FLOAT(deltaY)) / SQUARE_FLOAT(scale);
 }
 
-float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloat(
+float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloatG(
         const int keyId, const int x, const int y) const {
-    const float centerX = static_cast<float>(getKeyCenterXOfKeyIdG(keyId));
-    const float centerY = static_cast<float>(getKeyCenterYOfKeyIdG(keyId));
+    const static float verticalSweetSpotScaleForGeometric = 1.1f;
+    const bool correctTouchPosition = hasTouchPositionCorrectionData();
+    const float centerX = static_cast<float>(correctTouchPosition
+            ? getSweetSpotCenterXAt(keyId)
+            : getKeyCenterXOfKeyIdG(keyId));
+    const float visualKeyCenterY = static_cast<float>(getKeyCenterYOfKeyIdG(keyId));
+    float centerY;
+    if (correctTouchPosition) {
+        const float sweetSpotCenterY = static_cast<float>(getSweetSpotCenterYAt(keyId));
+        const float gapY = sweetSpotCenterY - visualKeyCenterY;
+        centerY = visualKeyCenterY + gapY * verticalSweetSpotScaleForGeometric;
+    } else {
+        centerY = visualKeyCenterY;
+    }
     const float touchX = static_cast<float>(x);
     const float touchY = static_cast<float>(y);
     const float keyWidth = static_cast<float>(getMostCommonKeyWidth());
diff --git a/native/jni/src/proximity_info.h b/native/jni/src/proximity_info.h
index 0d8c6a3ca0..2947f9ba6f 100644
--- a/native/jni/src/proximity_info.h
+++ b/native/jni/src/proximity_info.h
@@ -44,7 +44,7 @@ class ProximityInfo {
     ~ProximityInfo();
     bool hasSpaceProximity(const int x, const int y) const;
     int getNormalizedSquaredDistance(const int inputIndex, const int proximityIndex) const;
-    float getNormalizedSquaredDistanceFromCenterFloat(
+    float getNormalizedSquaredDistanceFromCenterFloatG(
             const int keyId, const int x, const int y) const;
     bool sameAsTyped(const unsigned short *word, int length) const;
     int getKeyIndexOf(const int c) const;
@@ -123,8 +123,6 @@ class ProximityInfo {
     int getStartIndexFromCoordinates(const int x, const int y) const;
     void initializeG();
     float calculateNormalizedSquaredDistance(const int keyIndex, const int inputIndex) const;
-    float calculateSquaredDistanceFromSweetSpotCenter(
-            const int keyIndex, const int inputIndex) const;
     bool hasInputCoordinates() const;
     int squaredDistanceToEdge(const int keyId, const int x, const int y) const;
     bool isOnKey(const int keyId, const int x, const int y) const {
diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp
index c5f2884c65..cefe8ab4d2 100644
--- a/native/jni/src/proximity_info_state.cpp
+++ b/native/jni/src/proximity_info_state.cpp
@@ -171,7 +171,7 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
                 const int x = mInputXs[i];
                 const int y = mInputYs[i];
                 const float normalizedSquaredDistance =
-                        mProximityInfo->getNormalizedSquaredDistanceFromCenterFloat(k, x, y);
+                        mProximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y);
                 mDistanceCache[index] = normalizedSquaredDistance;
                 if (normalizedSquaredDistance < NEAR_KEY_NORMALIZED_SQUARED_THRESHOLD) {
                     mNearKeysVector[i].set(k, 1);
@@ -203,7 +203,7 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi
     memset(mNormalizedSquaredDistances, NOT_A_DISTANCE, sizeof(mNormalizedSquaredDistances));
     memset(mPrimaryInputWord, 0, sizeof(mPrimaryInputWord));
     mTouchPositionCorrectionEnabled = mInputSize > 0 && mHasTouchPositionCorrectionData
-            && xCoordinates && yCoordinates && !isGeometric;
+            && xCoordinates && yCoordinates;
     if (!isGeometric && pointerId == 0) {
         for (int i = 0; i < inputSize; ++i) {
             mPrimaryInputWord[i] = getPrimaryCharAt(i);
@@ -267,7 +267,7 @@ float ProximityInfoState::updateNearKeysDistances(const int x, const int y,
     const int keyCount = mProximityInfo->getKeyCount();
     float nearestKeyDistance = mMaxPointToKeyLength;
     for (int k = 0; k < keyCount; ++k) {
-        const float dist = mProximityInfo->getNormalizedSquaredDistanceFromCenterFloat(k, x, y);
+        const float dist = mProximityInfo->getNormalizedSquaredDistanceFromCenterFloatG(k, x, y);
         if (dist < NEAR_KEY_THRESHOLD) {
             currentNearKeysDistances->insert(std::pair<int, float>(k, dist));
         }
-- 
GitLab