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..8fb7377bad5669c1a33db5d39fddd473f97fefb4 |
--- /dev/null |
+++ b/remoting/client/desktop_viewport.h |
@@ -0,0 +1,114 @@ |
+// 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 "base/callback.h" |
+#include "remoting/client/view_matrix.h" |
+ |
+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. |
+// |
+// Desktop space: Coordinates to locate a point on the host's desktop image in |
+// pixels, similar to the mouse's cursor position. |
+// Surface space: Coordinates to locate a point on the client device's view |
+// surface (e.g. GLKView/SurfaceView) for rendering the desktop, this is |
+// often the coordinate system to locate a point on the user's phone |
+// screen (if the surface expands to the whole screen). |
+// |
+// Viewport: Projection of the user surface view on the desktop space. |
+// Desktop: Projection of the host's desktop on the surface space. |
+// |
+// You may either manipulate the desktop on the surface coordinate or manipulate |
+// the viewport on the desktop coordinate, depending on your choice of the |
+// reference frame. |
+class DesktopViewport { |
+ public: |
+ using TransformationCallback = base::Callback<void(const ViewMatrix&)>; |
+ |
+ DesktopViewport(); |
+ ~DesktopViewport(); |
+ |
+ // Sets the |desktop_size_| and initializes the viewport when necessary. |
+ void SetDesktopSize(int desktop_width, int desktop_height); |
+ |
+ // Sets the |surface_size_| and initializes the viewport when necessary. |
+ void SetSurfaceSize(int surface_width, int surface_height); |
+ |
+ // 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: |
+ struct Bounds { |
+ float left; |
+ float right; |
+ float top; |
+ float bottom; |
+ }; |
+ |
+ // 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. |
+ void ResizeToFit(); |
+ |
+ // 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. |
+ ViewMatrix::Point GetViewportCenter() const; |
+ |
+ // Translates the viewport on the desktop's reference frame by <dx, dy>, |
+ // without calling UpdateViewport(). |
+ void MoveViewportCenterWithoutUpdate(float dx, float dy); |
+ |
+ // Moves the point inside the bounds with minimum displacement if it is out of |
+ // the bounds. |
+ static ViewMatrix::Point ConstrainPointToBounds( |
+ const Bounds& bounds, |
+ const ViewMatrix::Point& point); |
+ |
+ ViewMatrix::Vector2D desktop_size_; |
+ ViewMatrix::Vector2D surface_size_; |
+ |
+ bool desktop_size_ready_ = false; |
+ bool surface_size_ready_ = false; |
+ |
+ ViewMatrix desktop_to_surface_transform_; |
+ |
+ 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_ |