21 std::vector<PointerData> converted_pointers;
26 ConvertPointerData(pointer_data, converted_pointers);
30 auto converted_packet =
31 std::make_unique<flutter::PointerDataPacket>(converted_pointers.size());
33 for (
auto& converted_pointer : converted_pointers) {
34 converted_packet->SetPointerData(count++, converted_pointer);
37 return converted_packet;
40void PointerDataPacketConverter::ConvertPointerData(
42 std::vector<PointerData>& converted_pointers) {
48 switch (pointer_data.
change) {
54 auto iter = states_.find(pointer_data.
device);
55 if (iter != states_.end()) {
56 PointerState state = iter->second;
58 UpdatePointerIdentifier(pointer_data, state,
false);
60 if (LocationNeedsUpdate(pointer_data, state)) {
62 PointerData synthesized_move_event = pointer_data;
64 synthesized_move_event.synthesized = 1;
66 UpdateDeltaAndState(synthesized_move_event, state);
67 converted_pointers.push_back(synthesized_move_event);
70 state.is_down =
false;
71 states_[pointer_data.
device] = state;
72 converted_pointers.push_back(pointer_data);
77 auto iter = states_.find(pointer_data.
device);
78 if (iter != states_.end()) {
81 PointerState state = iter->second;
82 PointerData synthesized_data = pointer_data;
83 synthesized_data.
physical_x = state.physical_x;
84 synthesized_data.physical_y = state.physical_y;
85 synthesized_data.pan_x = state.pan_x;
86 synthesized_data.pan_y = state.pan_y;
87 synthesized_data.scale = state.scale;
88 synthesized_data.rotation = state.rotation;
89 synthesized_data.buttons = state.buttons;
90 synthesized_data.synthesized = 1;
97 synthesized_data.view_id = state.view_id;
101 PointerData synthesized_cancel_event = synthesized_data;
103 UpdatePointerIdentifier(synthesized_cancel_event, state,
false);
105 state.is_down =
false;
106 converted_pointers.push_back(synthesized_cancel_event);
110 PointerData synthesized_remove_event = synthesized_data;
113 converted_pointers.push_back(synthesized_remove_event);
116 EnsurePointerState(pointer_data);
117 converted_pointers.push_back(pointer_data);
122 auto iter = states_.find(pointer_data.
device);
124 PointerState state = iter->second;
125 if (state.view_id != pointer_data.
view_id) {
133 PointerData synthesized_cancel_event = pointer_data;
135 synthesized_cancel_event.synthesized = 1;
136 UpdatePointerIdentifier(synthesized_cancel_event, state,
false);
138 state.is_down =
false;
139 states_[synthesized_cancel_event.device] = state;
140 converted_pointers.push_back(synthesized_cancel_event);
143 if (LocationNeedsUpdate(pointer_data, state)) {
145 PointerData synthesized_hover_event = pointer_data;
147 synthesized_hover_event.synthesized = 1;
149 UpdateDeltaAndState(synthesized_hover_event, state);
150 converted_pointers.push_back(synthesized_hover_event);
153 states_.erase(pointer_data.
device);
154 converted_pointers.push_back(pointer_data);
158 auto iter = states_.find(pointer_data.
device);
160 if (iter == states_.end()) {
162 PointerData synthesized_add_event = pointer_data;
164 synthesized_add_event.synthesized = 1;
165 synthesized_add_event.buttons = 0;
166 state = EnsurePointerState(synthesized_add_event);
167 converted_pointers.push_back(synthesized_add_event);
169 state = iter->second;
173 state.buttons = pointer_data.
buttons;
174 if (LocationNeedsUpdate(pointer_data, state)) {
175 UpdateDeltaAndState(pointer_data, state);
176 converted_pointers.push_back(pointer_data);
181 auto iter = states_.find(pointer_data.
device);
183 if (iter == states_.end()) {
185 PointerData synthesized_add_event = pointer_data;
187 synthesized_add_event.synthesized = 1;
188 synthesized_add_event.buttons = 0;
189 state = EnsurePointerState(synthesized_add_event);
190 converted_pointers.push_back(synthesized_add_event);
192 state = iter->second;
196 if (LocationNeedsUpdate(pointer_data, state)) {
198 PointerData synthesized_hover_event = pointer_data;
200 synthesized_hover_event.synthesized = 1;
201 synthesized_hover_event.buttons = 0;
203 UpdateDeltaAndState(synthesized_hover_event, state);
204 converted_pointers.push_back(synthesized_hover_event);
207 UpdatePointerIdentifier(pointer_data, state,
true);
208 state.is_down =
true;
209 state.buttons = pointer_data.
buttons;
210 states_[pointer_data.
device] = state;
211 converted_pointers.push_back(pointer_data);
216 auto iter = states_.find(pointer_data.
device);
218 PointerState state = iter->second;
221 UpdatePointerIdentifier(pointer_data, state,
false);
222 UpdateDeltaAndState(pointer_data, state);
223 state.buttons = pointer_data.
buttons;
224 converted_pointers.push_back(pointer_data);
229 auto iter = states_.find(pointer_data.
device);
231 PointerState state = iter->second;
234 UpdatePointerIdentifier(pointer_data, state,
false);
236 if (LocationNeedsUpdate(pointer_data, state)) {
238 PointerData synthesized_move_event = pointer_data;
240 synthesized_move_event.buttons = state.buttons;
241 synthesized_move_event.synthesized = 1;
243 UpdateDeltaAndState(synthesized_move_event, state);
244 converted_pointers.push_back(synthesized_move_event);
247 state.is_down =
false;
248 state.buttons = pointer_data.
buttons;
249 states_[pointer_data.
device] = state;
250 converted_pointers.push_back(pointer_data);
255 auto iter = states_.find(pointer_data.
device);
257 if (iter == states_.end()) {
259 PointerData synthesized_add_event = pointer_data;
261 synthesized_add_event.synthesized = 1;
262 synthesized_add_event.buttons = 0;
263 state = EnsurePointerState(synthesized_add_event);
264 converted_pointers.push_back(synthesized_add_event);
266 state = iter->second;
270 if (LocationNeedsUpdate(pointer_data, state)) {
272 PointerData synthesized_hover_event = pointer_data;
274 synthesized_hover_event.synthesized = 1;
275 synthesized_hover_event.buttons = 0;
277 UpdateDeltaAndState(synthesized_hover_event, state);
278 converted_pointers.push_back(synthesized_hover_event);
281 UpdatePointerIdentifier(pointer_data, state,
true);
282 state.is_pan_zoom_active =
true;
287 states_[pointer_data.
device] = state;
288 converted_pointers.push_back(pointer_data);
293 auto iter = states_.find(pointer_data.
device);
295 PointerState state = iter->second;
299 UpdatePointerIdentifier(pointer_data, state,
false);
300 UpdateDeltaAndState(pointer_data, state);
302 converted_pointers.push_back(pointer_data);
307 auto iter = states_.find(pointer_data.
device);
309 PointerState state = iter->second;
312 UpdatePointerIdentifier(pointer_data, state,
false);
314 if (LocationNeedsUpdate(pointer_data, state)) {
316 PointerData synthesized_move_event = pointer_data;
318 synthesized_move_event.pan_x = state.pan_x;
319 synthesized_move_event.pan_y = state.pan_y;
320 synthesized_move_event.pan_delta_x = 0;
321 synthesized_move_event.pan_delta_y = 0;
322 synthesized_move_event.scale = state.scale;
323 synthesized_move_event.rotation = state.rotation;
324 synthesized_move_event.synthesized = 1;
326 UpdateDeltaAndState(synthesized_move_event, state);
327 converted_pointers.push_back(synthesized_move_event);
330 state.is_pan_zoom_active =
false;
331 states_[pointer_data.
device] = state;
332 converted_pointers.push_back(pointer_data);
336 converted_pointers.push_back(pointer_data);
346 auto iter = states_.find(pointer_data.
device);
349 if (iter == states_.end()) {
351 PointerData synthesized_add_event = pointer_data;
354 synthesized_add_event.synthesized = 1;
355 synthesized_add_event.buttons = 0;
356 state = EnsurePointerState(synthesized_add_event);
357 converted_pointers.push_back(synthesized_add_event);
359 state = iter->second;
362 if (LocationNeedsUpdate(pointer_data, state)) {
365 PointerData synthesized_move_event = pointer_data;
368 synthesized_move_event.buttons = state.buttons;
369 synthesized_move_event.synthesized = 1;
371 UpdateDeltaAndState(synthesized_move_event, state);
372 converted_pointers.push_back(synthesized_move_event);
375 PointerData synthesized_hover_event = pointer_data;
379 synthesized_hover_event.buttons = 0;
380 synthesized_hover_event.synthesized = 1;
382 UpdateDeltaAndState(synthesized_hover_event, state);
383 converted_pointers.push_back(synthesized_hover_event);
387 converted_pointers.push_back(pointer_data);
398PointerState PointerDataPacketConverter::EnsurePointerState(
399 PointerData pointer_data) {
401 state.pointer_identifier = 0;
402 state.is_down =
false;
403 state.is_pan_zoom_active =
false;
404 state.physical_x = pointer_data.physical_x;
405 state.physical_y = pointer_data.physical_y;
408 state.view_id = pointer_data.view_id;
409 states_[pointer_data.device] = state;
413void PointerDataPacketConverter::UpdateDeltaAndState(PointerData& pointer_data,
414 PointerState& state) {
415 pointer_data.physical_delta_x = pointer_data.physical_x - state.physical_x;
416 pointer_data.physical_delta_y = pointer_data.physical_y - state.physical_y;
417 pointer_data.pan_delta_x = pointer_data.pan_x - state.pan_x;
418 pointer_data.pan_delta_y = pointer_data.pan_y - state.pan_y;
419 state.physical_x = pointer_data.physical_x;
420 state.physical_y = pointer_data.physical_y;
421 state.pan_x = pointer_data.pan_x;
422 state.pan_y = pointer_data.pan_y;
423 state.scale = pointer_data.scale;
424 state.rotation = pointer_data.rotation;
425 states_[pointer_data.device] = state;
428bool PointerDataPacketConverter::LocationNeedsUpdate(
429 const PointerData pointer_data,
430 const PointerState state) {
431 return state.physical_x != pointer_data.physical_x ||
432 state.physical_y != pointer_data.physical_y;
435void PointerDataPacketConverter::UpdatePointerIdentifier(
436 PointerData& pointer_data,
438 bool start_new_pointer) {
439 if (start_new_pointer) {
440 state.pointer_identifier = ++pointer_;
441 states_[pointer_data.device] = state;
443 pointer_data.pointer_identifier = state.pointer_identifier;
virtual bool ViewExists(int64_t view_id) const =0
~PointerDataPacketConverter()
PointerDataPacketConverter(const Delegate &delegate)
Create a PointerDataPacketConverter.
std::unique_ptr< PointerDataPacket > Convert(const PointerDataPacket &packet)
Converts pointer data packet into a form that framework understands. The raw pointer data packet from...
PointerData GetPointerData(size_t i) const
#define FML_DCHECK(condition)