Chromium Code Reviews| 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 "content/public/common/dwrite_font_platform_win.h" | 5 #include "content/public/common/dwrite_font_platform_win.h" |
| 6 | 6 |
| 7 #include <dwrite.h> | 7 #include <dwrite.h> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 // users, so we are putting arbitrary limit on cache file size. There are | 77 // users, so we are putting arbitrary limit on cache file size. There are |
| 78 // multiple ways we can tune our working size, like mapping only required part | 78 // multiple ways we can tune our working size, like mapping only required part |
| 79 // of section at any given time. | 79 // of section at any given time. |
| 80 const double kArbitraryCacheFileSizeLimit = (20 * 1024 * 1024); | 80 const double kArbitraryCacheFileSizeLimit = (20 * 1024 * 1024); |
| 81 | 81 |
| 82 // We have chosen current font file length arbitrarily. In our logic | 82 // We have chosen current font file length arbitrarily. In our logic |
| 83 // if we don't find file we are looking for in cache we end up loading | 83 // if we don't find file we are looking for in cache we end up loading |
| 84 // that file directly from system fonts folder. | 84 // that file directly from system fonts folder. |
| 85 const unsigned int kMaxFontFileNameLength = 34; | 85 const unsigned int kMaxFontFileNameLength = 34; |
| 86 | 86 |
| 87 const DWORD kCacheFileVersion = 101; | 87 const DWORD kCacheFileVersion = 102; |
| 88 const DWORD kFileSignature = 0x4D4F5243; // CROM | 88 const DWORD kFileSignature = 0x4D4F5243; // CROM |
| 89 const DWORD kMagicCompletionSignature = 0x454E4F44; // DONE | 89 const DWORD kMagicCompletionSignature = 0x454E4F44; // DONE |
| 90 | 90 |
| 91 const DWORD kUndefinedDWORDS = 36; | 91 const DWORD kUndefinedDWORDS = 36; |
| 92 | 92 |
| 93 // Make sure that all structure sizes align with 8 byte boundary otherwise | 93 // Make sure that all structure sizes align with 8 byte boundary otherwise |
| 94 // dr. memory test may complain. | 94 // dr. memory test may complain. |
| 95 #pragma pack(push, 8) | 95 #pragma pack(push, 8) |
| 96 // Cache file header, includes signature, completion bits and version. | 96 // Cache file header, includes signature, completion bits and version. |
| 97 struct CacheFileHeader { | 97 struct CacheFileHeader { |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1021 IDWriteFontCollection* GetCustomFontCollection(IDWriteFactory* factory) { | 1021 IDWriteFontCollection* GetCustomFontCollection(IDWriteFactory* factory) { |
| 1022 if (g_font_collection.Get() != NULL) | 1022 if (g_font_collection.Get() != NULL) |
| 1023 return g_font_collection.Get(); | 1023 return g_font_collection.Get(); |
| 1024 | 1024 |
| 1025 base::TimeTicks start_tick = base::TimeTicks::Now(); | 1025 base::TimeTicks start_tick = base::TimeTicks::Now(); |
| 1026 | 1026 |
| 1027 FontCollectionLoader::Initialize(factory); | 1027 FontCollectionLoader::Initialize(factory); |
| 1028 | 1028 |
| 1029 bool cache_file_loaded = g_font_loader->LoadCacheFile(); | 1029 bool cache_file_loaded = g_font_loader->LoadCacheFile(); |
| 1030 | 1030 |
| 1031 // We try here to put arbitrary limit on max number of fonts that could | |
| 1032 // be loaded, otherwise we fallback to restricted set of fonts. | |
| 1033 const UINT32 kMaxFontThreshold = 1750; | |
| 1034 HRESULT hr = E_FAIL; | 1031 HRESULT hr = E_FAIL; |
| 1035 if (g_font_loader->GetFontMapSize() < kMaxFontThreshold) { | 1032 g_font_loader->EnableCollectionBuildingMode(true); |
| 1036 g_font_loader->EnableCollectionBuildingMode(true); | 1033 hr = factory->CreateCustomFontCollection( |
| 1037 hr = factory->CreateCustomFontCollection( | 1034 g_font_loader.Get(), NULL, 0, g_font_collection.GetAddressOf()); |
| 1038 g_font_loader.Get(), NULL, 0, g_font_collection.GetAddressOf()); | 1035 g_font_loader->EnableCollectionBuildingMode(false); |
| 1039 g_font_loader->EnableCollectionBuildingMode(false); | |
| 1040 } | |
| 1041 | 1036 |
| 1042 bool loading_restricted = false; | 1037 bool loading_restricted = false; |
| 1043 if (FAILED(hr) || !g_font_collection.Get()) { | 1038 if (FAILED(hr) || !g_font_collection.Get()) { |
| 1044 loading_restricted = true; | 1039 loading_restricted = true; |
| 1045 // We will try here just one more time with restricted font set. | 1040 // We will try here just one more time with restricted font set. |
| 1046 g_font_loader->LoadRestrictedFontList(); | 1041 g_font_loader->LoadRestrictedFontList(); |
| 1047 hr = factory->CreateCustomFontCollection( | 1042 hr = factory->CreateCustomFontCollection( |
| 1048 g_font_loader.Get(), NULL, 0, g_font_collection.GetAddressOf()); | 1043 g_font_loader.Get(), NULL, 0, g_font_collection.GetAddressOf()); |
| 1049 } | 1044 } |
| 1050 | 1045 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1098 reinterpret_cast<IUnknown**>(factory.GetAddressOf())))); | 1093 reinterpret_cast<IUnknown**>(factory.GetAddressOf())))); |
| 1099 | 1094 |
| 1100 base::TimeTicks start_tick = base::TimeTicks::Now(); | 1095 base::TimeTicks start_tick = base::TimeTicks::Now(); |
| 1101 | 1096 |
| 1102 FontCollectionLoader::Initialize(factory.Get()); | 1097 FontCollectionLoader::Initialize(factory.Get()); |
| 1103 | 1098 |
| 1104 g_font_loader->EnterStaticCacheMode(file_name); | 1099 g_font_loader->EnterStaticCacheMode(file_name); |
| 1105 | 1100 |
| 1106 mswr::ComPtr<IDWriteFontCollection> font_collection; | 1101 mswr::ComPtr<IDWriteFontCollection> font_collection; |
| 1107 | 1102 |
| 1108 // We try here to put arbitrary limit on max number of fonts that could | |
| 1109 // be loaded, otherwise we fallback to restricted set of fonts. | |
|
cpu_(ooo_6.6-7.5)
2014/12/11 23:31:24
we had the same constant twice?
Shrikant Kelkar
2014/12/11 23:43:50
Acknowledged.
| |
| 1110 const UINT32 kMaxFontThreshold = 1750; | |
| 1111 HRESULT hr = E_FAIL; | 1103 HRESULT hr = E_FAIL; |
| 1112 if (g_font_loader->GetFontMapSize() < kMaxFontThreshold) { | 1104 g_font_loader->EnableCollectionBuildingMode(true); |
|
cpu_(ooo_6.6-7.5)
2014/12/11 23:31:24
can it handle 20K fonts? is so go ahead. lgtm.
Shrikant Kelkar
2014/12/11 23:43:50
It may not.. but in this experiment let's see to w
| |
| 1113 g_font_loader->EnableCollectionBuildingMode(true); | 1105 hr = factory->CreateCustomFontCollection( |
| 1114 hr = factory->CreateCustomFontCollection( | 1106 g_font_loader.Get(), NULL, 0, font_collection.GetAddressOf()); |
| 1115 g_font_loader.Get(), NULL, 0, font_collection.GetAddressOf()); | 1107 g_font_loader->EnableCollectionBuildingMode(false); |
| 1116 g_font_loader->EnableCollectionBuildingMode(false); | |
| 1117 } | |
| 1118 | 1108 |
| 1119 bool loading_restricted = false; | 1109 bool loading_restricted = false; |
| 1120 if (FAILED(hr) || !font_collection.Get()) { | 1110 if (FAILED(hr) || !font_collection.Get()) { |
| 1121 loading_restricted = true; | 1111 loading_restricted = true; |
| 1122 // We will try here just one more time with restricted font set. | 1112 // We will try here just one more time with restricted font set. |
| 1123 g_font_loader->LoadRestrictedFontList(); | 1113 g_font_loader->LoadRestrictedFontList(); |
| 1124 hr = factory->CreateCustomFontCollection( | 1114 hr = factory->CreateCustomFontCollection( |
| 1125 g_font_loader.Get(), NULL, 0, font_collection.GetAddressOf()); | 1115 g_font_loader.Get(), NULL, 0, font_collection.GetAddressOf()); |
| 1126 } | 1116 } |
| 1127 | 1117 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1184 g_shared_font_cache.Set(mapping); | 1174 g_shared_font_cache.Set(mapping); |
| 1185 | 1175 |
| 1186 return true; | 1176 return true; |
| 1187 } | 1177 } |
| 1188 | 1178 |
| 1189 bool BuildFontCache(const base::FilePath& file) { | 1179 bool BuildFontCache(const base::FilePath& file) { |
| 1190 return BuildFontCacheInternal(file.value().c_str()); | 1180 return BuildFontCacheInternal(file.value().c_str()); |
| 1191 } | 1181 } |
| 1192 | 1182 |
| 1193 } // namespace content | 1183 } // namespace content |
| OLD | NEW |