blob: 63888a943766e42ec09669a3afa4c15fc5c9c9cc [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/hud_display/solid_source_background.h"
#include "cc/paint/paint_flags.h"
#include "third_party/skia/include/core/SkBlendMode.h"
#include "third_party/skia/include/core/SkPath.h"
#include "ui/gfx/canvas.h"
#include "ui/views/view.h"
namespace ash {
namespace hud_display {
SolidSourceBackground::SolidSourceBackground(SkColor color,
SkScalar top_rounding_radius)
: top_rounding_radius_(top_rounding_radius) {
SetNativeControlColor(color);
}
void SolidSourceBackground::Paint(gfx::Canvas* canvas,
views::View* view) const {
if (top_rounding_radius_ == 0) {
// Fill the background. Note that we don't constrain to the bounds as
// canvas is already clipped for us.
canvas->DrawColor(get_color(), SkBlendMode::kSrc);
} else {
const SkScalar circle_size = top_rounding_radius_ * 2;
const SkScalar right_edge = view->width();
const SkScalar bottom_edge = view->height();
SkPath path;
path.moveTo(0, bottom_edge);
// |false| will draw straight line to the start of the arc.
path.arcTo({0, 0, circle_size, circle_size}, -180, 90, false);
path.arcTo({right_edge - circle_size, 0, right_edge, circle_size}, -90, 90,
false);
path.lineTo(right_edge, bottom_edge);
cc::PaintFlags flags;
flags.setAntiAlias(true);
flags.setBlendMode(SkBlendMode::kSrc);
flags.setStyle(cc::PaintFlags::kFill_Style);
flags.setColor(get_color());
canvas->DrawPath(path, flags);
}
}
} // namespace hud_display
} // namespace ash