mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Eliminate duplicated code when dealing with pointer data (flutter/engine#36822)
* add methods * add empty test * add unit test * Update licenses_flutter * add const * size -> get length * add boundary checks * add tests * remove death test since it says "Death tests use fork(), which is unsafe particularly in a threaded context."
This commit is contained in:
parent
751e4a2424
commit
3ac82e66e3
@ -1781,6 +1781,7 @@ FILE: ../../../flutter/lib/ui/window/pointer_data_packet.h
|
||||
FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.cc
|
||||
FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.h
|
||||
FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc
|
||||
FILE: ../../../flutter/lib/ui/window/pointer_data_packet_unittests.cc
|
||||
FILE: ../../../flutter/lib/ui/window/viewport_metrics.cc
|
||||
FILE: ../../../flutter/lib/ui/window/viewport_metrics.h
|
||||
FILE: ../../../flutter/lib/ui/window/window.cc
|
||||
|
||||
@ -239,6 +239,7 @@ if (enable_unittests) {
|
||||
"window/platform_message_response_dart_port_unittests.cc",
|
||||
"window/platform_message_response_dart_unittests.cc",
|
||||
"window/pointer_data_packet_converter_unittests.cc",
|
||||
"window/pointer_data_packet_unittests.cc",
|
||||
]
|
||||
|
||||
deps = [
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "flutter/lib/ui/window/pointer_data_packet.h"
|
||||
#include "flutter/fml/logging.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
@ -17,7 +18,19 @@ PointerDataPacket::PointerDataPacket(uint8_t* data, size_t num_bytes)
|
||||
PointerDataPacket::~PointerDataPacket() = default;
|
||||
|
||||
void PointerDataPacket::SetPointerData(size_t i, const PointerData& data) {
|
||||
FML_DCHECK(i < GetLength());
|
||||
memcpy(&data_[i * sizeof(PointerData)], &data, sizeof(PointerData));
|
||||
}
|
||||
|
||||
PointerData PointerDataPacket::GetPointerData(size_t i) const {
|
||||
FML_DCHECK(i < GetLength());
|
||||
PointerData result;
|
||||
memcpy(&result, &data_[i * sizeof(PointerData)], sizeof(PointerData));
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t PointerDataPacket::GetLength() const {
|
||||
return data_.size() / sizeof(PointerData);
|
||||
}
|
||||
|
||||
} // namespace flutter
|
||||
|
||||
@ -20,6 +20,8 @@ class PointerDataPacket {
|
||||
~PointerDataPacket();
|
||||
|
||||
void SetPointerData(size_t i, const PointerData& data);
|
||||
PointerData GetPointerData(size_t i) const;
|
||||
size_t GetLength() const;
|
||||
const std::vector<uint8_t>& data() const { return data_; }
|
||||
|
||||
private:
|
||||
|
||||
@ -17,17 +17,11 @@ PointerDataPacketConverter::~PointerDataPacketConverter() = default;
|
||||
|
||||
std::unique_ptr<PointerDataPacket> PointerDataPacketConverter::Convert(
|
||||
std::unique_ptr<PointerDataPacket> packet) {
|
||||
size_t kBytesPerPointerData = kPointerDataFieldCount * kBytesPerField;
|
||||
auto buffer = packet->data();
|
||||
size_t buffer_length = buffer.size();
|
||||
|
||||
std::vector<PointerData> converted_pointers;
|
||||
// Converts each pointer data in the buffer and stores it in the
|
||||
// converted_pointers.
|
||||
for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) {
|
||||
PointerData pointer_data;
|
||||
memcpy(&pointer_data, &buffer[i * kBytesPerPointerData],
|
||||
sizeof(PointerData));
|
||||
for (size_t i = 0; i < packet->GetLength(); i++) {
|
||||
PointerData pointer_data = packet->GetPointerData(i);
|
||||
ConvertPointerData(pointer_data, converted_pointers);
|
||||
}
|
||||
|
||||
|
||||
@ -133,14 +133,8 @@ void CreateSimulatedTrackpadGestureData(PointerData& data, // NOLINT
|
||||
|
||||
void UnpackPointerPacket(std::vector<PointerData>& output, // NOLINT
|
||||
std::unique_ptr<PointerDataPacket> packet) {
|
||||
size_t kBytesPerPointerData = kPointerDataFieldCount * kBytesPerField;
|
||||
auto buffer = packet->data();
|
||||
size_t buffer_length = buffer.size();
|
||||
|
||||
for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) {
|
||||
PointerData pointer_data;
|
||||
memcpy(&pointer_data, &buffer[i * kBytesPerPointerData],
|
||||
sizeof(PointerData));
|
||||
for (size_t i = 0; i < packet->GetLength(); i++) {
|
||||
PointerData pointer_data = packet->GetPointerData(i);
|
||||
output.push_back(pointer_data);
|
||||
}
|
||||
packet.reset();
|
||||
|
||||
@ -0,0 +1,69 @@
|
||||
// Copyright 2013 The Flutter 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 "flutter/lib/ui/window/pointer_data.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "pointer_data_packet.h"
|
||||
|
||||
namespace flutter {
|
||||
namespace testing {
|
||||
|
||||
void CreateSimpleSimulatedPointerData(PointerData& data, // NOLINT
|
||||
PointerData::Change change,
|
||||
int64_t device,
|
||||
double dx,
|
||||
double dy,
|
||||
int64_t buttons) {
|
||||
data.time_stamp = 0;
|
||||
data.change = change;
|
||||
data.kind = PointerData::DeviceKind::kTouch;
|
||||
data.signal_kind = PointerData::SignalKind::kNone;
|
||||
data.device = device;
|
||||
data.pointer_identifier = 0;
|
||||
data.physical_x = dx;
|
||||
data.physical_y = dy;
|
||||
data.physical_delta_x = 0.0;
|
||||
data.physical_delta_y = 0.0;
|
||||
data.buttons = buttons;
|
||||
data.obscured = 0;
|
||||
data.synthesized = 0;
|
||||
data.pressure = 0.0;
|
||||
data.pressure_min = 0.0;
|
||||
data.pressure_max = 0.0;
|
||||
data.distance = 0.0;
|
||||
data.distance_max = 0.0;
|
||||
data.size = 0.0;
|
||||
data.radius_major = 0.0;
|
||||
data.radius_minor = 0.0;
|
||||
data.radius_min = 0.0;
|
||||
data.radius_max = 0.0;
|
||||
data.orientation = 0.0;
|
||||
data.tilt = 0.0;
|
||||
data.platformData = 0;
|
||||
data.scroll_delta_x = 0.0;
|
||||
data.scroll_delta_y = 0.0;
|
||||
}
|
||||
|
||||
TEST(PointerDataPacketTest, CanGetPointerData) {
|
||||
auto packet = std::make_unique<PointerDataPacket>(1);
|
||||
PointerData data;
|
||||
CreateSimpleSimulatedPointerData(data, PointerData::Change::kAdd, 1, 2.0, 3.0,
|
||||
4);
|
||||
packet->SetPointerData(0, data);
|
||||
|
||||
PointerData data_recovered = packet->GetPointerData(0);
|
||||
ASSERT_EQ(data_recovered.physical_x, 2.0);
|
||||
ASSERT_EQ(data_recovered.physical_y, 3.0);
|
||||
}
|
||||
|
||||
TEST(PointerDataPacketTest, CanGetLength) {
|
||||
auto packet = std::make_unique<PointerDataPacket>(6);
|
||||
ASSERT_EQ(packet->GetLength(), (size_t)6);
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace flutter
|
||||
@ -379,15 +379,8 @@ std::string ToString(const fml::Mapping& mapping) {
|
||||
// Stolen from pointer_data_packet_converter_unittests.cc.
|
||||
void UnpackPointerPacket(std::vector<flutter::PointerData>& output, // NOLINT
|
||||
std::unique_ptr<flutter::PointerDataPacket> packet) {
|
||||
size_t kBytesPerPointerData =
|
||||
flutter::kPointerDataFieldCount * flutter::kBytesPerField;
|
||||
auto buffer = packet->data();
|
||||
size_t buffer_length = buffer.size();
|
||||
|
||||
for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) {
|
||||
flutter::PointerData pointer_data;
|
||||
memcpy(&pointer_data, &buffer[i * kBytesPerPointerData],
|
||||
sizeof(flutter::PointerData));
|
||||
for (size_t i = 0; i < packet->GetLength(); i++) {
|
||||
flutter::PointerData pointer_data = packet->GetPointerData(i);
|
||||
output.push_back(pointer_data);
|
||||
}
|
||||
packet.reset();
|
||||
|
||||
@ -484,15 +484,8 @@ std::string ToString(const fml::Mapping& mapping) {
|
||||
// Stolen from pointer_data_packet_converter_unittests.cc.
|
||||
void UnpackPointerPacket(std::vector<flutter::PointerData>& output, // NOLINT
|
||||
std::unique_ptr<flutter::PointerDataPacket> packet) {
|
||||
size_t kBytesPerPointerData =
|
||||
flutter::kPointerDataFieldCount * flutter::kBytesPerField;
|
||||
auto buffer = packet->data();
|
||||
size_t buffer_length = buffer.size();
|
||||
|
||||
for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) {
|
||||
flutter::PointerData pointer_data;
|
||||
memcpy(&pointer_data, &buffer[i * kBytesPerPointerData],
|
||||
sizeof(flutter::PointerData));
|
||||
for (size_t i = 0; i < packet->GetLength(); i++) {
|
||||
flutter::PointerData pointer_data = packet->GetPointerData(i);
|
||||
output.push_back(pointer_data);
|
||||
}
|
||||
packet.reset();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user