Home | History | Annotate | Download | only in protocol
      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