#include "ui/views/controls/progress_ring_utils.h"
#include <utility>
#include <vector>
#include "third_party/skia/include/core/SkPath.h"
#include "third_party/skia/include/core/SkPathBuilder.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/skia_conversions.h"
namespace views {
namespace {
struct ArcSpec {
enum class Color { kBackground, kForeground };
Color color;
SkScalar sweep_angle;
};
void DrawRing(gfx::Canvas* canvas,
const SkRect& bounds,
SkColor background_color,
SkColor foreground_color,
float stroke_width,
SkScalar start_angle,
const std::vector<ArcSpec>& arcs) {
cc::PaintFlags background_flags;
background_flags.setStyle(cc::PaintFlags::Style::kStroke_Style);
background_flags.setAntiAlias(true);
background_flags.setColor(background_color);
background_flags.setStrokeWidth(stroke_width);
cc::PaintFlags foreground_flags;
foreground_flags.setStyle(cc::PaintFlags::Style::kStroke_Style);
foreground_flags.setAntiAlias(true);
foreground_flags.setColor(foreground_color);
foreground_flags.setStrokeWidth(stroke_width);
SkPathBuilder background_path, foreground_path;
SkScalar cur_angle = start_angle;
for (const ArcSpec& arc : arcs) {
SkPathBuilder& path = arc.color == ArcSpec::Color::kBackground
? background_path
: foreground_path;
path.addArc(bounds, cur_angle, arc.sweep_angle);
cur_angle += arc.sweep_angle;
}
CHECK_EQ(cur_angle, 360 + start_angle);
canvas->DrawPath(foreground_path.detach(), std::move(foreground_flags));
canvas->DrawPath(background_path.detach(), std::move(background_flags));
}
}
void DrawProgressRing(gfx::Canvas* canvas,
const SkRect& bounds,
SkColor background_color,
SkColor progress_color,
float stroke_width,
SkScalar start_angle,
SkScalar sweep_angle) {
std::vector<ArcSpec> arcs;
arcs.push_back({ArcSpec::Color::kForeground, sweep_angle});
arcs.push_back({ArcSpec::Color::kBackground, 360 - sweep_angle});
DrawRing(canvas, bounds, background_color, progress_color, stroke_width,
start_angle, arcs);
}
void DrawSpinningRing(gfx::Canvas* canvas,
const SkRect& bounds,
SkColor background_color,
SkColor progress_color,
float stroke_width,
SkScalar start_angle) {
std::vector<ArcSpec> arcs;
for (int i = 0; i < 3; ++i) {
arcs.push_back({ArcSpec::Color::kForeground, 60});
arcs.push_back({ArcSpec::Color::kBackground, 60});
}
DrawRing(canvas, bounds, background_color, progress_color, stroke_width,
start_angle, arcs);
}
}