summaryrefslogtreecommitdiffstats
path: root/remoting/host/chromeos/point_transformer.h
blob: f20f2208d50c095a68c768d386171cae6f2c8944 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_HOST_CHROMEOS_POINT_TRANSFORMER_H_
#define REMOTING_HOST_CHROMEOS_POINT_TRANSFORMER_H_

#include "base/macros.h"
#include "ui/aura/window_observer.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/gfx/transform.h"

namespace aura {
class Window;
}  // namespace aura

namespace remoting {

// A class that performs coordinate transformations between the root window
// coordinates and the native screen coordinates, according to the current
// display rotation settings.
//
// Root window coordinates are expressed relative to the top left corner of the
// root window whereas native screen coordinates are expressed relative to the
// top left corner of the frame buffer, which may not match the root window
// either in origin nor orientation.  Both coordinate systems are always in
// device pixels.
//
// For example, when the display is rotated by 90 deg, the pixel at root window
// coordinates (x, y) will have native screen coordinates (height - y, x).
class PointTransformer : public aura::WindowObserver {
 public:
  PointTransformer();
  ~PointTransformer() override;

  // Converts from root window coordinates to native screen coordinates.
  gfx::PointF ToScreenCoordinates(const gfx::PointF& window_location);

  // Converts from native screen coordinates to root window coordinates.
  gfx::PointF FromScreenCoordinates(const gfx::PointF& screen_location);

 private:
  // aura::WindowObserver interface.
  void OnWindowTransformed(aura::Window* window) override;

  aura::Window* root_window_;
  gfx::Transform root_to_screen_;
  gfx::Transform screen_to_root_;

  DISALLOW_COPY_AND_ASSIGN(PointTransformer);
};

}  // namespace remoting

#endif  // REMOTING_HOST_CHROMEOS_POINT_TRANSFORMER_H_