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.
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_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)
331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Touch support for the display.
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  enum TouchSupport {
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TOUCH_SUPPORT_UNKNOWN,
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TOUCH_SUPPORT_AVAILABLE,
371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    TOUCH_SUPPORT_UNAVAILABLE,
381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  };
391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a display with kInvalidDisplayID as default.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Display(int64 id);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display(int64 id, const Rect& bounds);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Display();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the forced device scale factor, which is given by
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "--force-device-scale-factor".
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static float GetForcedDeviceScaleFactor();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if a device scale factor is being explicitly enforced from the
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // command line via "--force-device-scale-factor".
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool HasForceDeviceScaleFactor();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets/Gets unique identifier associated with the display.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // -1 means invalid display and it doesn't not exit.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 id() const { return id_; }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(int64 id) { id_ = id; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the display's bounds in gfx::Screen's coordinates.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Rect& bounds() const { return bounds_; }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_bounds(const Rect& bounds) { bounds_ = bounds; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets/Sets the display's work area in gfx::Screen's coordinates.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Rect& work_area() const { return work_area_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_work_area(const Rect& work_area) { work_area_ = work_area; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Output device's pixel scale factor. This specifies how much the
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UI should be scaled when the actual output has more pixels than
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // standard displays (which is around 100~120dpi.) The potential return
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // values depend on each platforms.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float device_scale_factor() const { return device_scale_factor_; }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_device_scale_factor(float scale) { device_scale_factor_ = scale; }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Rotation rotation() const { return rotation_; }
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_rotation(Rotation rotation) { rotation_ = rotation; }
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  int RotationAsDegree() const;
770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  void SetRotationAsDegree(int rotation);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TouchSupport touch_support() const { return touch_support_; }
801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void set_touch_support(TouchSupport support) { touch_support_ = support; }
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility functions that just return the size of display and
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& size() const { return bounds_.size(); }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& work_area_size() const { return work_area_.size(); }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the work area insets.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Insets GetWorkAreaInsets() const;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the device scale factor and display bounds in pixel. This
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates the work are using the same insets between old bounds and
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScaleAndBounds(float device_scale_factor,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& bounds_in_pixel);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the display's size. This updates the work area using the same insets
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between old bounds and work area.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(const gfx::Size& size_in_pixel);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computes and updates the display's work are using
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |work_area_insets| and the bounds.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateWorkAreaFromInsets(const gfx::Insets& work_area_insets);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the display's size in pixel coordinates.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size GetSizeInPixel() const;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string representation of the display;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ToString() const;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the display contains valid display id.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return id_ != kInvalidDisplayID; }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the display corresponds to internal panel.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsInternal() const;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets/Sets an id of display corresponding to internal panel.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int64 InternalDisplayId();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetInternalDisplayId(int64 internal_display_id);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kInvalidDisplayID;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 id_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect bounds_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect work_area_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float device_scale_factor_;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Rotation rotation_;
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  TouchSupport touch_support_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_GFX_DISPLAY_H_
134