blob: 7467ebfddd2bed224b8217e6be0dac4afe919497 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/ui/scenic/lib/input/helper.h"
#include <lib/trace/event.h>
#include "src/ui/scenic/lib/utils/math.h"
namespace scenic_impl::input {
using PointerEventPhase = fuchsia::ui::input::PointerEventPhase;
using GfxPointerEvent = fuchsia::ui::input::PointerEvent;
std::pair<float, float> ReversePointerTraceHACK(trace_flow_id_t trace_id) {
float fhigh, flow;
const uint32_t ihigh = (uint32_t)(trace_id >> 32);
const uint32_t ilow = (uint32_t)trace_id;
memcpy(&fhigh, &ihigh, sizeof(uint32_t));
memcpy(&flow, &ilow, sizeof(uint32_t));
return {fhigh, flow};
}
PointerEventPhase InternalPhaseToGfxPhase(Phase phase) {
switch (phase) {
case Phase::kAdd:
return PointerEventPhase::ADD;
case Phase::kChange:
return PointerEventPhase::MOVE;
case Phase::kRemove:
return PointerEventPhase::REMOVE;
case Phase::kCancel:
return PointerEventPhase::CANCEL;
case Phase::kInvalid:
FX_CHECK(false) << "Should never be reached.";
return static_cast<PointerEventPhase>(0);
};
}
GfxPointerEvent InternalTouchEventToGfxPointerEvent(const InternalTouchEvent& internal_event,
fuchsia::ui::input::PointerEventType type,
uint64_t trace_id) {
GfxPointerEvent event;
event.event_time = internal_event.timestamp;
event.device_id = internal_event.device_id;
event.pointer_id = internal_event.pointer_id;
event.type = type;
event.buttons = internal_event.buttons;
// Convert to view-local coordinates.
FX_DCHECK(internal_event.viewport.receiver_from_viewport_transform.has_value());
const glm::mat4 view_from_viewport_transform = utils::ColumnMajorMat3ArrayToMat4(
internal_event.viewport.receiver_from_viewport_transform.value());
const glm::vec2 local_position = utils::TransformPointerCoords(
internal_event.position_in_viewport, view_from_viewport_transform);
event.x = local_position.x;
event.y = local_position.y;
const auto [high, low] = ReversePointerTraceHACK(trace_id);
event.radius_minor = low; // Lower 32 bits.
event.radius_major = high; // Upper 32 bits.
event.phase = InternalPhaseToGfxPhase(internal_event.phase);
return event;
}
} // namespace scenic_impl::input