OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/render_text_win.h" | 5 #include "ui/gfx/render_text_win.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/i18n/break_iterator.h" | 9 #include "base/i18n/break_iterator.h" |
10 #include "base/i18n/rtl.h" | 10 #include "base/i18n/rtl.h" |
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
481 renderer.DrawPosText(&pos[0], run->glyphs.get(), run->glyph_count); | 481 renderer.DrawPosText(&pos[0], run->glyphs.get(), run->glyph_count); |
482 renderer.DrawDecorations(x, y, run->width, run->underline, run->strike, | 482 renderer.DrawDecorations(x, y, run->width, run->underline, run->strike, |
483 run->diagonal_strike); | 483 run->diagonal_strike); |
484 | 484 |
485 x = glyph_x; | 485 x = glyph_x; |
486 } | 486 } |
487 } | 487 } |
488 | 488 |
489 void RenderTextWin::ItemizeLogicalText() { | 489 void RenderTextWin::ItemizeLogicalText() { |
490 runs_.clear(); | 490 runs_.clear(); |
491 string_size_ = Size(0, GetFont().GetHeight()); | 491 string_size_ = Size(0, font_list().GetHeight()); |
492 common_baseline_ = 0; | 492 common_baseline_ = font_list().GetBaseline(); |
Alexei Svitkine (slow)
2013/07/24 15:29:48
This value will be clobbered unless the text is em
Yuki
2013/07/25 14:32:41
Done.
| |
493 | 493 |
494 // Set Uniscribe's base text direction. | 494 // Set Uniscribe's base text direction. |
495 script_state_.uBidiLevel = | 495 script_state_.uBidiLevel = |
496 (GetTextDirection() == base::i18n::RIGHT_TO_LEFT) ? 1 : 0; | 496 (GetTextDirection() == base::i18n::RIGHT_TO_LEFT) ? 1 : 0; |
497 | 497 |
498 if (text().empty()) | 498 if (text().empty()) |
499 return; | 499 return; |
500 | 500 |
501 HRESULT hr = E_OUTOFMEMORY; | 501 HRESULT hr = E_OUTOFMEMORY; |
502 int script_items_count = 0; | 502 int script_items_count = 0; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
557 UndoCompositionAndSelectionStyles(); | 557 UndoCompositionAndSelectionStyles(); |
558 } | 558 } |
559 | 559 |
560 void RenderTextWin::LayoutVisualText() { | 560 void RenderTextWin::LayoutVisualText() { |
561 DCHECK(!runs_.empty()); | 561 DCHECK(!runs_.empty()); |
562 | 562 |
563 if (!cached_hdc_) | 563 if (!cached_hdc_) |
564 cached_hdc_ = CreateCompatibleDC(NULL); | 564 cached_hdc_ = CreateCompatibleDC(NULL); |
565 | 565 |
566 HRESULT hr = E_FAIL; | 566 HRESULT hr = E_FAIL; |
567 string_size_.set_height(0); | 567 int ascent = font_list().GetBaseline(); |
568 int descent = font_list().GetHeight() - font_list().GetBaseline(); | |
Alexei Svitkine (slow)
2013/07/24 15:29:48
I'm not sure it makes sense to start with the metr
msw
2013/07/24 18:02:36
Using just the fonts of the runs and not including
Alexei Svitkine (slow)
2013/07/24 18:12:28
Ah, I understand now. Thanks for the explanation -
Yuki
2013/07/25 14:32:41
Done.
| |
568 for (size_t i = 0; i < runs_.size(); ++i) { | 569 for (size_t i = 0; i < runs_.size(); ++i) { |
569 internal::TextRun* run = runs_[i]; | 570 internal::TextRun* run = runs_[i]; |
570 LayoutTextRun(run); | 571 LayoutTextRun(run); |
571 | 572 |
572 string_size_.set_height(std::max(string_size_.height(), | 573 ascent = std::max(ascent, run->font.GetBaseline()); |
573 run->font.GetHeight())); | 574 descent = std::max(descent, |
574 common_baseline_ = std::max(common_baseline_, run->font.GetBaseline()); | 575 run->font.GetHeight() - run->font.GetBaseline()); |
575 | 576 |
576 if (run->glyph_count > 0) { | 577 if (run->glyph_count > 0) { |
577 run->advance_widths.reset(new int[run->glyph_count]); | 578 run->advance_widths.reset(new int[run->glyph_count]); |
578 run->offsets.reset(new GOFFSET[run->glyph_count]); | 579 run->offsets.reset(new GOFFSET[run->glyph_count]); |
579 hr = ScriptPlace(cached_hdc_, | 580 hr = ScriptPlace(cached_hdc_, |
580 &run->script_cache, | 581 &run->script_cache, |
581 run->glyphs.get(), | 582 run->glyphs.get(), |
582 run->glyph_count, | 583 run->glyph_count, |
583 run->visible_attributes.get(), | 584 run->visible_attributes.get(), |
584 &(run->script_analysis), | 585 &(run->script_analysis), |
585 run->advance_widths.get(), | 586 run->advance_widths.get(), |
586 run->offsets.get(), | 587 run->offsets.get(), |
587 &(run->abc_widths)); | 588 &(run->abc_widths)); |
588 DCHECK(SUCCEEDED(hr)); | 589 DCHECK(SUCCEEDED(hr)); |
589 } | 590 } |
590 } | 591 } |
592 string_size_.set_height(ascent + descent); | |
593 common_baseline_ = ascent; | |
591 | 594 |
592 // Build the array of bidirectional embedding levels. | 595 // Build the array of bidirectional embedding levels. |
593 scoped_ptr<BYTE[]> levels(new BYTE[runs_.size()]); | 596 scoped_ptr<BYTE[]> levels(new BYTE[runs_.size()]); |
594 for (size_t i = 0; i < runs_.size(); ++i) | 597 for (size_t i = 0; i < runs_.size(); ++i) |
595 levels[i] = runs_[i]->script_analysis.s.uBidiLevel; | 598 levels[i] = runs_[i]->script_analysis.s.uBidiLevel; |
596 | 599 |
597 // Get the maps between visual and logical run indices. | 600 // Get the maps between visual and logical run indices. |
598 visual_to_logical_.reset(new int[runs_.size()]); | 601 visual_to_logical_.reset(new int[runs_.size()]); |
599 logical_to_visual_.reset(new int[runs_.size()]); | 602 logical_to_visual_.reset(new int[runs_.size()]); |
600 hr = ScriptLayout(runs_.size(), | 603 hr = ScriptLayout(runs_.size(), |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
829 size_t position = LayoutIndexToTextIndex(run->range.end()); | 832 size_t position = LayoutIndexToTextIndex(run->range.end()); |
830 position = IndexOfAdjacentGrapheme(position, CURSOR_BACKWARD); | 833 position = IndexOfAdjacentGrapheme(position, CURSOR_BACKWARD); |
831 return SelectionModel(position, CURSOR_FORWARD); | 834 return SelectionModel(position, CURSOR_FORWARD); |
832 } | 835 } |
833 | 836 |
834 RenderText* RenderText::CreateInstance() { | 837 RenderText* RenderText::CreateInstance() { |
835 return new RenderTextWin; | 838 return new RenderTextWin; |
836 } | 839 } |
837 | 840 |
838 } // namespace gfx | 841 } // namespace gfx |
OLD | NEW |