Chromium Code Reviews| Index: remoting/client/desktop_viewport.h |
| diff --git a/remoting/client/desktop_viewport.h b/remoting/client/desktop_viewport.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..dda426fe2b70635ccfc83ae72021bbd44be14fbb |
| --- /dev/null |
| +++ b/remoting/client/desktop_viewport.h |
| @@ -0,0 +1,94 @@ |
| +// Copyright 2017 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_CLIENT_DESKTOP_VIEWPORT_H_ |
| +#define REMOTING_CLIENT_DESKTOP_VIEWPORT_H_ |
| + |
| +#include <array> |
| + |
| +#include "base/callback.h" |
| +#include "remoting/client/simple_matrix.h" |
| + |
|
joedow
2017/04/28 21:29:53
You should include 'remoting/client/viewport_geome
Yuwei
2017/04/28 23:53:40
Obsolete. I broke down viewport_geometry and moved
|
| +namespace remoting { |
| + |
| +// The viewport is a sliding window on the desktop image. This class defines |
| +// the viewport's position and size, provides methods to manipulate it, and |
| +// outputs a desktop space -> surface space transformation matrix for drawing |
| +// the desktop onto the client's view surface on the screen. |
|
joedow
2017/04/28 21:29:53
This is a good comment, but I think it would be go
Yuwei
2017/04/28 23:53:40
Done.
|
| +// |
| +// You may either manipulate the desktop on the surface coordinate or manipulate |
| +// the viewport on the desktop coordinate, depending on how you choose the |
| +// reference frame. |
| +class DesktopViewport { |
| + public: |
| + using TransformationCallback = |
| + base::Callback<void(const std::array<float, 9>&)>; |
| + |
| + DesktopViewport(); |
| + ~DesktopViewport(); |
| + |
| + // Sets the desktop size. |
|
joedow
2017/04/28 21:29:53
nit: You could just refer to the actual member ->
Yuwei
2017/04/28 23:53:40
Done.
|
| + void SetDesktopSize(int desktop_width, int desktop_height); |
| + |
| + // Sets the surface size. |
| + void SetSurfaceSize(int surface_width, int surface_height); |
| + |
| + // Resizes the desktop such that the image is displayed without borders in |
| + // minimum possible zoom-level. This will be called once both the desktop |
| + // and the surface size are set. |
|
joedow
2017/04/28 21:29:53
"This will be called once both the desktop and the
Yuwei
2017/04/28 23:53:40
I just moved it to the private block. SetDesktopSi
|
| + void ResizeToFit(); |
| + |
| + // Translates the desktop on the surface's reference frame by <dx, dy>. |
| + void MoveDesktop(float dx, float dy); |
| + |
| + // Scales the desktop on the surface's reference frame at pivot point (px, py) |
| + // by |scale|. |
| + void ScaleDesktop(float px, float py, float scale); |
| + |
| + // Sets the viewport center to (x, y) on the desktop's coordinate. |
| + void SetViewportCenter(float x, float y); |
| + |
| + // Registers the callback to be called once the transformation has changed. |
| + // run_immediately: If true and the viewport is ready to be used, the callback |
| + // will be called immedately with the transformation matrix. |
| + void RegisterOnTransformationChangedCallback( |
| + const TransformationCallback& callback, |
| + bool run_immediately); |
| + |
| + private: |
| + // True if desktop size and surface size are set. |
| + bool IsViewportReady() const; |
| + |
| + // Adjusts the size and position of the viewport so that the constrains always |
| + // hold, then feed the matrix to |on_transformation_changed_|. |
| + void UpdateViewport(); |
| + |
| + // Gets a rectangle of all possible positions where the viewport's center can |
| + // locate. |
| + Bounds GetViewportCenterBounds() const; |
| + |
| + // Returns the current center of the viewport on the desktop's coordinate. |
| + Point GetViewportCenter() const; |
| + |
| + // Translates the viewport on the desktop's reference frame by <dx, dy>, |
| + // without calling UpdateViewport(). |
| + void MoveViewportCenterWithoutUpdate(float dx, float dy); |
| + |
| + Vector2D desktop_size_; |
| + Vector2D surface_size_; |
| + |
| + bool desktop_size_ready_ = false; |
| + bool surface_size_ready_ = false; |
| + |
| + SimpleMatrix desktop_to_surface_; |
|
joedow
2017/04/28 21:29:53
desktop_to_surface_transform_?
Yuwei
2017/04/28 23:53:40
Done.
|
| + |
| + TransformationCallback on_transformation_changed_; |
| + |
| + // DesktopViewport is neither copyable nor movable. |
| + DesktopViewport(const DesktopViewport&) = delete; |
| + DesktopViewport& operator=(const DesktopViewport&) = delete; |
| +}; |
| + |
| +} // namespace remoting |
| +#endif // REMOTING_CLIENT_DESKTOP_VIEWPORT_H_ |