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

Side by Side Diff: chrome/browser/android/vr_shell/font_fallback.cc

Issue 2914543002: [vr] Bail on unhandled code points. (Closed)
Patch Set: Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "chrome/browser/android/vr_shell/font_fallback.h" 5 #include "chrome/browser/android/vr_shell/font_fallback.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 78
79 void SetLocale(const std::string& locale) { 79 void SetLocale(const std::string& locale) {
80 // Store font list for one locale at a time. 80 // Store font list for one locale at a time.
81 if (locale != locale_) { 81 if (locale != locale_) {
82 font_ids_.clear(); 82 font_ids_.clear();
83 unknown_chars_.clear(); 83 unknown_chars_.clear();
84 locale_ = locale; 84 locale_ = locale;
85 } 85 }
86 } 86 }
87 87
88 std::string GetFallbackFontNameForChar(UChar32 c) { 88 bool GetFallbackFontNameForChar(UChar32 c, std::string* font_name) {
89 if (unknown_chars_.find(c) != unknown_chars_.end()) 89 if (unknown_chars_.find(c) != unknown_chars_.end())
90 return ""; 90 return false;
91
91 for (SkFontID font_id : font_ids_) { 92 for (SkFontID font_id : font_ids_) {
92 std::unique_ptr<CachedFont>& font = g_fonts.Get()[font_id]; 93 std::unique_ptr<CachedFont>& font = g_fonts.Get()[font_id];
93 if (font->HasGlyphForCharacter(c)) 94 if (font->HasGlyphForCharacter(c)) {
94 return font->GetFontName(); 95 *font_name = font->GetFontName();
96 return true;
97 }
95 } 98 }
96 sk_sp<SkFontMgr> font_mgr(SkFontMgr::RefDefault()); 99 sk_sp<SkFontMgr> font_mgr(SkFontMgr::RefDefault());
97 const char* bcp47_locales[] = {locale_.c_str()}; 100 const char* bcp47_locales[] = {locale_.c_str()};
98 sk_sp<SkTypeface> tf(font_mgr->matchFamilyStyleCharacter( 101 sk_sp<SkTypeface> tf(font_mgr->matchFamilyStyleCharacter(
99 nullptr, SkFontStyle(), locale_.empty() ? nullptr : bcp47_locales, 102 nullptr, SkFontStyle(), locale_.empty() ? nullptr : bcp47_locales,
100 locale_.empty() ? 0 : 1, c)); 103 locale_.empty() ? 0 : 1, c));
101 if (tf) { 104 if (tf) {
102 SkFontID font_id = tf->uniqueID(); 105 SkFontID font_id = tf->uniqueID();
103 font_ids_.push_back(font_id); 106 font_ids_.push_back(font_id);
104 std::unique_ptr<CachedFont>& cached_font = g_fonts.Get()[font_id]; 107 std::unique_ptr<CachedFont>& cached_font = g_fonts.Get()[font_id];
105 if (!cached_font) 108 if (!cached_font)
106 cached_font = CachedFont::CreateForTypeface(tf); 109 cached_font = CachedFont::CreateForTypeface(tf);
107 return cached_font->GetFontName(); 110 *font_name = cached_font->GetFontName();
111 return true;
108 } 112 }
109 unknown_chars_.insert(c); 113 unknown_chars_.insert(c);
110 return std::string(); 114 return false;
111 } 115 }
112 116
113 private: 117 private:
114 std::string locale_; 118 std::string locale_;
115 std::vector<SkFontID> font_ids_; 119 std::vector<SkFontID> font_ids_;
116 std::set<UChar32> unknown_chars_; 120 std::set<UChar32> unknown_chars_;
117 121
118 DISALLOW_COPY_AND_ASSIGN(CachedFontSet); 122 DISALLOW_COPY_AND_ASSIGN(CachedFontSet);
119 }; 123 };
120 124
121 base::LazyInstance<CachedFontSet>::Leaky g_cached_font_set = 125 base::LazyInstance<CachedFontSet>::Leaky g_cached_font_set =
122 LAZY_INSTANCE_INITIALIZER; 126 LAZY_INSTANCE_INITIALIZER;
123 127
124 bool FontSupportsChar(const gfx::Font& font, UChar32 c) { 128 bool FontSupportsChar(const gfx::Font& font, UChar32 c) {
125 sk_sp<SkTypeface> typeface = 129 sk_sp<SkTypeface> typeface =
126 static_cast<gfx::PlatformFontLinux*>(font.platform_font())->typeface(); 130 static_cast<gfx::PlatformFontLinux*>(font.platform_font())->typeface();
127 std::unique_ptr<CachedFont>& cached_font = 131 std::unique_ptr<CachedFont>& cached_font =
128 g_fonts.Get()[typeface->uniqueID()]; 132 g_fonts.Get()[typeface->uniqueID()];
129 if (!cached_font) 133 if (!cached_font)
130 cached_font = CachedFont::CreateForTypeface(std::move(typeface)); 134 cached_font = CachedFont::CreateForTypeface(std::move(typeface));
131 return cached_font->HasGlyphForCharacter(c); 135 return cached_font->HasGlyphForCharacter(c);
132 } 136 }
133 137
134 } // namespace 138 } // namespace
135 139
136 std::string GetFallbackFontNameForChar(const gfx::Font& default_font, 140 bool GetFallbackFontNameForChar(const gfx::Font& default_font,
137 UChar32 c, 141 UChar32 c,
138 const std::string& locale) { 142 const std::string& locale,
139 if (FontSupportsChar(default_font, c)) 143 std::string* font_name) {
140 return std::string(); 144 if (FontSupportsChar(default_font, c)) {
145 *font_name = std::string();
146 return true;
147 }
141 CachedFontSet& cached_font_set = g_cached_font_set.Get(); 148 CachedFontSet& cached_font_set = g_cached_font_set.Get();
142 cached_font_set.SetLocale(locale); 149 cached_font_set.SetLocale(locale);
143 return cached_font_set.GetFallbackFontNameForChar(c); 150 return cached_font_set.GetFallbackFontNameForChar(c, font_name);
144 } 151 }
145 152
146 } // namespace vr_shell 153 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/font_fallback.h ('k') | chrome/browser/android/vr_shell/textures/exit_warning_texture.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698