blob: 3bcc9ae3a582dc07d0be5c9d16d95ab51471f7e0 [file] [log] [blame]
// Copyright 2018 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 CONTENT_RENDERER_INPUT_INPUT_EVENT_PREDICTION_H_
#define CONTENT_RENDERER_INPUT_INPUT_EVENT_PREDICTION_H_
#include <list>
#include <unordered_map>
#include "content/renderer/input/scoped_web_input_event_with_latency_info.h"
#include "ui/events/blink/prediction/input_predictor.h"
#include "ui/events/event.h"
using blink::WebInputEvent;
using blink::WebPointerProperties;
namespace content {
// Handle resampling of WebMouseEvent, WebTouchEvent and WebPointerEvent.
// This class stores prediction of all active pointers.
class CONTENT_EXPORT InputEventPrediction {
public:
InputEventPrediction();
~InputEventPrediction();
void HandleEvents(const blink::WebCoalescedInputEvent& coalesced_event,
base::TimeTicks frame_time,
blink::WebInputEvent* event);
// Initialize predictor for different pointer.
std::unique_ptr<ui::InputPredictor> CreatePredictor() const;
private:
friend class InputEventPredictionTest;
enum class PredictorType { kEmpty, kLsq, kKalman };
// The following three function is for handling multiple TouchPoints in a
// WebTouchEvent. They should be more neat when WebTouchEvent is elimated.
// Cast events from WebInputEvent to WebPointerProperties. Call
// UpdateSinglePointer for each pointer.
void UpdatePrediction(const WebInputEvent& event);
// Cast events from WebInputEvent to WebPointerProperties. Call
// ResamplingSinglePointer for each poitner.
void ApplyResampling(base::TimeTicks frame_time, WebInputEvent* event);
// Cast events from WebInputEvent to WebPointerProperties. Call
// ResetSinglePredictor for each pointer.
void ResetPredictor(const WebInputEvent& event);
// Get single predictor based on event id and type, and update the predictor
// with new events coords.
void UpdateSinglePointer(const WebPointerProperties& event,
base::TimeTicks time);
// Get single predictor based on event id and type, apply resampling event
// coordinates.
bool ResampleSinglePointer(base::TimeTicks time, WebPointerProperties* event);
// Get single predictor based on event id and type. For mouse, reset the
// predictor, for other pointer type, remove it from mapping.
void ResetSinglePredictor(const WebPointerProperties& event);
std::unordered_map<ui::PointerId, std::unique_ptr<ui::InputPredictor>>
pointer_id_predictor_map_;
std::unique_ptr<ui::InputPredictor> mouse_predictor_;
// Store the field trial parameter used for choosing different types of
// predictor.
PredictorType selected_predictor_type_;
DISALLOW_COPY_AND_ASSIGN(InputEventPrediction);
};
} // namespace content
#endif // CONTENT_RENDERER_INPUT_INPUT_EVENT_PREDICTION_H_