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/logging.h" | 10 #include "base/logging.h" |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
590 | 590 |
591 HRESULT hr = E_FAIL; | 591 HRESULT hr = E_FAIL; |
592 string_size_.set_height(0); | 592 string_size_.set_height(0); |
593 for (size_t i = 0; i < runs_.size(); ++i) { | 593 for (size_t i = 0; i < runs_.size(); ++i) { |
594 internal::TextRun* run = runs_[i]; | 594 internal::TextRun* run = runs_[i]; |
595 size_t run_length = run->range.length(); | 595 size_t run_length = run->range.length(); |
596 const wchar_t* run_text = &(text()[run->range.start()]); | 596 const wchar_t* run_text = &(text()[run->range.start()]); |
597 bool tried_fallback = false; | 597 bool tried_fallback = false; |
598 size_t linked_font_index = 0; | 598 size_t linked_font_index = 0; |
599 const std::vector<Font>* linked_fonts = NULL; | 599 const std::vector<Font>* linked_fonts = NULL; |
600 Font original_font = run->font; | |
600 | 601 |
601 // Select the font desired for glyph generation. | 602 // Select the font desired for glyph generation. |
602 SelectObject(cached_hdc_, run->font.GetNativeFont()); | 603 SelectObject(cached_hdc_, run->font.GetNativeFont()); |
603 | 604 |
604 SCRIPT_FONTPROPERTIES font_properties; | 605 SCRIPT_FONTPROPERTIES font_properties; |
605 memset(&font_properties, 0, sizeof(font_properties)); | 606 memset(&font_properties, 0, sizeof(font_properties)); |
606 font_properties.cBytes = sizeof(SCRIPT_FONTPROPERTIES); | 607 font_properties.cBytes = sizeof(SCRIPT_FONTPROPERTIES); |
607 ScriptGetFontProperties(cached_hdc_, &run->script_cache, &font_properties); | 608 ScriptGetFontProperties(cached_hdc_, &run->script_cache, &font_properties); |
608 | 609 |
609 run->logical_clusters.reset(new WORD[run_length]); | 610 run->logical_clusters.reset(new WORD[run_length]); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
654 Font fallback_font; | 655 Font fallback_font; |
655 if (ChooseFallbackFont(cached_hdc_, run->font, run_text, run_length, | 656 if (ChooseFallbackFont(cached_hdc_, run->font, run_text, run_length, |
656 &fallback_font)) { | 657 &fallback_font)) { |
657 ApplySubstituteFont(run, fallback_font); | 658 ApplySubstituteFont(run, fallback_font); |
658 continue; | 659 continue; |
659 } | 660 } |
660 } | 661 } |
661 | 662 |
662 // The meta file approach did not yield a replacement font, try to find | 663 // The meta file approach did not yield a replacement font, try to find |
663 // one using font linking. First time through, get the linked fonts list. | 664 // one using font linking. First time through, get the linked fonts list. |
664 if (linked_fonts == NULL) | 665 if (linked_fonts == NULL) { |
665 linked_fonts = GetLinkedFonts(run->font); | 666 // First, try to get the list for the original font. |
667 linked_fonts = GetLinkedFonts(original_font); | |
668 | |
669 // If there are no linked fonts for the original font, try querying the | |
670 // ones for the Uniscribe fallback font. This may happen if the first | |
671 // font is a custom font that has no linked fonts in the Registry. | |
msw
2012/04/23 20:20:59
nit: Should registry be capitalized? Are you refer
Alexei Svitkine (slow)
2012/04/23 21:13:14
Yes, the Windows Registry. It's capitalized in the
| |
672 if (linked_fonts->empty()) | |
673 linked_fonts = GetLinkedFonts(run->font); | |
msw
2012/04/23 20:20:59
Have you considered appending the linked fonts for
Alexei Svitkine (slow)
2012/04/23 21:13:14
I've thought about it, but decided to keep it up m
msw
2012/04/24 00:05:11
Cool, how about a TODO or less directed/actionable
| |
674 } | |
666 | 675 |
667 // None of the linked fonts worked, break out of the loop. | 676 // None of the linked fonts worked, break out of the loop. |
668 if (linked_font_index == linked_fonts->size()) { | 677 if (linked_font_index == linked_fonts->size()) { |
669 // TODO(msw): Don't use SCRIPT_UNDEFINED. Apparently Uniscribe can | 678 // TODO(msw): Don't use SCRIPT_UNDEFINED. Apparently Uniscribe can |
670 // crash on certain surrogate pairs with SCRIPT_UNDEFINED. | 679 // crash on certain surrogate pairs with SCRIPT_UNDEFINED. |
671 // See https://bugzilla.mozilla.org/show_bug.cgi?id=341500 | 680 // See https://bugzilla.mozilla.org/show_bug.cgi?id=341500 |
672 // And http://maxradi.us/documents/uniscribe/ | 681 // And http://maxradi.us/documents/uniscribe/ |
673 run->script_analysis.eScript = SCRIPT_UNDEFINED; | 682 run->script_analysis.eScript = SCRIPT_UNDEFINED; |
674 // Reset |hr| to 0 to not trigger the DCHECK() below when a font is | 683 // Reset |hr| to 0 to not trigger the DCHECK() below when a font is |
675 // not found that can display the text. This is expected behavior | 684 // not found that can display the text. This is expected behavior |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
784 internal::TextRun* run) { | 793 internal::TextRun* run) { |
785 size_t caret = IndexOfAdjacentGrapheme(run->range.end(), CURSOR_BACKWARD); | 794 size_t caret = IndexOfAdjacentGrapheme(run->range.end(), CURSOR_BACKWARD); |
786 return SelectionModel(caret, CURSOR_FORWARD); | 795 return SelectionModel(caret, CURSOR_FORWARD); |
787 } | 796 } |
788 | 797 |
789 RenderText* RenderText::CreateRenderText() { | 798 RenderText* RenderText::CreateRenderText() { |
790 return new RenderTextWin; | 799 return new RenderTextWin; |
791 } | 800 } |
792 | 801 |
793 } // namespace gfx | 802 } // namespace gfx |
OLD | NEW |