summaryrefslogtreecommitdiffstats
path: root/ui/gfx
diff options
context:
space:
mode:
authorasvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 20:36:50 +0000
committerasvitkine@chromium.org <asvitkine@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-03 20:36:50 +0000
commit3c90ec863a5e6e9cbb365d9f15c806c4e0ea1349 (patch)
tree0bb71962410a80f8e550ac0eb891937ca48b9cd7 /ui/gfx
parent361b129fbccaf43f46e4984dffc332b3423ebe0c (diff)
downloadchromium_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.cc13
-rw-r--r--ui/gfx/render_text_win.cc41
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;