diff options
author | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 20:36:50 +0000 |
---|---|---|
committer | asvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-04-03 20:36:50 +0000 |
commit | 3c90ec863a5e6e9cbb365d9f15c806c4e0ea1349 (patch) | |
tree | 0bb71962410a80f8e550ac0eb891937ca48b9cd7 /ui/gfx | |
parent | 361b129fbccaf43f46e4984dffc332b3423ebe0c (diff) | |
download | chromium_src-3c90ec863a5e6e9cbb365d9f15c806c4e0ea1349.zip chromium_src-3c90ec863a5e6e9cbb365d9f15c806c4e0ea1349.tar.gz chromium_src-3c90ec863a5e6e9cbb365d9f15c806c4e0ea1349.tar.bz2 |
Make RenderTextWin::GetStringSize() return a non-zero height if the text is empty.
This makes it match the RenderTextLinux behavior and is needed for my upcoming change to make canvas_skia.cc use GetStringSize().
Also, some cleanups to RenderTextWin:
- Don't need to check runs_.size() > 0 in LayoutVisualText() (adds a DCHECK() instead).
- Change loop from iterator to index for cleaner, more consistent code with the rest of the file.
BUG=105550
TEST=New RenderTextTest.StringSizeHeightEmpty test.
Review URL: https://chromiumcodereview.appspot.com/9969100
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@130452 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx')
-rw-r--r-- | ui/gfx/render_text_unittest.cc | 13 | ||||
-rw-r--r-- | ui/gfx/render_text_win.cc | 41 |
2 files changed, 34 insertions, 20 deletions
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc index f0a36ee..5769fe1 100644 --- a/ui/gfx/render_text_unittest.cc +++ b/ui/gfx/render_text_unittest.cc @@ -921,6 +921,19 @@ TEST_F(RenderTextTest, StringSizeSanity) { EXPECT_GT(string_size.height(), 0); } +TEST_F(RenderTextTest, StringSizeEmptyString) { + const Font font; + scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); + render_text->SetFontList(FontList(font)); + + render_text->SetText(string16()); + EXPECT_EQ(font.GetHeight(), render_text->GetStringSize().height()); + EXPECT_EQ(0, render_text->GetStringSize().width()); + + render_text->SetText(UTF8ToUTF16(" ")); + EXPECT_EQ(font.GetHeight(), render_text->GetStringSize().height()); +} + TEST_F(RenderTextTest, StringSizeBoldWidth) { scoped_ptr<RenderText> render_text(RenderText::CreateRenderText()); render_text->SetText(UTF8ToUTF16("Hello World")); diff --git a/ui/gfx/render_text_win.cc b/ui/gfx/render_text_win.cc index 6704091..cee9738 100644 --- a/ui/gfx/render_text_win.cc +++ b/ui/gfx/render_text_win.cc @@ -521,7 +521,7 @@ void RenderTextWin::DrawVisualText(Canvas* canvas) { void RenderTextWin::ItemizeLogicalText() { STLDeleteContainerPointers(runs_.begin(), runs_.end()); runs_.clear(); - string_size_ = Size(); + string_size_ = Size(0, GetFont().GetHeight()); common_baseline_ = 0; if (text().empty()) return; @@ -582,12 +582,15 @@ void RenderTextWin::ItemizeLogicalText() { } void RenderTextWin::LayoutVisualText() { - HRESULT hr = E_FAIL; + DCHECK(!runs_.empty()); + if (!cached_hdc_) cached_hdc_ = CreateCompatibleDC(NULL); - std::vector<internal::TextRun*>::const_iterator run_iter; - for (run_iter = runs_.begin(); run_iter < runs_.end(); ++run_iter) { - internal::TextRun* run = *run_iter; + + HRESULT hr = E_FAIL; + string_size_.set_height(0); + for (size_t i = 0; i < runs_.size(); ++i) { + internal::TextRun* run = runs_[i]; size_t run_length = run->range.length(); const wchar_t* run_text = &(text()[run->range.start()]); bool tried_fallback = false; @@ -704,21 +707,19 @@ void RenderTextWin::LayoutVisualText() { } } - if (runs_.size() > 0) { - // Build the array of bidirectional embedding levels. - scoped_array<BYTE> levels(new BYTE[runs_.size()]); - for (size_t i = 0; i < runs_.size(); ++i) - levels[i] = runs_[i]->script_analysis.s.uBidiLevel; - - // Get the maps between visual and logical run indices. - visual_to_logical_.reset(new int[runs_.size()]); - logical_to_visual_.reset(new int[runs_.size()]); - hr = ScriptLayout(runs_.size(), - levels.get(), - visual_to_logical_.get(), - logical_to_visual_.get()); - DCHECK(SUCCEEDED(hr)); - } + // Build the array of bidirectional embedding levels. + scoped_array<BYTE> levels(new BYTE[runs_.size()]); + for (size_t i = 0; i < runs_.size(); ++i) + levels[i] = runs_[i]->script_analysis.s.uBidiLevel; + + // Get the maps between visual and logical run indices. + visual_to_logical_.reset(new int[runs_.size()]); + logical_to_visual_.reset(new int[runs_.size()]); + hr = ScriptLayout(runs_.size(), + levels.get(), + visual_to_logical_.get(), + logical_to_visual_.get()); + DCHECK(SUCCEEDED(hr)); // Precalculate run width information. size_t preceding_run_widths = 0; |