1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/favicon_base/fallback_icon_style.h"
9 #include "ui/gfx/color_analysis.h"
10 #include "ui/gfx/color_utils.h"
12 namespace favicon_base
{
16 // Luminance threshold for background color determine whether to use dark or
18 const int kDarkTextLuminanceThreshold
= 190;
20 // The maximum luminance of the background color to ensure light text is
22 const double kMaxBackgroundColorLuminance
= 0.67;
24 // Default values for FallbackIconStyle.
25 const SkColor kDefaultBackgroundColor
= SkColorSetRGB(0x78, 0x78, 0x78);
26 const SkColor kDefaultTextColorDark
= SK_ColorBLACK
;
27 const SkColor kDefaultTextColorLight
= SK_ColorWHITE
;
28 const double kDefaultFontSizeRatio
= 0.44;
29 const double kDefaultRoundness
= 0; // Square. Round corners are applied
30 // externally (Javascript or Java).
34 FallbackIconStyle::FallbackIconStyle()
35 : background_color(kDefaultBackgroundColor
),
36 text_color(kDefaultTextColorLight
),
37 font_size_ratio(kDefaultFontSizeRatio
),
38 roundness(kDefaultRoundness
) {
41 FallbackIconStyle::~FallbackIconStyle() {
44 bool FallbackIconStyle::operator==(const FallbackIconStyle
& other
) const {
45 return background_color
== other
.background_color
&&
46 text_color
== other
.text_color
&&
47 font_size_ratio
== other
.font_size_ratio
&&
48 roundness
== other
.roundness
;
51 void MatchFallbackIconTextColorAgainstBackgroundColor(
52 FallbackIconStyle
* style
) {
53 int luminance
= color_utils::GetLuminanceForColor(style
->background_color
);
54 style
->text_color
= (luminance
>= kDarkTextLuminanceThreshold
?
55 kDefaultTextColorDark
: kDefaultTextColorLight
);
58 bool ValidateFallbackIconStyle(const FallbackIconStyle
& style
) {
59 return style
.font_size_ratio
>= 0.0 && style
.font_size_ratio
<= 1.0 &&
60 style
.roundness
>= 0.0 && style
.roundness
<= 1.0;
63 void SetDominantColorAsBackground(
64 const scoped_refptr
<base::RefCountedMemory
>& bitmap_data
,
65 FallbackIconStyle
* style
) {
66 SkColor dominant_color
=
67 color_utils::CalculateKMeanColorOfPNG(bitmap_data
);
68 // Assumes |style.text_color| is light, and clamps luminance down to a
69 // reasonable maximum value so text is readable.
70 color_utils::HSL color_hsl
;
71 color_utils::SkColorToHSL(dominant_color
, &color_hsl
);
72 color_hsl
.l
= std::min(color_hsl
.l
, kMaxBackgroundColorLuminance
);
73 style
->background_color
=
74 color_utils::HSLToSkColor(color_hsl
, SK_AlphaOPAQUE
);
77 } // namespace favicon_base