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
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/gfx/monogram_utils.h"
#include <string>
#include <string_view>
#include <vector>
#include "ui/gfx/canvas.h"
#include "ui/gfx/font.h"
#include "ui/gfx/font_list.h"
namespace gfx {
namespace {
// Draws a circle of a given `size` and `offset` in the `canvas` and fills it
// with `background_color`.
void DrawCircleInCanvas(Canvas* canvas,
int size,
int offset,
SkColor background_color) {
cc::PaintFlags flags;
flags.setStyle(cc::PaintFlags::kFill_Style);
flags.setAntiAlias(true);
flags.setColor(background_color);
int corner_radius = size / 2;
canvas->DrawRoundRect(Rect(offset, offset, size, size), corner_radius, flags);
}
// Will paint `letter` in the center of specified `canvas` of given `size`.
void DrawFallbackIconLetter(Canvas* canvas,
std::u16string_view monogram,
const std::vector<std::string>& font_names,
SkColor monogram_color,
int size,
int offset) {
if (monogram.empty()) {
return;
}
const double kDefaultFontSizeRatio = 0.5;
int font_size = static_cast<int>(size * kDefaultFontSizeRatio);
if (font_size <= 0) {
return;
}
Font::Weight font_weight = Font::Weight::NORMAL;
#if BUILDFLAG(IS_WIN)
font_weight = Font::Weight::SEMIBOLD;
#endif
// TODO(https://crbug.com/41395192): Adjust the text color according to the
// background color.
canvas->DrawStringRectWithFlags(
monogram, FontList(font_names, Font::NORMAL, font_size, font_weight),
monogram_color, Rect(offset, offset, size, size),
Canvas::TEXT_ALIGN_CENTER);
}
} // namespace
void DrawMonogramInCanvas(Canvas* canvas,
int canvas_size,
int circle_size,
std::u16string_view monogram,
const std::vector<std::string>& font_names,
SkColor monogram_color,
SkColor background_color) {
canvas->DrawColor(SK_ColorTRANSPARENT, SkBlendMode::kSrc);
int offset = (canvas_size - circle_size) / 2;
DrawCircleInCanvas(canvas, circle_size, offset, background_color);
DrawFallbackIconLetter(canvas, monogram, font_names, monogram_color,
circle_size, offset);
}
} // namespace gfx
|