OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_harfbuzz.h" | 5 #include "ui/gfx/render_text_harfbuzz.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 #include <map> | 8 #include <map> |
9 | 9 |
10 #include "base/i18n/bidi_line_iterator.h" | 10 #include "base/i18n/bidi_line_iterator.h" |
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1187 #if defined(OS_WIN) | 1187 #if defined(OS_WIN) |
1188 // Append fonts in the fallback list of the Uniscribe font. | 1188 // Append fonts in the fallback list of the Uniscribe font. |
1189 if (!uniscribe_family.empty()) { | 1189 if (!uniscribe_family.empty()) { |
1190 std::vector<std::string> uniscribe_fallbacks = | 1190 std::vector<std::string> uniscribe_fallbacks = |
1191 GetFallbackFontFamilies(uniscribe_family); | 1191 GetFallbackFontFamilies(uniscribe_family); |
1192 fallback_families.insert(fallback_families.end(), | 1192 fallback_families.insert(fallback_families.end(), |
1193 uniscribe_fallbacks.begin(), uniscribe_fallbacks.end()); | 1193 uniscribe_fallbacks.begin(), uniscribe_fallbacks.end()); |
1194 } | 1194 } |
1195 #endif | 1195 #endif |
1196 | 1196 |
| 1197 // Get rid of duplicate fonts in the fallback list. We use the std::unique |
| 1198 // algorithm for this. However for this function to work we need to sort |
| 1199 // the font list as the unique algorithm relies on duplicates being adjacent. |
| 1200 // TODO(ananta) |
| 1201 // Sorting the list changes the order in which fonts are evaluated. This may |
| 1202 // cause problems in the way some characters appear. It may be best to do |
| 1203 // font fallback on the same lines as blink or skia which do this based on |
| 1204 // character glyph mapping. |
| 1205 std::sort(fallback_families.begin(), fallback_families.end()); |
| 1206 fallback_families.erase(std::unique( |
| 1207 fallback_families.begin(), fallback_families.end()), |
| 1208 fallback_families.end()); |
| 1209 |
1197 // Try shaping with the fallback fonts. | 1210 // Try shaping with the fallback fonts. |
1198 for (const auto& family : fallback_families) { | 1211 for (const auto& family : fallback_families) { |
1199 if (family == primary_family) | 1212 if (family == primary_family) |
1200 continue; | 1213 continue; |
1201 #if defined(OS_WIN) | 1214 #if defined(OS_WIN) |
1202 if (family == uniscribe_family) | 1215 if (family == uniscribe_family) |
1203 continue; | 1216 continue; |
1204 #endif | 1217 #endif |
1205 FontRenderParamsQuery query(false); | 1218 FontRenderParamsQuery query(false); |
1206 query.families.push_back(family); | 1219 query.families.push_back(family); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1329 if (!run->render_params.subpixel_positioning) | 1342 if (!run->render_params.subpixel_positioning) |
1330 run->width = std::floor(run->width + 0.5f); | 1343 run->width = std::floor(run->width + 0.5f); |
1331 } | 1344 } |
1332 | 1345 |
1333 hb_buffer_destroy(buffer); | 1346 hb_buffer_destroy(buffer); |
1334 hb_font_destroy(harfbuzz_font); | 1347 hb_font_destroy(harfbuzz_font); |
1335 return true; | 1348 return true; |
1336 } | 1349 } |
1337 | 1350 |
1338 } // namespace gfx | 1351 } // namespace gfx |
OLD | NEW |