File: rounded_display_gutter_factory.cc

package info (click to toggle)
chromium 138.0.7204.183-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 6,071,908 kB
  • sloc: cpp: 34,937,088; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,953; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,806; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (129 lines) | stat: -rw-r--r-- 4,709 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ash/rounded_display/rounded_display_gutter_factory.h"

#include <memory>
#include <utility>
#include <vector>

#include "ash/rounded_display/rounded_display_gutter.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rounded_corners_f.h"
#include "ui/gfx/geometry/size.h"

namespace ash {
namespace {

using Gutters = std::vector<RoundedDisplayGutter*>;
using RoundedCorner = RoundedDisplayGutter::RoundedCorner;
using RoundedCornerPosition = RoundedDisplayGutter::RoundedCorner::Position;

// Create RoundedCorner for a given position of the display.
RoundedDisplayGutter::RoundedCorner CreateRoundedCornerForDisplay(
    RoundedCornerPosition position,
    const gfx::RoundedCornersF& panel_radii,
    const gfx::Size& panel_size) {
  switch (position) {
    case RoundedCornerPosition::kUpperLeft:
      return RoundedCorner(position, panel_radii.upper_left(),
                           gfx::Point(0, 0));
    case RoundedCornerPosition::kUpperRight:
      return RoundedCorner(
          position, panel_radii.upper_right(),
          gfx::Point(panel_size.width() - panel_radii.upper_right(), 0));
    case RoundedCornerPosition::kLowerLeft:
      return RoundedCorner(
          position, panel_radii.lower_left(),
          gfx::Point(0, panel_size.height() - panel_radii.lower_left()));
    case RoundedCornerPosition::kLowerRight:
      return RoundedCorner(
          position, panel_radii.lower_right(),
          gfx::Point(panel_size.width() - panel_radii.lower_right(),
                     panel_size.height() - panel_radii.lower_right()));
  }
}

// Create the gutter with RoundedCorners encoded in
// `corner_positions_bit_mask`. We do not create the gutter if all of
// rounded_corners of the gutter have zero radius.
std::unique_ptr<RoundedDisplayGutter> CreateGutter(
    const gfx::Size& panel_size,
    const gfx::RoundedCornersF& panel_radii,
    int corner_positions_bit_mask,
    bool is_overlay_gutter) {
  std::vector<RoundedCorner> corners;

  for (RoundedDisplayGutter::RoundedCorner::Position position :
       {RoundedCorner::kLowerLeft, RoundedCorner::kLowerRight,
        RoundedCorner::kUpperLeft, RoundedCorner::kUpperRight}) {
    if (corner_positions_bit_mask & position) {
      corners.push_back(
          CreateRoundedCornerForDisplay(position, panel_radii, panel_size));
    }
  }

  // We only create a gutter if at least one its corners paint.
  for (const auto& corner : corners) {
    if (corner.DoesPaint()) {
      return RoundedDisplayGutter::CreateGutter(std::move(corners),
                                                is_overlay_gutter);
    }
  }

  return nullptr;
}

void MaybeAppendGutter(
    std::vector<std::unique_ptr<RoundedDisplayGutter>>& gutters,
    std::unique_ptr<RoundedDisplayGutter> gutter) {
  if (gutter) {
    gutters.push_back(std::move(gutter));
  }
}

}  // namespace

std::vector<std::unique_ptr<RoundedDisplayGutter>>
RoundedDisplayGutterFactory::CreateOverlayGutters(
    const gfx::Size& panel_size,
    const gfx::RoundedCornersF& panel_radii,
    bool create_vertical_gutters) {
  std::vector<std::unique_ptr<RoundedDisplayGutter>> gutters;

  if (create_vertical_gutters) {
    // Left overlay gutter.
    MaybeAppendGutter(gutters,
                      CreateGutter(panel_size, panel_radii,
                                   RoundedCornerPosition::kUpperLeft |
                                       RoundedCornerPosition::kLowerLeft,
                                   /*is_overlay_gutter=*/true));

    // Right overlay gutter.
    MaybeAppendGutter(gutters,
                      CreateGutter(panel_size, panel_radii,
                                   RoundedCornerPosition::kUpperRight |
                                       RoundedCornerPosition::kLowerRight,
                                   /*is_overlay_gutter=*/true));

  } else {
    // Upper overlay gutter.
    MaybeAppendGutter(gutters,
                      CreateGutter(panel_size, panel_radii,
                                   RoundedCornerPosition::kUpperLeft |
                                       RoundedCornerPosition::kUpperRight,
                                   /*is_overlay_gutter=*/true));

    // Lower overlay gutter.
    MaybeAppendGutter(gutters,
                      CreateGutter(panel_size, panel_radii,
                                   RoundedCornerPosition::kLowerLeft |
                                       RoundedCornerPosition::kLowerRight,
                                   /*is_overlay_gutter=*/true));
  }

  return gutters;
}

}  // namespace ash