Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(262)

Unified Diff: remoting/client/desktop_viewport.h

Issue 2843373005: [Remoting Client] DesktopViewport Implementation (Closed)
Patch Set: Rename SimpleMatrix to ViewMatrix Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/client/BUILD.gn ('k') | remoting/client/desktop_viewport.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « remoting/client/BUILD.gn ('k') | remoting/client/desktop_viewport.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698