diff options
author | Jeff Brown <jeffbrown@google.com> | 2011-01-14 19:09:23 -0800 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2011-01-14 19:12:48 -0800 |
commit | 517bb4c859a2bb8d30316204f39bf5b6c89c3e4d (patch) | |
tree | bd21e2dfa465a4ab311e714f8e8f301372143831 | |
parent | fca66d3b71abcf1e78a25988850857ea8188c0d0 (diff) | |
download | frameworks_base-517bb4c859a2bb8d30316204f39bf5b6c89c3e4d.zip frameworks_base-517bb4c859a2bb8d30316204f39bf5b6c89c3e4d.tar.gz frameworks_base-517bb4c859a2bb8d30316204f39bf5b6c89c3e4d.tar.bz2 |
Add support for detecting finger orientation.
Change-Id: I901fc61f7705fcd7950190dc8782bad616032ee2
-rw-r--r-- | core/java/com/android/internal/widget/PointerLocationView.java | 11 | ||||
-rw-r--r-- | services/input/InputReader.cpp | 23 | ||||
-rw-r--r-- | services/input/InputReader.h | 1 |
3 files changed, 34 insertions, 1 deletions
diff --git a/core/java/com/android/internal/widget/PointerLocationView.java b/core/java/com/android/internal/widget/PointerLocationView.java index 12cf853..0b765fd 100644 --- a/core/java/com/android/internal/widget/PointerLocationView.java +++ b/core/java/com/android/internal/widget/PointerLocationView.java @@ -300,6 +300,17 @@ public class PointerLocationView extends View { mPaint.setARGB(255, pressureLevel, 128, 255 - pressureLevel); drawOval(canvas, ps.mCoords.x, ps.mCoords.y, ps.mCoords.toolMajor, ps.mCoords.toolMinor, ps.mCoords.orientation, mPaint); + + // Draw the orientation arrow. + mPaint.setARGB(255, pressureLevel, 255, 0); + float orientationVectorX = (float) (Math.sin(-ps.mCoords.orientation) + * ps.mCoords.toolMajor * 0.7); + float orientationVectorY = (float) (Math.cos(-ps.mCoords.orientation) + * ps.mCoords.toolMajor * 0.7); + canvas.drawLine( + ps.mCoords.x - orientationVectorX, ps.mCoords.y - orientationVectorY, + ps.mCoords.x + orientationVectorX, ps.mCoords.y + orientationVectorY, + mPaint); } } } diff --git a/services/input/InputReader.cpp b/services/input/InputReader.cpp index f6a8859..6b66791 100644 --- a/services/input/InputReader.cpp +++ b/services/input/InputReader.cpp @@ -80,6 +80,10 @@ inline static float pythag(float x, float y) { return sqrtf(x * x + y * y); } +inline static int32_t signExtendNybble(int32_t value) { + return value >= 8 ? value - 16 : value; +} + static inline const char* toString(bool value) { return value ? "true" : "false"; } @@ -1917,6 +1921,8 @@ void TouchInputMapper::parseCalibration() { out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_NONE; } else if (orientationCalibrationString == "interpolated") { out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_INTERPOLATED; + } else if (orientationCalibrationString == "vector") { + out.orientationCalibration = Calibration::ORIENTATION_CALIBRATION_VECTOR; } else if (orientationCalibrationString != "default") { LOGW("Invalid value for touch.orientation.calibration: '%s'", orientationCalibrationString.string()); @@ -2152,6 +2158,9 @@ void TouchInputMapper::dumpCalibration(String8& dump) { case Calibration::ORIENTATION_CALIBRATION_INTERPOLATED: dump.append(INDENT4 "touch.orientation.calibration: interpolated\n"); break; + case Calibration::ORIENTATION_CALIBRATION_VECTOR: + dump.append(INDENT4 "touch.orientation.calibration: vector\n"); + break; default: assert(false); } @@ -2567,6 +2576,19 @@ void TouchInputMapper::dispatchTouch(nsecs_t when, uint32_t policyFlags, case Calibration::ORIENTATION_CALIBRATION_INTERPOLATED: orientation = in.orientation * mLocked.orientationScale; break; + case Calibration::ORIENTATION_CALIBRATION_VECTOR: { + int32_t c1 = signExtendNybble((in.orientation & 0xf0) >> 4); + int32_t c2 = signExtendNybble(in.orientation & 0x0f); + if (c1 != 0 || c2 != 0) { + orientation = atan2f(c1, c2) * 0.5f; + float minorAxisScale = (16.0f - pythag(c1, c2)) / 16.0f; + toolMinor *= minorAxisScale; + touchMinor *= minorAxisScale; + } else { + orientation = 0; + } + break; + } default: orientation = 0; } @@ -2586,7 +2608,6 @@ void TouchInputMapper::dispatchTouch(nsecs_t when, uint32_t policyFlags, case DISPLAY_ORIENTATION_180: { x = mLocked.surfaceWidth - x; y = mLocked.surfaceHeight - y; - orientation = - orientation; break; } case DISPLAY_ORIENTATION_270: { diff --git a/services/input/InputReader.h b/services/input/InputReader.h index 8c849c4..8b2d40a 100644 --- a/services/input/InputReader.h +++ b/services/input/InputReader.h @@ -680,6 +680,7 @@ protected: ORIENTATION_CALIBRATION_DEFAULT, ORIENTATION_CALIBRATION_NONE, ORIENTATION_CALIBRATION_INTERPOLATED, + ORIENTATION_CALIBRATION_VECTOR, }; OrientationCalibration orientationCalibration; |