| Index: content/browser/android/touch_point.cc | 
| diff --git a/content/browser/android/touch_point.cc b/content/browser/android/touch_point.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..17d888d3aa4a2a50931384eefa0ca618cb101d0f | 
| --- /dev/null | 
| +++ b/content/browser/android/touch_point.cc | 
| @@ -0,0 +1,108 @@ | 
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "content/browser/android/touch_point.h" | 
| + | 
| +#include "base/debug/debugger.h" | 
| +#include "base/time.h" | 
| +#include "base/logging.h" | 
| + | 
| +#include "jni/touch_point_jni.h" | 
| + | 
| +using WebKit::WebTouchEvent; | 
| +using WebKit::WebTouchPoint; | 
| + | 
| +namespace { | 
| + | 
| +void MaybeAddTouchPoint(JNIEnv* env, jobject pt, WebKit::WebTouchEvent& event) { | 
| +  WebTouchPoint::State state = static_cast<WebTouchPoint::State>( | 
| +      Java_TouchPoint_getState(env, pt)); | 
| +  if (state == WebTouchPoint::StateUndefined) | 
| +    return; | 
| + | 
| +  // When generating a cancel event from an event of a different type, the | 
| +  // touch points are out of sync, so we ensure the points are marked as | 
| +  // canceled as well. | 
| +  if (event.type == WebTouchEvent::TouchCancel) | 
| +    state = WebTouchPoint::StateCancelled; | 
| + | 
| +  // Record the current number of points in the WebTouchEvent | 
| +  const int idx = event.touchesLength; | 
| +  DCHECK_LT(idx, WebKit::WebTouchEvent::touchesLengthCap); | 
| + | 
| +  WebTouchPoint wtp; | 
| +  wtp.id = Java_TouchPoint_getId(env, pt); | 
| +  wtp.state = state; | 
| +  wtp.position.x = Java_TouchPoint_getX(env, pt); | 
| +  wtp.position.y = Java_TouchPoint_getY(env, pt); | 
| +  // TODO(joth): Raw event co-ordinates. | 
| +  wtp.screenPosition = wtp.position; | 
| +  wtp.force = Java_TouchPoint_getPressure(env, pt); | 
| + | 
| +  // TODO(djsollen): WebKit stores touch point size as a pair of radii, which | 
| +  // are integers.  We receive touch point size from Android as a float | 
| +  // between 0 and 1 and interpret 'size' as an elliptical area.  We convert | 
| +  // size to a radius and then scale up to avoid truncating away all of the | 
| +  // data. W3C spec is for the radii to be in units of screen pixels. Need to | 
| +  // change. | 
| +  const static double PI = 3.1415926; | 
| +  const static double SCALE_FACTOR = 1024.0; | 
| +  const int radius = static_cast<int>( | 
| +      (sqrt(Java_TouchPoint_getSize(env, pt)) / PI) * SCALE_FACTOR); | 
| +  wtp.radiusX = radius; | 
| +  wtp.radiusY = radius; | 
| +  // Since our radii are equal, a rotation angle doesn't mean anything. | 
| +  wtp.rotationAngle = 0.0; | 
| + | 
| +  // Add the newly created WebTouchPoint to the event | 
| +  event.touches[idx] = wtp; | 
| +  ++(event.touchesLength); | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| +namespace content { | 
| + | 
| +void TouchPoint::BuildWebTouchEvent(JNIEnv* env, jint type, jlong time_ms, | 
| +    jobjectArray pts, WebKit::WebTouchEvent& event) { | 
| +  event.type = static_cast<WebTouchEvent::Type>(type); | 
| +  event.timeStampSeconds = | 
| +      static_cast<double>(time_ms) / base::Time::kMillisecondsPerSecond; | 
| +  int arrayLength = env->GetArrayLength(pts); | 
| +  // Loop until either all of the input points have been consumed or the output | 
| +  // array has been filled | 
| +  for (int i = 0; i < arrayLength; i++) { | 
| +    jobject pt = env->GetObjectArrayElement(pts, i); | 
| +    MaybeAddTouchPoint(env, pt, event); | 
| +    if (event.touchesLength >= event.touchesLengthCap) | 
| +      break; | 
| +  } | 
| +  DCHECK_GT(event.touchesLength, 0U); | 
| +} | 
| + | 
| +static void RegisterConstants(JNIEnv* env) { | 
| +   Java_TouchPoint_initializeConstants( | 
| +       env, | 
| +       WebKit::WebTouchEvent::TouchStart, | 
| +       WebKit::WebTouchEvent::TouchMove, | 
| +       WebKit::WebTouchEvent::TouchEnd, | 
| +       WebKit::WebTouchEvent::TouchCancel, | 
| +       WebKit::WebTouchPoint::StateUndefined, | 
| +       WebKit::WebTouchPoint::StateReleased, | 
| +       WebKit::WebTouchPoint::StatePressed, | 
| +       WebKit::WebTouchPoint::StateMoved, | 
| +       WebKit::WebTouchPoint::StateStationary, | 
| +       WebKit::WebTouchPoint::StateCancelled); | 
| +} | 
| + | 
| +bool RegisterTouchPoint(JNIEnv* env) { | 
| +  if (!RegisterNativesImpl(env)) | 
| +    return false; | 
| + | 
| +  RegisterConstants(env); | 
| + | 
| +  return true; | 
| +} | 
| + | 
| +}  // namespace content | 
|  |