From f4554d8b10f25ab300d057ff0ebd16b2b7a70be8 Mon Sep 17 00:00:00 2001 From: Satoshi Kataoka Date: Wed, 12 Sep 2012 20:50:21 +0900 Subject: [PATCH] Fix an issue on FP calculation diff of osx and linux sugar on mac result_type=1 expected=<1093> actual=<1047> result_type=4 expected=<730> actual=<698> result_type=5 expected=<177> actual=<173> sugar on linux result_type=1 expected=<1093> actual=<1047> result_type=4 expected=<730> actual=<698> result_type=5 expected=<177> actual=<173> Change-Id: I4cd39becb0de4076dd37d870adda6463a96de424 --- native/jni/src/geometry_utils.h | 21 +++++++++++++-------- native/jni/src/proximity_info.cpp | 4 +++- native/jni/src/proximity_info_state.cpp | 4 ++++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/native/jni/src/geometry_utils.h b/native/jni/src/geometry_utils.h index f30e9fcc0..bad5eda61 100644 --- a/native/jni/src/geometry_utils.h +++ b/native/jni/src/geometry_utils.h @@ -25,14 +25,17 @@ #define M_PI_F 3.14159265f +#define ROUND_FLOAT_10000(f) ((f) < 1000.0f && (f) > 0.001f) \ + ? (floorf((f) * 10000.0f) / 10000.0f) : (f) + +#define SQUARE_FLOAT(x) ((x) * (x)) + namespace latinime { -static inline float squareFloat(float x) { - return x * x; -} - static inline float getSquaredDistanceFloat(float x1, float y1, float x2, float y2) { - return squareFloat(x1 - x2) + squareFloat(y1 - y2); + const float deltaX = x1 - x2; + const float deltaY = y1 - y2; + return SQUARE_FLOAT(deltaX) + SQUARE_FLOAT(deltaY); } static inline float getDistanceFloat(float x1, float y1, float x2, float y2) { @@ -52,9 +55,11 @@ static inline float getAngle(int x1, int y1, int x2, int y2) { } static inline float getAngleDiff(float a1, float a2) { - const float diff = fabsf(a1 - a2); + const float deltaA = fabsf(a1 - a2); + const float diff = ROUND_FLOAT_10000(deltaA); if (diff > M_PI_F) { - return 2.0f * M_PI_F - diff; + const float normalizedDiff = 2.0f * M_PI_F - diff; + return ROUND_FLOAT_10000(normalizedDiff); } return diff; } @@ -76,7 +81,7 @@ static inline float pointToLineSegSquaredDistanceFloat( const float ray2y = y2 - y1; const float dotProduct = ray1x * ray2x + ray1y * ray2y; - const float lineLengthSqr = squareFloat(ray2x) + squareFloat(ray2y); + const float lineLengthSqr = SQUARE_FLOAT(ray2x) + SQUARE_FLOAT(ray2y); const float projectionLengthSqr = dotProduct / lineLengthSqr; float projectionX; diff --git a/native/jni/src/proximity_info.cpp b/native/jni/src/proximity_info.cpp index 9bb8b29ae..693a9f2b1 100644 --- a/native/jni/src/proximity_info.cpp +++ b/native/jni/src/proximity_info.cpp @@ -141,7 +141,9 @@ bool ProximityInfo::hasSpaceProximity(const int x, const int y) const { static inline float getNormalizedSquaredDistanceFloat(float x1, float y1, float x2, float y2, float scale) { - return squareFloat((x1 - x2) / scale) + squareFloat((y1 - y2) / scale); + const float deltaX = x1 - x2; + const float deltaY = y1 - y2; + return (SQUARE_FLOAT(deltaX) + SQUARE_FLOAT(deltaY)) / SQUARE_FLOAT(scale); } float ProximityInfo::getNormalizedSquaredDistanceFromCenterFloat( diff --git a/native/jni/src/proximity_info_state.cpp b/native/jni/src/proximity_info_state.cpp index 208b69356..7e917a929 100644 --- a/native/jni/src/proximity_info_state.cpp +++ b/native/jni/src/proximity_info_state.cpp @@ -177,6 +177,10 @@ void ProximityInfoState::initInputParams(const int pointerId, const float maxPoi hypotf(mProximityInfo->getKeyboardWidth(), mProximityInfo->getKeyboardHeight()) * READ_FORWORD_LENGTH_SCALE); for (int i = 0; i < mInputSize; ++i) { + if (DEBUG_GEO_FULL) { + AKLOGI("Sampled(%d): x = %d, y = %d, time = %d", i, mInputXs[i], mInputYs[i], + mTimes[i]); + } for (int j = max(i + 1, lastSavedInputSize); j < mInputSize; ++j) { if (mLengthCache[j] - mLengthCache[i] >= readForwordLength) { break;