1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "remoting/protocol/mouse_input_filter.h" 6 7 #include "remoting/proto/event.pb.h" 8 9 namespace remoting { 10 namespace protocol { 11 12 MouseInputFilter::MouseInputFilter() { 13 } 14 15 MouseInputFilter::MouseInputFilter(InputStub* input_stub) 16 : InputFilter(input_stub) { 17 input_max_.setEmpty(); 18 output_max_.setEmpty(); 19 } 20 21 MouseInputFilter::~MouseInputFilter() { 22 } 23 24 void MouseInputFilter::InjectMouseEvent(const MouseEvent& event) { 25 if (input_max_.isEmpty() || output_max_.isEmpty()) 26 return; 27 28 // We scale based on the maximum input & output coordinates, rather than the 29 // input and output sizes, so that it's possible to reach the edge of the 30 // output when up-scaling. We also take care to round up or down correctly, 31 // which is important when down-scaling. 32 MouseEvent out_event(event); 33 if (out_event.has_x()) { 34 int x = out_event.x() * output_max_.width(); 35 x = (x + input_max_.width() / 2) / input_max_.width(); 36 out_event.set_x(std::max(0, std::min(output_max_.width(), x))); 37 } 38 if (out_event.has_y()) { 39 int y = out_event.y() * output_max_.height(); 40 y = (y + input_max_.height() / 2) / input_max_.height(); 41 out_event.set_y(std::max(0, std::min(output_max_.height(), y))); 42 } 43 44 InputFilter::InjectMouseEvent(out_event); 45 } 46 47 void MouseInputFilter::set_input_size(const SkISize& size) { 48 input_max_ = SkISize::Make(size.width() - 1, size.height() - 1); 49 } 50 51 void MouseInputFilter::set_output_size(const SkISize& size) { 52 output_max_ = SkISize::Make(size.width() - 1, size.height() - 1); 53 } 54 55 } // namespace protocol 56 } // namespace remoting 57