// 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.

#ifndef PPAPI_CPP_TOUCH_POINT_H_
#define PPAPI_CPP_TOUCH_POINT_H_

#include "ppapi/c/ppb_input_event.h"
#include "ppapi/cpp/input_event.h"
#include "ppapi/cpp/point.h"

namespace pp {

/// Wrapper class for PP_TouchPoint.
class TouchPoint {
 public:
  TouchPoint() : touch_point_(PP_MakeTouchPoint()) {}

  TouchPoint(const PP_TouchPoint& point) : touch_point_(point) {}

  /// @return The identifier for this TouchPoint. This corresponds to the order
  /// in which the points were pressed. For example, the first point to be
  /// pressed has an id of 0, the second has an id of 1, and so on. An id can be
  /// reused when a touch point is released.  For example, if two fingers are
  /// down, with id 0 and 1, and finger 0 releases, the next finger to be
  /// pressed can be assigned to id 0.
  uint32_t id() const { return touch_point_.id; }

  /// @return The x-y coordinates of this TouchPoint, in DOM coordinate space.
  FloatPoint position() const {
    return pp::FloatPoint(touch_point_.position);
  }

  /// @return The elliptical radii, in screen pixels, in the x and y direction
  /// of this TouchPoint.
  FloatPoint radii() const { return pp::FloatPoint(touch_point_.radius); }

  /// @return The angle of rotation of the elliptical model of this TouchPoint
  /// from the y-axis.
  float rotation_angle() const { return touch_point_.rotation_angle; }

  /// @return The pressure applied to this TouchPoint.  This is typically a
  /// value between 0 and 1, with 0 indicating no pressure and 1 indicating
  /// some maximum pressure, but scaling differs depending on the hardware and
  /// the value is not guaranteed to stay within that range.
  float pressure() const { return touch_point_.pressure; }

 private:
  PP_TouchPoint touch_point_;
};

}  // namespace pp

#endif  /* PPAPI_CPP_TOUCH_POINT_H_ */
