Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: ui/gfx/font_list.cc

Issue 21868004: Supports FontList::DeriveFontListWithSizeDeltaAndStyle, etc. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added a TODO comment, updated comments. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/font_list.h ('k') | ui/gfx/font_list_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « ui/gfx/font_list.h ('k') | ui/gfx/font_list_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698