Index: ui/gfx/font_list.cc |
diff --git a/ui/gfx/font_list.cc b/ui/gfx/font_list.cc |
index cb6cc9763de556591cf561610d23db741866fa8f..e01483a7cc1e9c811171e56ccd8c448004fb5186 100644 |
--- a/ui/gfx/font_list.cc |
+++ b/ui/gfx/font_list.cc |
@@ -70,37 +70,60 @@ std::string BuildFontDescription(const std::vector<std::string>& font_names, |
namespace gfx { |
-FontList::FontList() : common_height_(-1), common_baseline_(-1) { |
+FontList::FontList() |
+ : common_height_(-1), |
+ common_baseline_(-1), |
+ font_style_(-1), |
+ font_size_(-1) { |
fonts_.push_back(Font()); |
} |
FontList::FontList(const std::string& font_description_string) |
: font_description_string_(font_description_string), |
common_height_(-1), |
- common_baseline_(-1) { |
+ common_baseline_(-1), |
+ font_style_(-1), |
+ font_size_(-1) { |
DCHECK(!font_description_string.empty()); |
// DCHECK description string ends with "px" for size in pixel. |
DCHECK(EndsWith(font_description_string, "px", true)); |
} |
+FontList::FontList(const std::vector<std::string>& font_names, |
+ int font_style, |
+ int font_size) |
+ : font_description_string_(BuildFontDescription(font_names, font_style, |
+ font_size)), |
+ common_height_(-1), |
+ common_baseline_(-1), |
+ font_style_(font_style), |
+ font_size_(font_size) { |
+ DCHECK(!font_names.empty()); |
+ DCHECK(!font_names[0].empty()); |
+} |
+ |
FontList::FontList(const std::vector<Font>& fonts) |
: fonts_(fonts), |
common_height_(-1), |
- common_baseline_(-1) { |
+ common_baseline_(-1), |
+ font_style_(-1), |
+ font_size_(-1) { |
DCHECK(!fonts.empty()); |
+ font_style_ = fonts[0].GetStyle(); |
+ font_size_ = fonts[0].GetFontSize(); |
if (DCHECK_IS_ON()) { |
- int style = fonts[0].GetStyle(); |
- int size = fonts[0].GetFontSize(); |
for (size_t i = 1; i < fonts.size(); ++i) { |
- DCHECK_EQ(fonts[i].GetStyle(), style); |
- DCHECK_EQ(fonts[i].GetFontSize(), size); |
+ DCHECK_EQ(fonts[i].GetStyle(), font_style_); |
+ DCHECK_EQ(fonts[i].GetFontSize(), font_size_); |
} |
} |
} |
FontList::FontList(const Font& font) |
: common_height_(-1), |
- common_baseline_(-1) { |
+ common_baseline_(-1), |
+ font_style_(-1), |
+ font_size_(-1) { |
fonts_.push_back(font); |
} |
@@ -108,89 +131,74 @@ FontList::~FontList() { |
} |
FontList FontList::DeriveFontList(int font_style) const { |
- // If there is a font vector, derive from that. |
- if (!fonts_.empty()) { |
- std::vector<Font> fonts = fonts_; |
- for (size_t i = 0; i < fonts.size(); ++i) |
- fonts[i] = fonts[i].DeriveFont(0, font_style); |
- return FontList(fonts); |
- } |
- |
- // Otherwise, parse the font description string to derive from it. |
- std::vector<std::string> font_names; |
- int old_style; |
- int font_size; |
- ParseFontDescriptionString(font_description_string_, &font_names, |
- &old_style, &font_size); |
- return FontList(BuildFontDescription(font_names, font_style, font_size)); |
+ return DeriveFontListWithSizeDeltaAndStyle(0, font_style); |
} |
FontList FontList::DeriveFontListWithSize(int size) const { |
DCHECK_GT(size, 0); |
+ return DeriveFontListWithSizeDeltaAndStyle(size - GetFontSize(), |
+ GetFontStyle()); |
+} |
+ |
+FontList FontList::DeriveFontListWithSizeDelta(int size_delta) const { |
+ return DeriveFontListWithSizeDeltaAndStyle(size_delta, GetFontStyle()); |
+} |
+FontList FontList::DeriveFontListWithSizeDeltaAndStyle(int size_delta, |
+ int style) const { |
// If there is a font vector, derive from that. |
- int old_size = 0; |
if (!fonts_.empty()) { |
- old_size = fonts_[0].GetFontSize(); |
- if (old_size == size) |
- return FontList(fonts_); |
- |
std::vector<Font> fonts = fonts_; |
for (size_t i = 0; i < fonts.size(); ++i) |
- fonts[i] = fonts[i].DeriveFont(size - old_size); |
+ fonts[i] = fonts[i].DeriveFont(size_delta, style); |
return FontList(fonts); |
} |
// Otherwise, parse the font description string to derive from it. |
std::vector<std::string> font_names; |
- int font_style = 0; |
+ int old_size; |
+ int old_style; |
ParseFontDescriptionString(font_description_string_, &font_names, |
- &font_style, &old_size); |
- |
- if (old_size == size) |
- return FontList(font_description_string_); |
- |
- return FontList(BuildFontDescription(font_names, font_style, size)); |
+ &old_style, &old_size); |
+ int size = old_size + size_delta; |
+ DCHECK_GT(size, 0); |
+ return FontList(font_names, style, size); |
} |
int FontList::GetHeight() const { |
- if (common_height_ < 0) { |
- int ascent = 0; |
- int descent = 0; |
- const std::vector<Font>& fonts = GetFonts(); |
- for (std::vector<Font>::const_iterator i = fonts.begin(); |
- i != fonts.end(); ++i) { |
- ascent = std::max(ascent, i->GetBaseline()); |
- descent = std::max(descent, i->GetHeight() - i->GetBaseline()); |
- } |
- common_height_ = ascent + descent; |
- } |
+ if (common_height_ == -1) |
+ CacheCommonFontHeightAndBaseline(); |
return common_height_; |
} |
int FontList::GetBaseline() const { |
- if (common_baseline_ < 0) { |
- int baseline = 0; |
- const std::vector<Font>& fonts = GetFonts(); |
- for (std::vector<Font>::const_iterator i = fonts.begin(); |
- i != fonts.end(); ++i) { |
- baseline = std::max(baseline, i->GetBaseline()); |
- } |
- common_baseline_ = baseline; |
- } |
+ if (common_baseline_ == -1) |
+ CacheCommonFontHeightAndBaseline(); |
return common_baseline_; |
} |
-int FontList::GetFontStyle() const { |
- if (!fonts_.empty()) |
- return fonts_[0].GetStyle(); |
+int FontList::GetStringWidth(const base::string16& text) const { |
+ // Rely on the primary font metrics for the time being. |
+ // TODO(yukishiino): Not only the first font, all the fonts in the list should |
+ // be taken into account to compute the pixels needed to display |text|. |
+ // Also this method, including one in Font class, should be deprecated and |
+ // client code should call Canvas::GetStringWidth(text, font_list) directly. |
+ // Our plan is as follows: |
+ // 1. Introduce the FontList version of Canvas::GetStringWidth(). |
+ // 2. Make client code call Canvas::GetStringWidth(). |
+ // 3. Retire {Font,FontList}::GetStringWidth(). |
+ return GetPrimaryFont().GetStringWidth(text); |
+} |
- std::vector<std::string> font_names; |
- int font_style; |
- int font_size; |
- ParseFontDescriptionString(font_description_string_, &font_names, |
- &font_style, &font_size); |
- return font_style; |
+int FontList::GetExpectedTextWidth(int length) const { |
+ // Rely on the primary font metrics for the time being. |
+ return GetPrimaryFont().GetExpectedTextWidth(length); |
+} |
+ |
+int FontList::GetFontStyle() const { |
+ if (font_style_ == -1) |
+ CacheFontStyleAndSize(); |
+ return font_style_; |
} |
const std::string& FontList::GetFontDescriptionString() const { |
@@ -209,15 +217,9 @@ const std::string& FontList::GetFontDescriptionString() const { |
} |
int FontList::GetFontSize() const { |
- if (!fonts_.empty()) |
- return fonts_[0].GetFontSize(); |
- |
- std::vector<std::string> font_names; |
- int font_style; |
- int font_size; |
- ParseFontDescriptionString(font_description_string_, &font_names, |
- &font_style, &font_size); |
- return font_size; |
+ if (font_size_ == -1) |
+ CacheFontStyleAndSize(); |
+ return font_size_; |
} |
const std::vector<Font>& FontList::GetFonts() const { |
@@ -225,18 +227,16 @@ const std::vector<Font>& FontList::GetFonts() const { |
DCHECK(!font_description_string_.empty()); |
std::vector<std::string> font_names; |
- int font_style; |
- int font_size; |
ParseFontDescriptionString(font_description_string_, &font_names, |
- &font_style, &font_size); |
+ &font_style_, &font_size_); |
for (size_t i = 0; i < font_names.size(); ++i) { |
DCHECK(!font_names[i].empty()); |
- Font font(font_names[i], font_size); |
- if (font_style == Font::NORMAL) |
+ Font font(font_names[i], font_size_); |
+ if (font_style_ == Font::NORMAL) |
fonts_.push_back(font); |
else |
- fonts_.push_back(font.DeriveFont(0, font_style)); |
+ fonts_.push_back(font.DeriveFont(0, font_style_)); |
} |
} |
return fonts_; |
@@ -246,4 +246,28 @@ const Font& FontList::GetPrimaryFont() const { |
return GetFonts()[0]; |
} |
+void FontList::CacheCommonFontHeightAndBaseline() const { |
+ int ascent = 0; |
+ int descent = 0; |
+ const std::vector<Font>& fonts = GetFonts(); |
+ for (std::vector<Font>::const_iterator i = fonts.begin(); |
+ i != fonts.end(); ++i) { |
+ ascent = std::max(ascent, i->GetBaseline()); |
+ descent = std::max(descent, i->GetHeight() - i->GetBaseline()); |
+ } |
+ common_height_ = ascent + descent; |
+ common_baseline_ = ascent; |
+} |
+ |
+void FontList::CacheFontStyleAndSize() const { |
+ if (!fonts_.empty()) { |
+ font_style_ = fonts_[0].GetStyle(); |
+ font_size_ = fonts_[0].GetFontSize(); |
+ } else { |
+ std::vector<std::string> font_names; |
+ ParseFontDescriptionString(font_description_string_, &font_names, |
+ &font_style_, &font_size_); |
+ } |
+} |
+ |
} // namespace gfx |