display.h revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: The screen and display currently uses pixel coordinate
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system. For platforms that support DIP (density independent pixel),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |bounds()| and |work_area| will return values in DIP coordinate
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// system, not in backing pixels.
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class UI_EXPORT Display {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Screen Rotation in clock-wise degrees.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Rotation {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_0 = 0,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_90,
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_180,
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ROTATE_270,
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a display with kInvalidDisplayID as default.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit Display(int64 id);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Display(int64 id, const Rect& bounds);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Display();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the forced device scale factor, which is given by
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "--force-device-scale-factor".
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static float GetForcedDeviceScaleFactor();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Indicates if a device scale factor is being explicitly enforced from the
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // command line via "--force-device-scale-factor".
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool HasForceDeviceScaleFactor();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns 64-bit persistent ID for the specified manufacturer's ID and
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // product_code, and the index of the output it is connected to.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |output_index| is used to distinguish the displays of the same type. For
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // example, swapping two identical display between two outputs will not be
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // treated as swap. The 'serial number' field in EDID isn't used here because
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // it is not guaranteed to have unique number and it may have the same fixed
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // value (like 0).
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int64 GetID(uint16 manufacturer_id,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     uint16 product_code,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     uint8 output_index);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (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; }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Utility functions that just return the size of display and
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& size() const { return bounds_.size(); }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Size& work_area_size() const { return work_area_.size(); }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the work area insets.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Insets GetWorkAreaInsets() const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the device scale factor and display bounds in pixel. This
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates the work are using the same insets between old bounds and
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // work area.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetScaleAndBounds(float device_scale_factor,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const gfx::Rect& bounds_in_pixel);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the display's size. This updates the work area using the same insets
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between old bounds and work area.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSize(const gfx::Size& size_in_pixel);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Computes and updates the display's work are using
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |work_area_insets| and the bounds.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateWorkAreaFromInsets(const gfx::Insets& work_area_insets);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the display's size in pixel coordinates.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size GetSizeInPixel() const;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a string representation of the display;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ToString() const;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // True if the display contains valid display id.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_valid() const { return id_ != kInvalidDisplayID; }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // True if the display corresponds to internal panel.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsInternal() const;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets/Sets an id of display corresponding to internal panel.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static int64 InternalDisplayId();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetInternalDisplayId(int64 internal_display_id);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int64 kInvalidDisplayID;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 id_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect bounds_;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Rect work_area_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float device_scale_factor_;
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Rotation rotation_;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_GFX_DISPLAY_H_
128