| // 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 |