|  | // Copyright 2020 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CONTENT_BROWSER_RENDERER_HOST_DISPLAY_FEATURE_H_ | 
|  | #define CONTENT_BROWSER_RENDERER_HOST_DISPLAY_FEATURE_H_ | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "build/build_config.h" | 
|  | #include "content/common/content_export.h" | 
|  | #include "third_party/abseil-cpp/absl/types/optional.h" | 
|  | #include "ui/gfx/geometry/rect.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | // Information about a physical attribute of the screen which that creates a | 
|  | // Logical separator or divider (e.g. a fold or mask). | 
|  | // This is a visual example of a vertically oriented display feature that masks | 
|  | // content underneath | 
|  | // | 
|  | //    Orientation: vertical | 
|  | // | 
|  | //                 offset | 
|  | //                   | | 
|  | //         +---------|===|---------+ | 
|  | //         |         |   |         | | 
|  | //         |         |   |         | | 
|  | //         |         |   |         | | 
|  | //         |         |   |         | | 
|  | //         |         |   |         | | 
|  | //         +---------|===|---------+ | 
|  | //                      \ | 
|  | //                      mask_length | 
|  | // | 
|  | // Note that the implicit height of the display feature is the entire height of | 
|  | // the screen on which it exists. | 
|  | struct CONTENT_EXPORT DisplayFeature { | 
|  | enum class Orientation { kVertical, kHorizontal, kMaxValue = kHorizontal }; | 
|  | enum class ParamErrorEnum { | 
|  | kDisplayFeatureWithZeroScreenSize = 1, | 
|  | kNegativeDisplayFeatureParams, | 
|  | kOutsideScreenWidth, | 
|  | kOutsideScreenHeight | 
|  | }; | 
|  |  | 
|  | // The orientation of the display feature in relation to the screen. | 
|  | Orientation orientation = Orientation::kVertical; | 
|  |  | 
|  | // The offset from the screen origin in either the x (for vertical | 
|  | // orientation) or y (for horizontal orientation) direction. | 
|  | int offset = 0; | 
|  |  | 
|  | // A display feature may mask content such that it is not physically | 
|  | // displayed - this length along with the offset describes this area. | 
|  | // A display feature that only splits content will have a 0 |mask_length|. | 
|  | int mask_length = 0; | 
|  |  | 
|  | bool operator==(const DisplayFeature& other) const; | 
|  | bool operator!=(const DisplayFeature& other) const; | 
|  |  | 
|  | // Computes logical segments of the |visible_viewport_size|, based on | 
|  | // this display feature. These segments are in DIPs relative to the widget | 
|  | // origin. | 
|  | std::vector<gfx::Rect> ComputeWindowSegments( | 
|  | const gfx::Size& visible_viewport_size) const; | 
|  |  | 
|  | static absl::optional<DisplayFeature> Create( | 
|  | Orientation orientation, | 
|  | int offset, | 
|  | int mask_length, | 
|  | int screen_width, | 
|  | int screen_height, | 
|  | DisplayFeature::ParamErrorEnum* error); | 
|  | }; | 
|  |  | 
|  | }  // namespace content | 
|  |  | 
|  | #endif  // CONTENT_BROWSER_RENDERER_HOST_DISPLAY_FEATURE_H_ |