display.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_GFX_DISPLAY_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_GFX_DISPLAY_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/gfx_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// This class typically, but does not always, correspond to a physical display
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// connected to the system. A fake Display may exist on a headless system, or a
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Display may correspond to a remote, virtual display.
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: The screen and display currently uses pixel coordinate
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system. For platforms that support DIP (density independent pixel),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |bounds()| and |work_area| will return values in DIP coordinate
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system, not in backing pixels.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UI_EXPORT Display {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Screen Rotation in clock-wise degrees.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Rotation {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_0 = 0,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_90,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_180,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_270,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a display with kInvalidDisplayID as default.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Display(int64 id);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display(int64 id, const Rect& bounds);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Display();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the forced device scale factor, which is given by
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "--force-device-scale-factor".
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static float GetForcedDeviceScaleFactor();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if a device scale factor is being explicitly enforced from the
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // command line via "--force-device-scale-factor".
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool HasForceDeviceScaleFactor();
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets/Gets unique identifier associated with the display.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -1 means invalid display and it doesn't not exit.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 id() const { return id_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(int64 id) { id_ = id; }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the display's bounds in gfx::Screen's coordinates.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Rect& bounds() const { return bounds_; }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bounds(const Rect& bounds) { bounds_ = bounds; }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the display's work area in gfx::Screen's coordinates.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Rect& work_area() const { return work_area_; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_work_area(const Rect& work_area) { work_area_ = work_area; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Output device's pixel scale factor. This specifies how much the
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UI should be scaled when the actual output has more pixels than
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // standard displays (which is around 100~120dpi.) The potential return
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values depend on each platforms.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float device_scale_factor() const { return device_scale_factor_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_device_scale_factor(float scale) { device_scale_factor_ = scale; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Rotation rotation() const { return rotation_; }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_rotation(Rotation rotation) { rotation_ = rotation; }
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility functions that just return the size of display and
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& size() const { return bounds_.size(); }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& work_area_size() const { return work_area_.size(); }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the work area insets.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Insets GetWorkAreaInsets() const;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the device scale factor and display bounds in pixel. This
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates the work are using the same insets between old bounds and
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScaleAndBounds(float device_scale_factor,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& bounds_in_pixel);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the display's size. This updates the work area using the same insets
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between old bounds and work area.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(const gfx::Size& size_in_pixel);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computes and updates the display's work are using
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |work_area_insets| and the bounds.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateWorkAreaFromInsets(const gfx::Insets& work_area_insets);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the display's size in pixel coordinates.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size GetSizeInPixel() const;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string representation of the display;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ToString() const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the display contains valid display id.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return id_ != kInvalidDisplayID; }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the display corresponds to internal panel.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsInternal() const;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets/Sets an id of display corresponding to internal panel.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int64 InternalDisplayId();
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetInternalDisplayId(int64 internal_display_id);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kInvalidDisplayID;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 id_;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect bounds_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect work_area_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float device_scale_factor_;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Rotation rotation_;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_GFX_DISPLAY_H_
121