display.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
186797937017f52bff088d02edf64fb931177a7eaJun Nakajima// Copyright (c) 2012 The Chromium Authors. All rights reserved.
286797937017f52bff088d02edf64fb931177a7eaJun Nakajima// Use of this source code is governed by a BSD-style license that can be
386797937017f52bff088d02edf64fb931177a7eaJun Nakajima// found in the LICENSE file.
486797937017f52bff088d02edf64fb931177a7eaJun Nakajima
586797937017f52bff088d02edf64fb931177a7eaJun Nakajima#ifndef UI_GFX_DISPLAY_H_
686797937017f52bff088d02edf64fb931177a7eaJun Nakajima#define UI_GFX_DISPLAY_H_
786797937017f52bff088d02edf64fb931177a7eaJun Nakajima
886797937017f52bff088d02edf64fb931177a7eaJun Nakajima#include "base/basictypes.h"
986797937017f52bff088d02edf64fb931177a7eaJun Nakajima#include "base/compiler_specific.h"
1086797937017f52bff088d02edf64fb931177a7eaJun Nakajima#include "ui/gfx/gfx_export.h"
1186797937017f52bff088d02edf64fb931177a7eaJun Nakajima#include "ui/gfx/rect.h"
1286797937017f52bff088d02edf64fb931177a7eaJun Nakajima
1386797937017f52bff088d02edf64fb931177a7eaJun Nakajimanamespace gfx {
1486797937017f52bff088d02edf64fb931177a7eaJun Nakajima
1586797937017f52bff088d02edf64fb931177a7eaJun Nakajima// This class typically, but does not always, correspond to a physical display
1686797937017f52bff088d02edf64fb931177a7eaJun Nakajima// connected to the system. A fake Display may exist on a headless system, or a
1786797937017f52bff088d02edf64fb931177a7eaJun Nakajima// Display may correspond to a remote, virtual display.
1886797937017f52bff088d02edf64fb931177a7eaJun Nakajima//
1936597756e589622ee6c6628efb47c1b130d5ee85David 'Digit' Turner// Note: The screen and display currently uses pixel coordinate
2036597756e589622ee6c6628efb47c1b130d5ee85David 'Digit' Turner// system. For platforms that support DIP (density independent pixel),
2186797937017f52bff088d02edf64fb931177a7eaJun Nakajima// |bounds()| and |work_area| will return values in DIP coordinate
2286797937017f52bff088d02edf64fb931177a7eaJun Nakajima// system, not in backing pixels.
2386797937017f52bff088d02edf64fb931177a7eaJun Nakajimaclass UI_EXPORT Display {
2434c48ff1e3ad5cd2084ca40188754d45f423750bDavid 'Digit' Turner public:
2534c48ff1e3ad5cd2084ca40188754d45f423750bDavid 'Digit' Turner  // Screen Rotation in clock-wise degrees.
2686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  enum Rotation {
27852088c7e08182c2de563872d558309815cbfa0dDavid 'Digit' Turner    ROTATE_0 = 0,
2886797937017f52bff088d02edf64fb931177a7eaJun Nakajima    ROTATE_90,
29bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima    ROTATE_180,
30bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima    ROTATE_270,
31bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima  };
32bb0140b925cb2adce03ebc0885067ea3bfd19a20Jun Nakajima
3386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Creates a display with kInvalidDisplayID as default.
3486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Display();
3586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  explicit Display(int64 id);
3686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Display(int64 id, const Rect& bounds);
3786797937017f52bff088d02edf64fb931177a7eaJun Nakajima  ~Display();
3886797937017f52bff088d02edf64fb931177a7eaJun Nakajima
3986797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Returns the forced device scale factor, which is given by
4086797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // "--force-device-scale-factor".
4186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  static float GetForcedDeviceScaleFactor();
4286797937017f52bff088d02edf64fb931177a7eaJun Nakajima
4386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Indicates if a device scale factor is being explicitly enforced from the
4486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // command line via "--force-device-scale-factor".
4586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  static bool HasForceDeviceScaleFactor();
4686797937017f52bff088d02edf64fb931177a7eaJun Nakajima
4786797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Sets/Gets unique identifier associated with the display.
4886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // -1 means invalid display and it doesn't not exit.
4986797937017f52bff088d02edf64fb931177a7eaJun Nakajima  int64 id() const { return id_; }
5086797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void set_id(int64 id) { id_ = id; }
51aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner
5286797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Gets/Sets the display's bounds in gfx::Screen's coordinates.
5386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  const Rect& bounds() const { return bounds_; }
5486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void set_bounds(const Rect& bounds) { bounds_ = bounds; }
5586797937017f52bff088d02edf64fb931177a7eaJun Nakajima
5686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Gets/Sets the display's work area in gfx::Screen's coordinates.
5786797937017f52bff088d02edf64fb931177a7eaJun Nakajima  const Rect& work_area() const { return work_area_; }
5886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void set_work_area(const Rect& work_area) { work_area_ = work_area; }
59aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner
6086797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Output device's pixel scale factor. This specifies how much the
6186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // UI should be scaled when the actual output has more pixels than
6286797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // standard displays (which is around 100~120dpi.) The potential return
6386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // values depend on each platforms.
6486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  float device_scale_factor() const { return device_scale_factor_; }
6586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void set_device_scale_factor(float scale) { device_scale_factor_ = scale; }
6686797937017f52bff088d02edf64fb931177a7eaJun Nakajima
6786797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Rotation rotation() const { return rotation_; }
6886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void set_rotation(Rotation rotation) { rotation_ = rotation; }
6986797937017f52bff088d02edf64fb931177a7eaJun Nakajima
70e36a683b547e540c68bf9c5578e05b29c8676f47David 'Digit' Turner  // Utility functions that just return the size of display and
7186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // work area.
7286797937017f52bff088d02edf64fb931177a7eaJun Nakajima  const Size& size() const { return bounds_.size(); }
7386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  const Size& work_area_size() const { return work_area_.size(); }
7486797937017f52bff088d02edf64fb931177a7eaJun Nakajima
7586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Returns the work area insets.
7686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Insets GetWorkAreaInsets() const;
776657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
7886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Sets the device scale factor and display bounds in pixel. This
7986797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // updates the work are using the same insets between old bounds and
8086797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // work area.
8186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void SetScaleAndBounds(float device_scale_factor,
826657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner                         const gfx::Rect& bounds_in_pixel);
8386797937017f52bff088d02edf64fb931177a7eaJun Nakajima
8486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Sets the display's size. This updates the work area using the same insets
8586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // between old bounds and work area.
8686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void SetSize(const gfx::Size& size_in_pixel);
8786797937017f52bff088d02edf64fb931177a7eaJun Nakajima
8886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Computes and updates the display's work are using
8986797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // |work_area_insets| and the bounds.
9086797937017f52bff088d02edf64fb931177a7eaJun Nakajima  void UpdateWorkAreaFromInsets(const gfx::Insets& work_area_insets);
9186797937017f52bff088d02edf64fb931177a7eaJun Nakajima
9286797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Returns the display's size in pixel coordinates.
9386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  gfx::Size GetSizeInPixel() const;
9486797937017f52bff088d02edf64fb931177a7eaJun Nakajima
9586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // Returns a string representation of the display;
9686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  std::string ToString() const;
9786797937017f52bff088d02edf64fb931177a7eaJun Nakajima
9886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // True if the display contains valid display id.
9986797937017f52bff088d02edf64fb931177a7eaJun Nakajima  bool is_valid() const { return id_ != kInvalidDisplayID; }
10086797937017f52bff088d02edf64fb931177a7eaJun Nakajima
10186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  // True if the display corresponds to internal panel.
10286797937017f52bff088d02edf64fb931177a7eaJun Nakajima  bool IsInternal() const;
10386797937017f52bff088d02edf64fb931177a7eaJun Nakajima
104e36a683b547e540c68bf9c5578e05b29c8676f47David 'Digit' Turner  // Gets/Sets an id of display corresponding to internal panel.
10586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  static int64 InternalDisplayId();
10686797937017f52bff088d02edf64fb931177a7eaJun Nakajima  static void SetInternalDisplayId(int64 internal_display_id);
10786797937017f52bff088d02edf64fb931177a7eaJun Nakajima
10886797937017f52bff088d02edf64fb931177a7eaJun Nakajima  static const int64 kInvalidDisplayID;
10986797937017f52bff088d02edf64fb931177a7eaJun Nakajima
11086797937017f52bff088d02edf64fb931177a7eaJun Nakajima private:
11186797937017f52bff088d02edf64fb931177a7eaJun Nakajima  int64 id_;
112aa8236dc1b1ea300ab18716db5b8fab42aca3ca7David 'Digit' Turner  Rect bounds_;
11386797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Rect work_area_;
11486797937017f52bff088d02edf64fb931177a7eaJun Nakajima  float device_scale_factor_;
11586797937017f52bff088d02edf64fb931177a7eaJun Nakajima  Rotation rotation_;
11686797937017f52bff088d02edf64fb931177a7eaJun Nakajima};
11786797937017f52bff088d02edf64fb931177a7eaJun Nakajima
11886797937017f52bff088d02edf64fb931177a7eaJun Nakajima}  // namespace gfx
119e36a683b547e540c68bf9c5578e05b29c8676f47David 'Digit' Turner
12086797937017f52bff088d02edf64fb931177a7eaJun Nakajima#endif  // UI_GFX_DISPLAY_H_
12186797937017f52bff088d02edf64fb931177a7eaJun Nakajima