#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;
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()));
}
}
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));
}
}
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));
}
}
}
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) {
MaybeAppendGutter(gutters,
CreateGutter(panel_size, panel_radii,
RoundedCornerPosition::kUpperLeft |
RoundedCornerPosition::kLowerLeft,
true));
MaybeAppendGutter(gutters,
CreateGutter(panel_size, panel_radii,
RoundedCornerPosition::kUpperRight |
RoundedCornerPosition::kLowerRight,
true));
} else {
MaybeAppendGutter(gutters,
CreateGutter(panel_size, panel_radii,
RoundedCornerPosition::kUpperLeft |
RoundedCornerPosition::kUpperRight,
true));
MaybeAppendGutter(gutters,
CreateGutter(panel_size, panel_radii,
RoundedCornerPosition::kLowerLeft |
RoundedCornerPosition::kLowerRight,
true));
}
return gutters;
}
}