44
55#include " flutter/lib/ui/window/pointer_data_packet_converter.h"
66
7+ #include < cmath>
78#include < cstring>
89
910#include " flutter/fml/logging.h"
@@ -207,6 +208,88 @@ void PointerDataPacketConverter::ConvertPointerData(
207208 converted_pointers.push_back (pointer_data);
208209 break ;
209210 }
211+ case PointerData::Change::kPanZoomStart : {
212+ // Makes sure we have an existing pointer
213+ auto iter = states_.find (pointer_data.device );
214+ PointerState state;
215+ if (iter == states_.end ()) {
216+ // Synthesizes add event if the pointer is not previously added.
217+ PointerData synthesized_add_event = pointer_data;
218+ synthesized_add_event.change = PointerData::Change::kAdd ;
219+ synthesized_add_event.synthesized = 1 ;
220+ synthesized_add_event.buttons = 0 ;
221+ state = EnsurePointerState (synthesized_add_event);
222+ converted_pointers.push_back (synthesized_add_event);
223+ } else {
224+ state = iter->second ;
225+ }
226+ FML_DCHECK (!state.is_down );
227+ FML_DCHECK (!state.is_pan_zoom_active );
228+ if (LocationNeedsUpdate (pointer_data, state)) {
229+ // Synthesizes a hover event if the location does not match.
230+ PointerData synthesized_hover_event = pointer_data;
231+ synthesized_hover_event.change = PointerData::Change::kHover ;
232+ synthesized_hover_event.synthesized = 1 ;
233+ synthesized_hover_event.buttons = 0 ;
234+
235+ UpdateDeltaAndState (synthesized_hover_event, state);
236+ converted_pointers.push_back (synthesized_hover_event);
237+ }
238+
239+ UpdatePointerIdentifier (pointer_data, state, true );
240+ state.is_pan_zoom_active = true ;
241+ state.pan_x = 0 ;
242+ state.pan_y = 0 ;
243+ state.scale = 1 ;
244+ state.rotation = 0 ;
245+ states_[pointer_data.device ] = state;
246+ converted_pointers.push_back (pointer_data);
247+ break ;
248+ }
249+ case PointerData::Change::kPanZoomUpdate : {
250+ // Makes sure we have an existing pointer in pan_zoom_active state
251+ auto iter = states_.find (pointer_data.device );
252+ FML_DCHECK (iter != states_.end ());
253+ PointerState state = iter->second ;
254+ FML_DCHECK (!state.is_down );
255+ FML_DCHECK (state.is_pan_zoom_active );
256+
257+ UpdatePointerIdentifier (pointer_data, state, false );
258+ UpdateDeltaAndState (pointer_data, state);
259+
260+ converted_pointers.push_back (pointer_data);
261+ break ;
262+ }
263+ case PointerData::Change::kPanZoomEnd : {
264+ // Makes sure we have an existing pointer in pan_zoom_active state
265+ auto iter = states_.find (pointer_data.device );
266+ FML_DCHECK (iter != states_.end ());
267+ PointerState state = iter->second ;
268+ FML_DCHECK (state.is_pan_zoom_active );
269+
270+ UpdatePointerIdentifier (pointer_data, state, false );
271+
272+ if (LocationNeedsUpdate (pointer_data, state)) {
273+ // Synthesizes an update event if the location does not match.
274+ PointerData synthesized_move_event = pointer_data;
275+ synthesized_move_event.change = PointerData::Change::kPanZoomUpdate ;
276+ synthesized_move_event.pan_x = state.pan_x ;
277+ synthesized_move_event.pan_y = state.pan_y ;
278+ synthesized_move_event.pan_delta_x = 0 ;
279+ synthesized_move_event.pan_delta_y = 0 ;
280+ synthesized_move_event.scale = state.scale ;
281+ synthesized_move_event.rotation = state.rotation ;
282+ synthesized_move_event.synthesized = 1 ;
283+
284+ UpdateDeltaAndState (synthesized_move_event, state);
285+ converted_pointers.push_back (synthesized_move_event);
286+ }
287+
288+ state.is_pan_zoom_active = false ;
289+ states_[pointer_data.device ] = state;
290+ converted_pointers.push_back (pointer_data);
291+ break ;
292+ }
210293 default : {
211294 converted_pointers.push_back (pointer_data);
212295 break ;
@@ -261,8 +344,11 @@ PointerState PointerDataPacketConverter::EnsurePointerState(
261344 PointerState state;
262345 state.pointer_identifier = 0 ;
263346 state.is_down = false ;
347+ state.is_pan_zoom_active = false ;
264348 state.physical_x = pointer_data.physical_x ;
265349 state.physical_y = pointer_data.physical_y ;
350+ state.pan_x = pointer_data.pan_x ;
351+ state.pan_y = pointer_data.pan_y ;
266352 states_[pointer_data.device ] = state;
267353 return state;
268354}
@@ -271,8 +357,14 @@ void PointerDataPacketConverter::UpdateDeltaAndState(PointerData& pointer_data,
271357 PointerState& state) {
272358 pointer_data.physical_delta_x = pointer_data.physical_x - state.physical_x ;
273359 pointer_data.physical_delta_y = pointer_data.physical_y - state.physical_y ;
360+ pointer_data.pan_delta_x = pointer_data.pan_x - state.pan_x ;
361+ pointer_data.pan_delta_y = pointer_data.pan_y - state.pan_y ;
274362 state.physical_x = pointer_data.physical_x ;
275363 state.physical_y = pointer_data.physical_y ;
364+ state.pan_x = pointer_data.pan_x ;
365+ state.pan_y = pointer_data.pan_y ;
366+ state.scale = pointer_data.scale ;
367+ state.rotation = pointer_data.rotation ;
276368 states_[pointer_data.device ] = state;
277369}
278370
0 commit comments