Import Cobalt 21.lts.4.302899
diff --git a/src/base/third_party/xdg_mime/README.chromium b/src/base/third_party/xdg_mime/README.chromium index 8212752..8b1b4ed 100644 --- a/src/base/third_party/xdg_mime/README.chromium +++ b/src/base/third_party/xdg_mime/README.chromium
@@ -12,3 +12,6 @@ xdg_mime_get_mime_type_for_file() - use of pointer after being freed. - function_casts.patch: fix bad function casts. - Added a LICENSE file. + +Of the dual-licenses, it is licensed under the terms of the Academic Free +License, version 2.0, in licenses_cobalt.txt.
diff --git a/src/cobalt/base/language.cc b/src/cobalt/base/language.cc index 819e56a..ed98739 100644 --- a/src/cobalt/base/language.cc +++ b/src/cobalt/base/language.cc
@@ -62,6 +62,11 @@ if (U_SUCCESS(icu_result) && buffer[0]) { language += "-"; language += buffer; + } else { + uloc_addLikelySubtags(NULL, buffer, arraysize(buffer), &icu_result); + if (U_SUCCESS(icu_result) && buffer[0]) { + return buffer; + } } // We should end up with something like "en" or "en-Latn".
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc index 7d6a781..0a6672e 100644 --- a/src/cobalt/browser/application.cc +++ b/src/cobalt/browser/application.cc
@@ -563,7 +563,7 @@ version.push_back('\0'); CrashpadAnnotations crashpad_annotations; - SbMemorySet(&crashpad_annotations, sizeof(CrashpadAnnotations), 0); + SbMemorySet(&crashpad_annotations, 0, sizeof(CrashpadAnnotations)); SbStringCopy(crashpad_annotations.user_agent_string, user_agent.c_str(), USER_AGENT_STRING_MAX_SIZE); SbStringCopy(crashpad_annotations.product, product.c_str(),
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc index 189622c..5591b06 100644 --- a/src/cobalt/browser/browser_module.cc +++ b/src/cobalt/browser/browser_module.cc
@@ -48,8 +48,10 @@ #include "cobalt/dom/keycode.h" #include "cobalt/dom/mutation_observer_task_manager.h" #include "cobalt/dom/window.h" +#include "cobalt/extension/graphics.h" #include "cobalt/h5vcc/h5vcc.h" #include "cobalt/input/input_device_manager_fuzzer.h" +#include "cobalt/math/matrix3_f.h" #include "cobalt/overlay_info/overlay_info_registry.h" #include "nb/memory_scope.h" #include "starboard/atomic.h" @@ -1749,6 +1751,22 @@ } ViewportSize BrowserModule::GetViewportSize() { + // If a custom render root transform is used, report the size of the + // transformed viewport. + math::Matrix3F viewport_transform = math::Matrix3F::Identity(); + static const CobaltExtensionGraphicsApi* s_graphics_extension = + static_cast<const CobaltExtensionGraphicsApi*>( + SbSystemGetExtension(kCobaltExtensionGraphicsName)); + float m00, m01, m02, m10, m11, m12, m20, m21, m22; + if (s_graphics_extension && + strcmp(s_graphics_extension->name, kCobaltExtensionGraphicsName) == 0 && + s_graphics_extension->version >= 5 && + s_graphics_extension->GetRenderRootTransform(&m00, &m01, &m02, &m10, &m11, + &m12, &m20, &m21, &m22)) { + viewport_transform = + math::Matrix3F::FromValues(m00, m01, m02, m10, m11, m12, m20, m21, m22); + } + // We trust the renderer module for width and height the most, if it exists. if (renderer_module_) { math::Size target_size = renderer_module_->render_target_size(); @@ -1773,6 +1791,9 @@ options_.requested_viewport_size->device_pixel_ratio(); } + target_size = + math::RoundOut(viewport_transform.MapRect(math::RectF(target_size))) + .size(); ViewportSize v(target_size.width(), target_size.height(), diagonal_inches, device_pixel_ratio); return v; @@ -1781,6 +1802,7 @@ // If the system window exists, that's almost just as good. if (system_window_) { math::Size size = system_window_->GetWindowSize(); + size = math::RoundOut(viewport_transform.MapRect(math::RectF(size))).size(); ViewportSize v(size.width(), size.height(), system_window_->GetDiagonalSizeInches(), system_window_->GetDevicePixelRatio()); @@ -1789,7 +1811,14 @@ // Otherwise, we assume we'll get the viewport size that was requested. if (options_.requested_viewport_size) { - return *options_.requested_viewport_size; + math::Size requested_size = + math::RoundOut(viewport_transform.MapRect(math::RectF( + options_.requested_viewport_size->width(), + options_.requested_viewport_size->height()))) + .size(); + return ViewportSize(requested_size.width(), requested_size.height(), + options_.requested_viewport_size->diagonal_inches(), + options_.requested_viewport_size->device_pixel_ratio()); } // TODO: Allow platforms to define the default window size and return that @@ -1797,7 +1826,11 @@ // No window and no viewport size was requested, so we return a conservative // default. - ViewportSize view_size(1280, 720); + math::Size default_size(1280, 720); + default_size = + math::RoundOut(viewport_transform.MapRect(math::RectF(default_size))) + .size(); + ViewportSize view_size(default_size.width(), default_size.height()); return view_size; } @@ -1896,7 +1929,11 @@ std::map<std::string, std::string> url_param_map; // If this is the initial startup, use topic within deeplink, if specified. if (main_web_module_generation_ == 1) { - GetParamMap(GetInitialDeepLink(), url_param_map); + std::string deeplink = GetInitialDeepLink(); + size_t query_pos = deeplink.find('?'); + if (query_pos != std::string::npos) { + GetParamMap(deeplink.substr(query_pos + 1), url_param_map); + } } // If this is not the initial startup, there was no deeplink specified, or // the deeplink did not have a topic, check the current url for a topic.
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc index 5036fd6..7db38cb 100644 --- a/src/cobalt/browser/web_module.cc +++ b/src/cobalt/browser/web_module.cc
@@ -660,10 +660,7 @@ web_module_stat_tracker_->dom_stat_tracker(), data.initial_url, data.network_module->GetUserAgent(), data.network_module->preferred_language(), - data.options.font_language_script_override.empty() - ? base::GetSystemLanguageScript() - : data.options.font_language_script_override, - data.options.navigation_callback, + base::GetSystemLanguageScript(), data.options.navigation_callback, base::Bind(&WebModule::Impl::OnLoadComplete, base::Unretained(this)), data.network_module->cookie_jar(), data.network_module->GetPostSender(), data.options.require_csp, data.options.csp_enforcement_mode,
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h index 0f340cd..78e0fe7 100644 --- a/src/cobalt/browser/web_module.h +++ b/src/cobalt/browser/web_module.h
@@ -210,11 +210,6 @@ // the suspend state. bool should_retain_remote_typeface_cache_on_suspend = false; - // The language and script to use with fonts. If left empty, then the - // language-script combination provided by base::GetSystemLanguageScript() - // is used. - std::string font_language_script_override; - // The splash screen cache object, owned by the BrowserModule. SplashScreenCache* splash_screen_cache;
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id index 22d7db0..87efaac 100644 --- a/src/cobalt/build/build.id +++ b/src/cobalt/build/build.id
@@ -1 +1 @@ -302122 \ No newline at end of file +302899 \ No newline at end of file
diff --git a/src/cobalt/content/fonts/config/common/fonts.xml b/src/cobalt/content/fonts/config/common/fonts.xml index 8f84727..abba022 100644 --- a/src/cobalt/content/fonts/config/common/fonts.xml +++ b/src/cobalt/content/fonts/config/common/fonts.xml
@@ -164,337 +164,337 @@ <!-- "Noto Naskh Arabic UI" is given a fallback priority so that, in spite of having a name, it will still be included as a fallback font. --> - <family fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254"> + <family lang="und-Arab" fallback_priority="0" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254"> <font weight="400" style="normal">NotoNaskhArabicUI-Regular.woff2</font> <font weight="700" style="normal">NotoNaskhArabicUI-Bold.woff2</font> </family> - <family pages="0,18-19,45,171,254"> + <family lang="und-Ethi" pages="0,18-19,45,171,254"> <font weight="400" style="normal">NotoSansEthiopic-Regular.woff2</font> <font weight="700" style="normal">NotoSansEthiopic-Bold.woff2</font> </family> - <family pages="0,5,32,37,251,254"> + <family lang="und-Hebr" pages="0,5,32,37,251,254"> <font weight="400" style="normal">NotoSansHebrew-Regular.woff2</font> <font weight="700" style="normal">NotoSansHebrew-Bold.woff2</font> </family> - <family pages="0,2-3,14,32,37,254"> + <family lang="und-Thai" pages="0,2-3,14,32,37,254"> <font weight="400" style="normal">NotoSansThaiUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansThaiUI-Bold.woff2</font> </family> - <family pages="0,5,32,251"> + <family lang="und-Armn" pages="0,5,32,251"> <font weight="400" style="normal">NotoSansArmenian-Regular.woff2</font> <font weight="700" style="normal">NotoSansArmenian-Bold.woff2</font> </family> - <family pages="0,5,16,45,254"> + <family lang="und-Geor,und-Geok" pages="0,5,16,45,254"> <font weight="400" style="normal">NotoSansGeorgian-Regular.woff2</font> <font weight="700" style="normal">NotoSansGeorgian-Bold.woff2</font> </family> - <family pages="0,2,9,28,32,34,37,168,254"> + <family lang="und-Deva" pages="0,2,9,28,32,34,37,168,254"> <font weight="400" style="normal">NotoSansDevanagariUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansDevanagariUI-Bold.woff2</font> </family> <!-- Gujarati should come after Devanagari --> - <family pages="0,9-10,32,34,37,168,254"> + <family lang="und-Gujr" pages="0,9-10,32,34,37,168,254"> <font weight="400" style="normal">NotoSansGujaratiUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansGujaratiUI-Bold.woff2</font> </family> <!-- Gurmukhi should come after Devanagari --> - <family pages="0,9-10,32,34,37-38,168,254"> + <family lang="und-Guru" pages="0,9-10,32,34,37-38,168,254"> <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.woff2</font> </family> - <family pages="0,9,11,32,34,37,254"> + <family lang="und-Taml" pages="0,9,11,32,34,37,254"> <font weight="400" style="normal">NotoSansTamilUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansTamilUI-Bold.woff2</font> </family> - <family pages="0,3,9,13,32,34,37,254"> + <family lang="und-Mlym" pages="0,3,9,13,32,34,37,254"> <font weight="400" style="normal">NotoSansMalayalamUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansMalayalamUI-Bold.woff2</font> </family> - <family pages="0,9,32,34,37,254"> + <family lang="und-Beng" pages="0,9,32,34,37,254"> <font weight="400" style="normal">NotoSansBengaliUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansBengaliUI-Bold.woff2</font> </family> - <family pages="0,9,12,32,34,37,254"> + <family lang="und-Telu" pages="0,9,12,32,34,37,254"> <font weight="400" style="normal">NotoSansTeluguUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansTeluguUI-Bold.woff2</font> </family> - <family pages="0,9,12,32,34,37,254"> + <family lang="und-Knda" pages="0,9,12,32,34,37,254"> <font weight="400" style="normal">NotoSansKannadaUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansKannadaUI-Bold.woff2</font> </family> - <family pages="0,9,11,32,34,37,254"> + <family lang="und-Orya" pages="0,9,11,32,34,37,254"> <font weight="400" style="normal">NotoSansOriyaUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansOriyaUI-Bold.woff2</font> </family> - <family pages="0,9,13,32,34,37,254"> + <family lang="und-Sinh" pages="0,9,13,32,34,37,254"> <font weight="400" style="normal">NotoSansSinhala-Regular.woff2</font> <font weight="700" style="normal">NotoSansSinhala-Bold.woff2</font> </family> - <family pages="0,23,25,32,37"> + <family lang="und-Khmr" pages="0,23,25,32,37"> <font weight="400" style="normal">NotoSansKhmerUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansKhmerUI-Bold.woff2</font> </family> - <family pages="0,3,14,32,37"> + <family lang="und-Laoo" pages="0,3,14,32,37"> <font weight="400" style="normal">NotoSansLaoUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansLaoUI-Bold.woff2</font> </family> - <family pages="0,16,32,37,169-170,254"> + <family lang="und-Mymr" pages="0,16,32,37,169-170,254"> <font weight="400" style="normal">NotoSansMyanmarUI-Regular.woff2</font> <font weight="700" style="normal">NotoSansMyanmarUI-Bold.woff2</font> </family> - <family pages="0,6-7,32,37,253-254"> + <family lang="und-Thaa" pages="0,6-7,32,37,253-254"> <font weight="400" style="normal">NotoSansThaana-Regular.woff2</font> <font weight="700" style="normal">NotoSansThaana-Bold.woff2</font> </family> - <family pages="0,3,170"> + <family lang="und-Cham" pages="0,3,170"> <font weight="400" style="normal">NotoSansCham-Regular.woff2</font> <font weight="700" style="normal">NotoSansCham-Bold.woff2</font> </family> - <family pages="0,6,32,46,489"> + <family lang="und-Adlm" pages="0,6,32,46,489"> <font weight="400" style="normal">NotoSansAdlam-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,32,46,254,267"> + <family lang="und-Avst" pages="0,32,46,254,267"> <font weight="400" style="normal">NotoSansAvestan-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,27,32,37,254"> + <family lang="und-Bali" pages="0,27,32,37,254"> <font weight="400" style="normal">NotoSansBalinese-Regular.woff2</font> </family> - <family pages="0,166,254,360-362"> + <family lang="und-Bamu" pages="0,166,254,360-362"> <font weight="400" style="normal">NotoSansBamum-Regular.woff2</font> </family> - <family pages="0,27,254"> + <family lang="und-Batk" pages="0,27,254"> <font weight="400" style="normal">NotoSansBatak-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,272"> + <family lang="und-Brah" pages="0,254,272"> <font weight="400" style="normal">NotoSansBrahmi-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,26,32,37,169,254"> + <family lang="und-Bugi" pages="0,26,32,37,169,254"> <font weight="400" style="normal">NotoSansBuginese-Regular.woff2</font> </family> - <family pages="0,23,254"> + <family lang="und-Buhd" pages="0,23,254"> <font weight="400" style="normal">NotoSansBuhid-Regular.woff2</font> </family> - <family pages="0-3,20-22,24,254"> + <family lang="und-Cans" pages="0-3,20-22,24,254"> <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,258"> + <family lang="und-Cari" pages="0,254,258"> <font weight="400" style="normal">NotoSansCarian-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,3,19,171"> + <family lang="und-Cher" pages="0,3,19,171"> <font weight="400" style="normal">NotoSansCherokee-Regular.woff2</font> </family> - <family pages="0,3,29,37,44,254"> + <family lang="und-Copt" pages="0,3,29,37,44,254"> <font weight="400" style="normal">NotoSansCoptic-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,288-292"> + <family lang="und-Xsux" pages="0,254,288-292"> <font weight="400" style="normal">NotoSansCuneiform-Regular.woff2</font> </family> - <family pages="0,254,264"> + <family lang="und-Cprt" pages="0,254,264"> <font weight="400" style="normal">NotoSansCypriot-Regular.woff2</font> </family> - <family pages="0,254,260"> + <family lang="und-Dsrt" pages="0,254,260"> <font weight="400" style="normal">NotoSansDeseret-Regular.woff2</font> </family> - <family pages="0,254,304-308"> + <family lang="und-Egyp" pages="0,254,304-308"> <font weight="400" style="normal">NotoSansEgyptianHieroglyphs-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,44,254"> + <family lang="und-Glag" pages="0,44,254"> <font weight="400" style="normal">NotoSansGlagolitic-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,3,254,259"> + <family lang="und-Goth" pages="0,3,254,259"> <font weight="400" style="normal">NotoSansGothic-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,23,254"> + <family lang="und-Hano" pages="0,23,254"> <font weight="400" style="normal">NotoSansHanunoo-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,264"> + <family lang="und-Armi" pages="0,254,264"> <font weight="400" style="normal">NotoSansImperialAramaic-Regular.woff2</font> </family> - <family pages="0,254,267"> + <family lang="und-Phli" pages="0,254,267"> <font weight="400" style="normal">NotoSansInscriptionalPahlavi-Regular.woff2</font> </family> - <family pages="0,254,267"> + <family lang="und-Prti" pages="0,254,267"> <font weight="400" style="normal">NotoSansInscriptionalParthian-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,32,37,169,254"> + <family lang="und-Java" pages="0,32,37,169,254"> <font weight="400" style="normal">NotoSansJavanese-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,9,168,254,272"> + <family lang="und-Kthi" pages="0,9,168,254,272"> <font weight="400" style="normal">NotoSansKaithi-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,169,254"> + <family lang="und-Kali" pages="0,169,254"> <font weight="400" style="normal">NotoSansKayahLi-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,266"> + <family lang="und-Khar" pages="0,254,266"> <font weight="400" style="normal">NotoSansKharoshthi-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,28,37,254"> + <family lang="und-Lepc" pages="0,28,37,254"> <font weight="400" style="normal">NotoSansLepcha-Regular.woff2</font> </family> - <family pages="0,9,25,254"> + <family lang="und-Limb" pages="0,9,25,254"> <font weight="400" style="normal">NotoSansLimbu-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,256-257"> + <family lang="und-Linb" pages="0,254,256-257"> <font weight="400" style="normal">NotoSansLinearB-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,2,164,254"> + <family lang="und-Lisu" pages="0,2,164,254"> <font weight="400" style="normal">NotoSansLisu-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,258"> + <family lang="und-Lyci" pages="0,254,258"> <font weight="400" style="normal">NotoSansLycian-Regular.woff2</font> </family> - <family pages="0,254,265"> + <family lang="und-Lydi" pages="0,254,265"> <font weight="400" style="normal">NotoSansLydian-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,6,8,254"> + <family lang="und-Mand" pages="0,6,8,254"> <font weight="400" style="normal">NotoSansMandaic-Regular.woff2</font> </family> - <family pages="0,170-171,254"> + <family lang="und-Mtei" pages="0,170-171,254"> <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.woff2</font> </family> - <family pages="0,25,254"> + <family lang="und-Talu" pages="0,25,254"> <font weight="400" style="normal">NotoSansNewTaiLue-Regular.woff2</font> </family> - <family pages="0,6-7,32,46,253-254"> + <family lang="und-Nkoo" pages="0,6-7,32,46,253-254"> <font weight="400" style="normal">NotoSansNKo-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,22,254"> + <family lang="und-Ogam" pages="0,22,254"> <font weight="400" style="normal">NotoSansOgham-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,28,254"> + <family lang="und-Olck" pages="0,28,254"> <font weight="400" style="normal">NotoSansOlChiki-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,259"> + <family lang="und-Ital" pages="0,254,259"> <font weight="400" style="normal">NotoSansOldItalic-Regular.woff2</font> </family> - <family pages="0,254,259"> + <family lang="und-Xpeo" pages="0,254,259"> <font weight="400" style="normal">NotoSansOldPersian-Regular.woff2</font> </family> - <family pages="0,254,266"> + <family lang="und-Sarb" pages="0,254,266"> <font weight="400" style="normal">NotoSansOldSouthArabian-Regular.woff2</font> </family> - <family pages="0,254,268"> + <family lang="und-Orkh" pages="0,254,268"> <font weight="400" style="normal">NotoSansOldTurkic-Regular.woff2</font> </family> - <family pages="0,254,260"> + <family lang="und-Osma" pages="0,254,260"> <font weight="400" style="normal">NotoSansOsmanya-Regular.woff2</font> </family> - <family pages="0,254,265"> + <family lang="und-Phnx" pages="0,254,265"> <font weight="400" style="normal">NotoSansPhoenician-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,169,254"> + <family lang="und-Rjng" pages="0,169,254"> <font weight="400" style="normal">NotoSansRejang-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,22,254"> + <family lang="und-Runr" pages="0,22,254"> <font weight="400" style="normal">NotoSansRunic-Regular.woff2</font> </family> - <family pages="0,8,46,254"> + <family lang="und-Samr" pages="0,8,46,254"> <font weight="400" style="normal">NotoSansSamaritan-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,32,37,168,254"> + <family lang="und-Saur" pages="0,32,37,168,254"> <font weight="400" style="normal">NotoSansSaurashtra-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,254,260"> + <family lang="und-Shaw" pages="0,254,260"> <font weight="400" style="normal">NotoSansShavian-Regular.woff2</font> </family> </package> <package name="fallback-lang-non-cjk"> - <family pages="0,27-28,254"> + <family lang="und-Sund" pages="0,27-28,254"> <font weight="400" style="normal">NotoSansSundanese-Regular.woff2</font> </family> - <family pages="0,9,32,37,168,254"> + <family lang="und-Sylo" pages="0,9,32,37,168,254"> <font weight="400" style="normal">NotoSansSylotiNagri-Regular.woff2</font> </family> <!-- Estrangela should precede Eastern and Western Syriac, since it's our default form. --> - <family pages="0,3,6-7,32,34,37-38,254"> + <family lang="und-Syre" pages="0,3,6-7,32,34,37-38,254"> <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.woff2</font> </family> - <family pages="0,3,6-7,32,34,37-38,254"> + <family lang="und-Syrn" pages="0,3,6-7,32,34,37-38,254"> <font weight="400" style="normal">NotoSansSyriacEastern-Regular.woff2</font> </family> - <family pages="0,3,6-7,32,34,37-38,254"> + <family lang="und-Syrj" pages="0,3,6-7,32,34,37-38,254"> <font weight="400" style="normal">NotoSansSyriacWestern-Regular.woff2</font> </family> - <family pages="0,23,254"> + <family lang="und-Tglg" pages="0,23,254"> <font weight="400" style="normal">NotoSansTagalog-Regular.woff2</font> </family> - <family pages="0,23,254"> + <family lang="und-Tagb" pages="0,23,254"> <font weight="400" style="normal">NotoSansTagbanwa-Regular.woff2</font> </family> - <family pages="0,26,32,34,37,254"> + <family lang="und-Lana" pages="0,26,32,34,37,254"> <font weight="400" style="normal">NotoSansTaiTham-Regular.woff2</font> </family> - <family pages="0,32,37,167,170,254"> + <family lang="und-Tavt" pages="0,32,37,167,170,254"> <font weight="400" style="normal">NotoSansTaiViet-Regular.woff2</font> </family> - <family pages="0,15,32,37,254"> + <family lang="und-Tibt" pages="0,15,32,37,254"> <font weight="400" style="normal">NotoSansTibetan-Regular.woff2</font> <font weight="700" style="normal">NotoSansTibetan-Bold.woff2</font> </family> - <family pages="0,3,32,45,254"> + <family lang="und-Tfng" pages="0,3,32,45,254"> <font weight="400" style="normal">NotoSansTifinagh-Regular.woff2</font> </family> </package> - <package name="fallback-historic"> + <package lang="und-Ugar" name="fallback-historic"> <family pages="0,254,259"> <font weight="400" style="normal">NotoSansUgaritic-Regular.woff2</font> </family> </package> - <package name="fallback-lang-non-cjk"> + <package lang="und-Vaii" name="fallback-lang-non-cjk"> <family pages="0,165-166,254"> <font weight="400" style="normal">NotoSansVai-Regular.woff2</font> </family> @@ -519,7 +519,7 @@ </family> </package> <package name="fallback-color-emoji"> - <family pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072"> + <family lang="und-Zsye" pages="0,32-33,35-39,41,43,48,50,496-502,505,3584,4068,4072"> <font weight="400" style="normal" disable_synthetic_bolding="true">NotoColorEmoji.woff2</font> </family> </package> @@ -529,7 +529,7 @@ </family> </package> <package name="fallback-symbols"> - <family pages="35,37-39,43,496-498"> + <family lang="und-Zsym" pages="35,37-39,43,496-498"> <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.woff2</font> </family> </package> @@ -548,18 +548,18 @@ Tai Le, Yi, Mongolian, and Phags-pa are intentionally kept last, to make sure they don't override the East Asian punctuation for Chinese. --> - <family pages="0,3,16,25,48,254"> + <family lang="und-Tale" pages="0,3,16,25,48,254"> <font weight="400" style="normal">NotoSansTaiLe-Regular.woff2</font> </family> - <family pages="0,48,160-164,254-255"> + <family lang="und-Yiii" pages="0,48,160-164,254-255"> <font weight="400" style="normal">NotoSansYi-Regular.woff2</font> </family> - <family pages="0,24,32,36-37,48,254"> + <family lang="und-Mong" pages="0,24,32,36-37,48,254"> <font weight="400" style="normal">NotoSansMongolian-Regular.woff2</font> </family> </package> <package name="fallback-historic"> - <family pages="0,24,32,37,48,168,254"> + <family lang="und-Phag" pages="0,24,32,37,48,168,254"> <font weight="400" style="normal">NotoSansPhagsPa-Regular.woff2</font> </family> </package>
diff --git a/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt b/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt index e431145..ef96d48 100644 --- a/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt +++ b/src/cobalt/content/licenses/platform/android/licenses_cobalt.txt
@@ -850,205 +850,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - xdg_mime - - - Licensed under the Academic Free License version 2.0 (below) - Or under the following terms: - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - - -------------------------------------------------------------------------------- - Academic Free License v. 2.0 - -------------------------------------------------------------------------------- - - This Academic Free License (the "License") applies to any original work of - authorship (the "Original Work") whose owner (the "Licensor") has placed the - following notice immediately following the copyright notice for the Original - Work: - - Licensed under the Academic Free License version 2.0 - 1) Grant of Copyright License. Licensor hereby grants You a world-wide, - royalty-free, non-exclusive, perpetual, sublicenseable license to do the - following: - - a) to reproduce the Original Work in copies; - b) to prepare derivative works ("Derivative Works") based upon the Original - Work; - c) to distribute copies of the Original Work and Derivative Works to the - public; - d) to perform the Original Work publicly; and - e) to display the Original Work publicly. - - 2) Grant of Patent License. Licensor hereby grants You a world-wide, - royalty-free, non-exclusive, perpetual, sublicenseable license, under patent - claims owned or controlled by the Licensor that are embodied in the Original - Work as furnished by the Licensor, to make, use, sell and offer for sale the - Original Work and Derivative Works. - - 3) Grant of Source Code License. The term "Source Code" means the preferred - form of the Original Work for making modifications to it and all available - documentation describing how to modify the Original Work. Licensor hereby - agrees to provide a machine-readable copy of the Source Code of the Original - Work along with each copy of the Original Work that Licensor distributes. - Licensor reserves the right to satisfy this obligation by placing a - machine-readable copy of the Source Code in an information repository - reasonably calculated to permit inexpensive and convenient access by You for as - long as Licensor continues to distribute the Original Work, and by publishing - the address of that information repository in a notice immediately following - the copyright notice that applies to the Original Work. - - 4) Exclusions From License Grant. Neither the names of Licensor, nor the names - of any contributors to the Original Work, nor any of their trademarks or - service marks, may be used to endorse or promote products derived from this - Original Work without express prior written permission of the Licensor. Nothing - in this License shall be deemed to grant any rights to trademarks, copyrights, - patents, trade secrets or any other intellectual property of Licensor except as - expressly stated herein. No patent license is granted to make, use, sell or - offer to sell embodiments of any patent claims other than the licensed claims - defined in Section 2. No right is granted to the trademarks of Licensor even if - such marks are included in the Original Work. Nothing in this License shall be - interpreted to prohibit Licensor from licensing under different terms from this - License any Original Work that Licensor otherwise would have a right to - license. - - 5) This section intentionally omitted. - - 6) Attribution Rights. You must retain, in the Source Code of any Derivative - Works that You create, all copyright, patent or trademark notices from the - Source Code of the Original Work, as well as any notices of licensing and any - descriptive text identified therein as an "Attribution Notice." You must cause - the Source Code for any Derivative Works that You create to carry a prominent - Attribution Notice reasonably calculated to inform recipients that You have - modified the Original Work. - - 7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that - the copyright in and to the Original Work and the patent rights granted herein - by Licensor are owned by the Licensor or are sublicensed to You under the terms - of this License with the permission of the contributor(s) of those copyrights - and patent rights. Except as expressly stated in the immediately proceeding - sentence, the Original Work is provided under this License on an "AS IS" BASIS - and WITHOUT WARRANTY, either express or implied, including, without limitation, - the warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR - PURPOSE. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS WITH YOU. - This DISCLAIMER OF WARRANTY constitutes an essential part of this License. No - license to Original Work is granted hereunder except under this disclaimer. - - 8) Limitation of Liability. Under no circumstances and under no legal theory, - whether in tort (including negligence), contract, or otherwise, shall the - Licensor be liable to any person for any direct, indirect, special, incidental, - or consequential damages of any character arising as a result of this License - or the use of the Original Work including, without limitation, damages for loss - of goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses. This limitation of liability shall not - apply to liability for death or personal injury resulting from Licensor's - negligence to the extent applicable law prohibits such limitation. Some - jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - - 9) Acceptance and Termination. If You distribute copies of the Original Work or - a Derivative Work, You must make a reasonable effort under the circumstances to - obtain the express assent of recipients to the terms of this License. Nothing - else but this License (or another written agreement between Licensor and You) - grants You permission to create Derivative Works based upon the Original Work - or to exercise any of the rights granted in Section 1 herein, and any attempt - to do so except under the terms of this License (or another written agreement - between Licensor and You) is expressly prohibited by U.S. copyright law, the - equivalent laws of other countries, and by international treaty. Therefore, by - exercising any of the rights granted to You in Section 1 herein, You indicate - Your acceptance of this License and all of its terms and conditions. - - 10) Termination for Patent Action. This License shall terminate automatically - and You may no longer exercise any of the rights granted to You by this License - as of the date You commence an action, including a cross-claim or counterclaim, - for patent infringement (i) against Licensor with respect to a patent - applicable to software or (ii) against any entity with respect to a patent - applicable to the Original Work (but excluding combinations of the Original - Work with other software or hardware). - - 11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this - License may be brought only in the courts of a jurisdiction wherein the - Licensor resides or in which Licensor conducts its primary business, and under - the laws of that jurisdiction excluding its conflict-of-law provisions. The - application of the United Nations Convention on Contracts for the International - Sale of Goods is expressly excluded. Any use of the Original Work outside the - scope of this License or after its termination shall be subject to the - requirements and penalties of the U.S. Copyright Act, 17 U.S.C. 101 et seq., - the equivalent laws of other countries, and international treaty. This section - shall survive the termination of this License. - - 12) Attorneys Fees. In any action to enforce the terms of this License or - seeking damages relating thereto, the prevailing party shall be entitled to - recover its costs and expenses, including, without limitation, reasonable - attorneys' fees and costs incurred in connection with such action, including - any appeal of such action. This section shall survive the termination of this - License. - - 13) Miscellaneous. This License represents the complete agreement concerning - the subject matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent necessary to - make it enforceable. - - 14) Definition of "You" in This License. "You" throughout this License, whether - in upper or lower case, means an individual or a legal entity exercising rights - under, and complying with all of the terms of, this License. For legal - entities, "You" includes any entity that controls, is controlled by, or is - under common control with you. For purposes of this definition, "control" means - (i) the power, direct or indirect, to cause the direction or management of such - entity, whether by contract or otherwise, or (ii) ownership of fifty percent - (50%) or more of the outstanding shares, or (iii) beneficial ownership of such - entity. - - 15) Right to Use. You may use the Original Work in all ways not otherwise - restricted or conditioned by this License or by law, and Licensor promises not - to interfere with or be responsible for such uses by You. - - This license is Copyright (C) 2003 Lawrence E. Rosen. All rights reserved. - Permission is hereby granted to copy and distribute this license without - modification. This license may not be modified without the express written - permission of its copyright owner. - - - xdg_user_dirs - - - Copyright (c) 2007 Red Hat, inc - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation files - (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, - publish, distribute, sublicense, and/or sell copies of the Software, - and to permit persons to whom the Software is furnished to do so, - subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE. - - uri_template
diff --git a/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt b/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt index 757106b..5b4bc55 100644 --- a/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt +++ b/src/cobalt/content/licenses/platform/default/licenses_cobalt.txt
@@ -853,25 +853,6 @@ xdg_mime - Licensed under the Academic Free License version 2.0 (below) - Or under the following terms: - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - -------------------------------------------------------------------------------- Academic Free License v. 2.0 --------------------------------------------------------------------------------
diff --git a/src/cobalt/extension/updater_notification.h b/src/cobalt/extension/updater_notification.h index 151437f..ce301dc 100644 --- a/src/cobalt/extension/updater_notification.h +++ b/src/cobalt/extension/updater_notification.h
@@ -51,7 +51,8 @@ // and prompt the user to free some storage. The implementation // should keep track of the frequency of showing the prompt to the // user and try to minimize the number of user notifications. - void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state); + void (*UpdaterState)(CobaltExtensionUpdaterNotificationState state, + const char* current_evergreen_version); } CobaltExtensionUpdaterNotificationApi; #ifdef __cplusplus
diff --git a/src/cobalt/media/base/starboard_utils.cc b/src/cobalt/media/base/starboard_utils.cc index c4e9cb0..9043285 100644 --- a/src/cobalt/media/base/starboard_utils.cc +++ b/src/cobalt/media/base/starboard_utils.cc
@@ -369,7 +369,8 @@ if (sb_media_color_metadata.primaries == kSbMediaPrimaryIdCustom) { const float* custom_primary_matrix = color_space.custom_primary_matrix(); SbMemoryCopy(sb_media_color_metadata.custom_primary_matrix, - custom_primary_matrix, sizeof(custom_primary_matrix)); + custom_primary_matrix, + sizeof(sb_media_color_metadata.custom_primary_matrix)); } return sb_media_color_metadata;
diff --git a/src/cobalt/render_tree/mock_resource_provider.h b/src/cobalt/render_tree/mock_resource_provider.h index 244d695..3825a9a 100644 --- a/src/cobalt/render_tree/mock_resource_provider.h +++ b/src/cobalt/render_tree/mock_resource_provider.h
@@ -59,6 +59,7 @@ MOCK_CONST_METHOD1(HasLocalFontFamily, bool(const char* font_family_name)); MOCK_METHOD2(GetLocalTypefaceMock, Typeface*(const char* font_family_name, FontStyle font_style)); + MOCK_METHOD0(LoadAdditionalFonts, void()); MOCK_METHOD1(GetLocalTypefaceIfAvailableMock, Typeface*(const std::string& font_face_name)); MOCK_METHOD3(GetCharacterFallbackTypefaceMock,
diff --git a/src/cobalt/render_tree/resource_provider.h b/src/cobalt/render_tree/resource_provider.h index af51209..ad8fd67 100644 --- a/src/cobalt/render_tree/resource_provider.h +++ b/src/cobalt/render_tree/resource_provider.h
@@ -129,6 +129,9 @@ virtual scoped_refptr<Typeface> GetLocalTypeface(const char* font_family_name, FontStyle font_style) = 0; + // Loads additional fonts that should be loaded asynchronously at startup. + virtual void LoadAdditionalFonts() = 0; + // Given a set of typeface information, this method returns the locally // available typeface that best fits the specified parameters. In the case // where no typeface is found that matches the font family name, NULL is
diff --git a/src/cobalt/render_tree/resource_provider_stub.h b/src/cobalt/render_tree/resource_provider_stub.h index 961b59b..43ad4e8 100644 --- a/src/cobalt/render_tree/resource_provider_stub.h +++ b/src/cobalt/render_tree/resource_provider_stub.h
@@ -329,6 +329,8 @@ return base::WrapRefCounted(new TypefaceStub(NULL)); } + void LoadAdditionalFonts() override {} + scoped_refptr<Typeface> CreateTypefaceFromRawData( std::unique_ptr<RawTypefaceDataVector> raw_data, std::string* error_string) override {
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc index a78f0ed..75a5a1e 100644 --- a/src/cobalt/renderer/pipeline.cc +++ b/src/cobalt/renderer/pipeline.cc
@@ -603,6 +603,9 @@ rasterizer_ = create_rasterizer_function.Run(); rasterizer_created_event_.Signal(); + // Async load additional fonts after rasterizer thread is fully initialized. + GetResourceProvider()->LoadAdditionalFonts(); + // Note that this is setup as high priority, but lower than the rasterizer // thread's priority (ThreadPriority::HIGHEST). This is to ensure that // we never interrupt the rasterizer in order to dispose render trees, but
diff --git a/src/cobalt/renderer/pipeline_test.cc b/src/cobalt/renderer/pipeline_test.cc index 65e75cb..a5fc24e 100644 --- a/src/cobalt/renderer/pipeline_test.cc +++ b/src/cobalt/renderer/pipeline_test.cc
@@ -18,6 +18,7 @@ #include "base/optional.h" #include "base/threading/platform_thread.h" #include "cobalt/render_tree/composition_node.h" +#include "cobalt/render_tree/resource_provider_stub.h" #include "cobalt/renderer/pipeline.h" #include "cobalt/renderer/rasterizer/rasterizer.h" #include "cobalt/renderer/submission.h" @@ -36,6 +37,14 @@ const base::TimeDelta kRasterizeDelay = base::TimeDelta::FromSecondsD(1.0 / 60.0); +class MockResourceProvider : public cobalt::render_tree::ResourceProviderStub { + public: + MockResourceProvider() : fonts_loaded_(false){}; + ~MockResourceProvider() override {} + void LoadAdditionalFonts() override { fonts_loaded_ = true; } + bool fonts_loaded_; +}; + // Unfortunately, we can't make use of gmock to test the number of submission // calls that were made. This is because we need to test our expectations // AFTER all Submit() calls have been made, whereas gmock requires us to @@ -46,7 +55,9 @@ class MockRasterizer : public Rasterizer { public: explicit MockRasterizer(int* submission_count) - : submission_count_(submission_count) {} + : submission_count_(submission_count), + provider_(new MockResourceProvider()) {} + ~MockRasterizer() { delete provider_; } void Submit(const scoped_refptr<cobalt::render_tree::Node>&, const scoped_refptr<cobalt::renderer::backend::RenderTarget>&, @@ -67,7 +78,7 @@ } cobalt::render_tree::ResourceProvider* GetResourceProvider() override { - return NULL; + return provider_; } void MakeCurrent() override {} @@ -76,6 +87,7 @@ private: int* submission_count_; base::Optional<base::TimeTicks> last_submission_time; + MockResourceProvider* provider_; }; std::unique_ptr<Rasterizer> CreateMockRasterizer(int* submission_count) { @@ -217,3 +229,16 @@ EXPECT_LE(expected_submissions.lower_bound, submission_count_); EXPECT_GE(expected_submissions.upper_bound, submission_count_); } + +TEST_F(RendererPipelineTest, LoadDefaultFontsAfterRasterizerCreated) { + MockResourceProvider* provider = + base::polymorphic_downcast<MockResourceProvider*>( + pipeline_->GetResourceProvider()); + + // Wait a little bit to give the pipeline some time to initialize rasterizer + // thread. + const base::TimeDelta kDelay = base::TimeDelta::FromMilliseconds(400); + base::PlatformThread::Sleep(kDelay); + + EXPECT_EQ(true, provider->fonts_loaded_); +}
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc index 83d2baf..399f535 100644 --- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc +++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.cc
@@ -150,6 +150,10 @@ utf32_character, font_style, language); } +void ResourceProvider::LoadAdditionalFonts() { + return skia_resource_provider_->LoadAdditionalFonts(); +} + scoped_refptr<Typeface> ResourceProvider::CreateTypefaceFromRawData( std::unique_ptr<RawTypefaceDataVector> raw_data, std::string* error_string) {
diff --git a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h index bb7fd0b..6e91345 100644 --- a/src/cobalt/renderer/rasterizer/blitter/resource_provider.h +++ b/src/cobalt/renderer/rasterizer/blitter/resource_provider.h
@@ -86,6 +86,8 @@ int32 utf32_character, render_tree::FontStyle font_style, const std::string& language) override; + void LoadAdditionalFonts() override; + scoped_refptr<render_tree::Typeface> CreateTypefaceFromRawData( std::unique_ptr<RawTypefaceDataVector> raw_data, std::string* error_string) override;
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc index 8b43221..7a14ae2 100644 --- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc +++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -478,6 +478,13 @@ return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface)); } +void HardwareResourceProvider::LoadAdditionalFonts() { + sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault()); + SkFontMgr_Cobalt* cobalt_font_manager = + base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get()); + cobalt_font_manager->LoadLocaleDefault(); +} + scoped_refptr<render_tree::Typeface> HardwareResourceProvider::CreateTypefaceFromRawData( std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h index e6b7252..2a7dc3d 100644 --- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h +++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.h
@@ -92,6 +92,8 @@ int32 character, render_tree::FontStyle font_style, const std::string& language) override; + void LoadAdditionalFonts() override; + // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw // typeface data and skia to generate the typeface. It supports TrueType, // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc index 2590ffc..bbe236f 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.cc
@@ -26,11 +26,15 @@ #include "base/command_line.h" #include "base/memory/ptr_util.h" #include "base/trace_event/trace_event.h" +#include "cobalt/base/language.h" #include "cobalt/configuration/configuration.h" #include "cobalt/extension/font.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h" +#include "third_party/icu/source/common/unicode/locid.h" + +const char* ROBOTO_SCRIPT = "latn"; SkFontMgr_Cobalt::SkFontMgr_Cobalt( const char* cobalt_font_config_directory, @@ -42,7 +46,8 @@ "Font.LocalTypefaceCache", cobalt::configuration::Configuration::GetInstance() ->CobaltLocalTypefaceCacheSizeInBytes()), - default_family_(NULL) { + default_fonts_loaded_event_(base::WaitableEvent::ResetPolicy::MANUAL, + base::WaitableEvent::InitialState::SIGNALED) { TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::SkFontMgr_Cobalt()"); PriorityStyleSetArrayMap priority_fallback_families; @@ -199,7 +204,7 @@ } if (typeface == NULL) { - typeface = default_family_->matchStyle(style); + typeface = default_families_[0]->matchStyle(style); } return typeface; @@ -253,9 +258,10 @@ font_manager->FindFamilyStyleCharacter(style, SkString(), character); // If no family was found that supports the character, then just fall back - // to the default family. - return matching_typeface ? matching_typeface - : default_family_->MatchStyleWithoutLocking(style); + // to the first default family. + return matching_typeface + ? matching_typeface + : default_families_[0]->MatchStyleWithoutLocking(style); } sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromData(sk_sp<SkData> data, @@ -270,12 +276,17 @@ bool is_fixed_pitch; SkFontStyle style; SkString name; + + // To pre-fetch glyphs for remote fonts, we could pass character_map here. if (!sk_freetype_cobalt::ScanFont(stream.get(), face_index, &name, &style, - &is_fixed_pitch)) { + &is_fixed_pitch, nullptr)) { return NULL; } - return sk_sp<SkTypeface>(new SkTypeface_CobaltStream( - std::move(stream), face_index, style, is_fixed_pitch, name)); + scoped_refptr<font_character_map::CharacterMap> character_map = + base::MakeRefCounted<font_character_map::CharacterMap>(); + return sk_sp<SkTypeface>( + new SkTypeface_CobaltStream(std::move(stream), face_index, style, + is_fixed_pitch, name, character_map)); } sk_sp<SkTypeface> SkFontMgr_Cobalt::onMakeFromFile(const char path[], @@ -289,6 +300,25 @@ return sk_sp<SkTypeface>(matchFamilyStyle(family_name, style)); } +void SkFontMgr_Cobalt::LoadLocaleDefault() { + std::string script = + icu::Locale::createCanonical(base::GetSystemLanguageScript().c_str()) + .getScript(); + if (SbStringCompareNoCase(script.c_str(), ROBOTO_SCRIPT) == 0) { + return; + } + + default_fonts_loaded_event_.Reset(); + for (int i = 0; i < families_.count(); i++) { + if (CheckIfFamilyMatchesLocaleScript(families_[i], script.c_str())) { + default_fonts_loaded_event_.Signal(); + return; + } + } + + default_fonts_loaded_event_.Signal(); +} + void SkFontMgr_Cobalt::ParseConfigAndBuildFamilies( const char* font_config_directory, const char* font_files_directory, PriorityStyleSetArrayMap* priority_fallback_families) { @@ -458,20 +488,42 @@ sk_sp<SkTypeface> check_typeface( check_family->MatchStyleWithoutLocking(SkFontStyle())); if (check_typeface.get() != NULL) { - default_family_ = check_family.get(); + default_families_.push_back(check_family.get()); break; } } - if (default_family_ == NULL) { + if (default_families_.empty()) { sk_sp<SkTypeface> check_typeface( families_[0]->MatchStyleWithoutLocking(SkFontStyle())); if (check_typeface.get() != NULL) { - default_family_ = families_[0].get(); + default_families_.push_back(families_[0].get()); } } - CHECK(default_family_); + CHECK(!default_families_.empty()); +} + +bool SkFontMgr_Cobalt::CheckIfFamilyMatchesLocaleScript( + sk_sp<SkFontStyleSet_Cobalt> new_family, const char* script) { + SkString family_tag = new_family->get_language().GetTag(); + if (family_tag.isEmpty()) { + return false; + } + std::string family_script = + icu::Locale::createCanonical(family_tag.c_str()).getScript(); + if (SbStringCompareNoCase(script, family_script.c_str()) != 0) { + return false; + } + + sk_sp<SkTypeface> check_typeface( + new_family->MatchStyleWithoutLocking(SkFontStyle())); + if (check_typeface.get() == NULL) { + return false; + } + + default_families_.push_back(new_family.get()); + return true; } SkTypeface* SkFontMgr_Cobalt::FindFamilyStyleCharacter( @@ -481,6 +533,20 @@ return NULL; } + // First attempt any extra default fonts set by locale. + default_fonts_loaded_event_.Wait(); + if (default_families_.size() > 1) { + for (int i = 1; i < default_families_.size(); ++i) { + SkFontStyleSet_Cobalt* family = default_families_[i]; + if (family->ContainsCharacter(style, character)) { + SkTypeface* matching_typeface = family->MatchStyleWithoutLocking(style); + if (matching_typeface) { + return matching_typeface; + } + } + } + } + StyleSetArray* fallback_families = GetMatchingFallbackFamilies(language_tag); for (int i = 0; i < fallback_families->size(); ++i) { SkFontStyleSet_Cobalt* family = (*fallback_families)[i];
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h index 8159969..10f6b0c 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h
@@ -25,6 +25,7 @@ #include "SkTypeface.h" #include "base/containers/hash_tables.h" #include "base/containers/small_map.h" +#include "base/synchronization/waitable_event.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h" @@ -65,6 +66,9 @@ // NOTE: This returns NULL if a match is not found. SkTypeface* MatchFaceName(const char face_name[]); + // Loads the font that matches the suggested script for the device's locale. + void LoadLocaleDefault(); + protected: // From SkFontMgr int onCountFamilies() const override; @@ -125,6 +129,8 @@ void GeneratePriorityOrderedFallbackFamilies( const PriorityStyleSetArrayMap& priority_fallback_families); void FindDefaultFamily(const SkTArray<SkString, true>& default_families); + bool CheckIfFamilyMatchesLocaleScript(sk_sp<SkFontStyleSet_Cobalt> new_family, + const char* script); // Returns the first encountered fallback family that matches the language tag // and supports the specified character. @@ -157,9 +163,12 @@ std::vector<std::unique_ptr<StyleSetArray>> language_fallback_families_array_; NameToStyleSetArrayMap language_fallback_families_map_; - // The default family that is used when no specific match is found during a - // request. - SkFontStyleSet_Cobalt* default_family_; + // List of default families that are used when no specific match is found + // during a request. + std::vector<SkFontStyleSet_Cobalt*> default_families_; + + // Used to delay font loading until default fonts are fully loaded. + base::WaitableEvent default_fonts_loaded_event_; // Mutex shared by all families for accessing their modifiable data. mutable SkMutex family_mutex_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc index b9af82e..8d92c16 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
@@ -90,6 +90,8 @@ return; } + character_map_ = base::MakeRefCounted<font_character_map::CharacterMap>(); + family_name_ = family_info.names[0]; SkTHashMap<SkString, int> styles_index_map; @@ -333,11 +335,8 @@ } bool SkFontStyleSet_Cobalt::CharacterMapContainsCharacter(SkUnichar character) { - font_character_map::CharacterMap::iterator page_iterator = - character_map_.find(font_character_map::GetPage(character)); - return page_iterator != character_map_.end() && - page_iterator->second.test( - font_character_map::GetPageCharacterIndex(character)); + font_character_map::Character c = character_map_->Find(character); + return c.is_set && c.id > 0; } bool SkFontStyleSet_Cobalt::GenerateStyleFaceInfo( @@ -349,7 +348,7 @@ // Providing a pointer to the character map will cause it to be generated // during ScanFont. Only provide it if it hasn't already been generated. font_character_map::CharacterMap* character_map = - !is_character_map_generated_ ? &character_map_ : NULL; + !is_character_map_generated_ ? character_map_.get() : NULL; if (!sk_freetype_cobalt::ScanFont( stream, style->face_index, &style->face_name, &style->font_style, @@ -396,7 +395,7 @@ style_entry->typeface.reset(new SkTypeface_CobaltStreamProvider( stream_provider, style_entry->face_index, style_entry->font_style, style_entry->face_is_fixed_pitch, family_name_, - style_entry->disable_synthetic_bolding)); + style_entry->disable_synthetic_bolding, character_map_)); } else { LOG(ERROR) << "Failed to scan font: " << style_entry->font_file_path.c_str();
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h index 715aee8..33ec970 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
@@ -100,6 +100,8 @@ const SkString& get_family_name() const { return family_name_; } + const SkLanguage& get_language() const { return language_; } + private: // NOTE: It is the responsibility of the caller to lock the mutex before // calling any of the non-const private functions. @@ -135,7 +137,7 @@ // NOTE: The following characters require locking when being accessed. bool is_character_map_generated_; - font_character_map::CharacterMap character_map_; + scoped_refptr<font_character_map::CharacterMap> character_map_; SkTArray<sk_sp<SkFontStyleSetEntry_Cobalt>, true> styles_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h index 77023ae..4f0f1c3 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
@@ -19,9 +19,11 @@ #include <map> #include <utility> +#include "SkMutex.h" #include "SkString.h" #include "SkTDArray.h" #include "base/basictypes.h" +#include "base/memory/ref_counted.h" // The font_character_map namespace contains all of the constants, typedefs, and // utility functions used with determining whether or not a font supports a @@ -54,13 +56,46 @@ // in non-overlapping ascending order. typedef SkTArray<PageRange> PageRanges; -typedef std::bitset<kNumCharactersPerPage> PageCharacters; -typedef std::map<int16, PageCharacters> CharacterMap; - bool IsCharacterValid(SkUnichar character); int16 GetPage(SkUnichar character); unsigned char GetPageCharacterIndex(SkUnichar character); +struct Character { + SkGlyphID id = 0; + bool is_set = false; +}; + +using PageCharacters = Character[kNumCharactersPerPage]; +class CharacterMap : public base::RefCountedThreadSafe<CharacterMap> { + public: + const Character Find(SkUnichar character) { + SkAutoMutexExclusive scoped_mutex(mutex_); + + int16 page = GetPage(character); + std::map<int16, PageCharacters>::iterator page_iterator = data_.find(page); + + if (page_iterator == data_.end()) return {}; + + unsigned char character_index = GetPageCharacterIndex(character); + return page_iterator->second[character_index]; + } + + void Insert(SkUnichar character, SkGlyphID glyph) { + SkAutoMutexExclusive scoped_mutex(mutex_); + + int16 page = GetPage(character); + unsigned char character_index = GetPageCharacterIndex(character); + Character c; + c.id = glyph; + c.is_set = true; + data_[page][character_index] = c; + } + + private: + std::map<int16, PageCharacters> data_; + mutable SkMutex mutex_; +}; + } // namespace font_character_map // The SkLanguage class represents a human written language, and is used by
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc index 637db3a..cbcc362 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFreeType_cobalt.cc
@@ -106,19 +106,9 @@ TRACE_EVENT0("cobalt::renderer", "GenerateCharacterMapFromFace"); FT_UInt glyph_index; - - int last_page = -1; - font_character_map::PageCharacters* page_characters = NULL; - SkUnichar code_point = FT_Get_First_Char(face, &glyph_index); while (glyph_index) { - int page = font_character_map::GetPage(code_point); - if (page != last_page) { - page_characters = &(*character_map)[page]; - last_page = page; - } - page_characters->set(font_character_map::GetPageCharacterIndex(code_point)); - + character_map->Insert(code_point, SkToU16(glyph_index)); code_point = FT_Get_Next_Char(face, code_point, &glyph_index); } }
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc index 8869e40..8f9cce8 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -20,27 +20,52 @@ #include "SkFontStyle.h" #include "SkTypefaceCache.h" -SkTypeface_Cobalt::SkTypeface_Cobalt(int face_index, SkFontStyle style, - bool is_fixed_pitch, - const SkString& family_name) +SkTypeface_Cobalt::SkTypeface_Cobalt( + int face_index, SkFontStyle style, bool is_fixed_pitch, + const SkString& family_name, + scoped_refptr<font_character_map::CharacterMap> character_map) : INHERITED(style, is_fixed_pitch), face_index_(face_index), family_name_(family_name), - synthesizes_bold_(!isBold()) {} + synthesizes_bold_(!isBold()), + character_map_(character_map) {} sk_sp<SkTypeface> SkTypeface_Cobalt::onMakeClone( const SkFontArguments& args) const { return sk_ref_sp(this); } +void SkTypeface_Cobalt::onCharsToGlyphs(const SkUnichar uni[], int count, + SkGlyphID glyphs[]) const { + for (int i = 0; i < count; ++i) { + glyphs[i] = characterMapGetGlyphIdForCharacter(uni[i]); + } +} + +SkGlyphID SkTypeface_Cobalt::characterMapGetGlyphIdForCharacter( + SkUnichar character) const { + CHECK(character_map_); + + // Check whether the character is cached in the character map. + font_character_map::Character c = character_map_->Find(character); + if (c.is_set) return c.id; + + // If the character isn't there, look it up with FreeType, then cache it. + SkGlyphID glyphs[1] = {0}; + SkTypeface_FreeType::onCharsToGlyphs(&character, 1, glyphs); + character_map_->Insert(character, glyphs[0]); + return glyphs[0]; +} + void SkTypeface_Cobalt::onGetFamilyName(SkString* family_name) const { *family_name = family_name_; } SkTypeface_CobaltStream::SkTypeface_CobaltStream( std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style, - bool is_fixed_pitch, const SkString& family_name) - : INHERITED(face_index, style, is_fixed_pitch, family_name), + bool is_fixed_pitch, const SkString& family_name, + scoped_refptr<font_character_map::CharacterMap> character_map) + : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map), stream_(std::move(stream)) { LOG(INFO) << "Created SkTypeface_CobaltStream: " << family_name.c_str() << "(" << style.weight() << ", " << style.width() << ", " << style.slant() @@ -68,8 +93,9 @@ SkTypeface_CobaltStreamProvider::SkTypeface_CobaltStreamProvider( SkFileMemoryChunkStreamProvider* stream_provider, int face_index, SkFontStyle style, bool is_fixed_pitch, const SkString& family_name, - bool disable_synthetic_bolding) - : INHERITED(face_index, style, is_fixed_pitch, family_name), + bool disable_synthetic_bolding, + scoped_refptr<font_character_map::CharacterMap> character_map) + : INHERITED(face_index, style, is_fixed_pitch, family_name, character_map), stream_provider_(stream_provider) { if (disable_synthetic_bolding) { synthesizes_bold_ = false;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h index e5d94d5..291ff2d 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h
@@ -20,6 +20,7 @@ #include "SkStream.h" #include "SkString.h" #include "base/memory/ref_counted.h" +#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h" #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkStream_cobalt.h" #include "third_party/skia/src/ports/SkFontHost_FreeType_common.h" @@ -27,8 +28,10 @@ class SkTypeface_Cobalt : public SkTypeface_FreeType { public: - SkTypeface_Cobalt(int face_index, SkFontStyle style, bool is_fixed_pitch, - const SkString& family_name); + SkTypeface_Cobalt( + int face_index, SkFontStyle style, bool is_fixed_pitch, + const SkString& family_name, + scoped_refptr<font_character_map::CharacterMap> character_map); virtual size_t GetStreamLength() const = 0; @@ -37,6 +40,9 @@ protected: sk_sp<SkTypeface> onMakeClone(const SkFontArguments& args) const override; + void onCharsToGlyphs(const SkUnichar uni[], int count, + SkGlyphID glyphs[]) const override; + void onGetFamilyName(SkString* family_name) const override; int face_index_; @@ -45,13 +51,16 @@ private: typedef SkTypeface_FreeType INHERITED; + SkGlyphID characterMapGetGlyphIdForCharacter(SkUnichar character) const; + scoped_refptr<font_character_map::CharacterMap> character_map_; }; class SkTypeface_CobaltStream : public SkTypeface_Cobalt { public: - SkTypeface_CobaltStream(std::unique_ptr<SkStreamAsset> stream, int face_index, - SkFontStyle style, bool is_fixed_pitch, - const SkString& family_name); + SkTypeface_CobaltStream( + std::unique_ptr<SkStreamAsset> stream, int face_index, SkFontStyle style, + bool is_fixed_pitch, const SkString& family_name, + scoped_refptr<font_character_map::CharacterMap> character_map); void onGetFontDescriptor(SkFontDescriptor* descriptor, bool* serialize) const override; @@ -71,7 +80,8 @@ SkTypeface_CobaltStreamProvider( SkFileMemoryChunkStreamProvider* stream_provider, int face_index, SkFontStyle style, bool is_fixed_pitch, const SkString& family_name, - bool disable_synthetic_bolding); + bool disable_synthetic_bolding, + scoped_refptr<font_character_map::CharacterMap> character_map); void onGetFontDescriptor(SkFontDescriptor* descriptor, bool* serialize) const override;
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc index d6b2a10..25f9813 100644 --- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc +++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -179,6 +179,13 @@ return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface)); } +void SoftwareResourceProvider::LoadAdditionalFonts() { + sk_sp<SkFontMgr> font_manager(SkFontMgr::RefDefault()); + SkFontMgr_Cobalt* cobalt_font_manager = + base::polymorphic_downcast<SkFontMgr_Cobalt*>(font_manager.get()); + cobalt_font_manager->LoadLocaleDefault(); +} + scoped_refptr<render_tree::Typeface> SoftwareResourceProvider::CreateTypefaceFromRawData( std::unique_ptr<render_tree::ResourceProvider::RawTypefaceDataVector>
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h index 68d06ff..aad9edd 100644 --- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h +++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.h
@@ -84,6 +84,8 @@ int32 character, render_tree::FontStyle font_style, const std::string& language) override; + void LoadAdditionalFonts() override; + // This resource provider uses ots (OpenTypeSanitizer) to sanitize the raw // typeface data and skia to generate the typeface. It supports TrueType, // OpenType, and WOFF data formats.
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.cc b/src/cobalt/renderer/rasterizer/skia/typeface.cc index 5c9acc0..0a70a6c 100644 --- a/src/cobalt/renderer/rasterizer/skia/typeface.cc +++ b/src/cobalt/renderer/rasterizer/skia/typeface.cc
@@ -65,26 +65,15 @@ render_tree::kUnknownGlyphIndex) { return primary_page_character_glyphs_[utf32_character]; } - // Otherwise, check for the character's glyph within the map. - } else { - CharacterToGlyphMap::iterator glyph_iterator = - character_to_glyph_map_.find(utf32_character); - if (glyph_iterator != character_to_glyph_map_.end()) { - return glyph_iterator->second; - } } - - // If we reach this point, the character's glyph was not previously cached and - // needs to be retrieved now. render_tree::GlyphIndex glyph = render_tree::kInvalidGlyphIndex; typeface_->unicharsToGlyphs(&utf32_character, 1, &glyph); // Both cache and return the character's glyph. if (utf32_character < kPrimaryPageSize) { return primary_page_character_glyphs_[utf32_character] = glyph; - } else { - return character_to_glyph_map_[utf32_character] = glyph; } + return glyph; } } // namespace skia
diff --git a/src/cobalt/renderer/rasterizer/skia/typeface.h b/src/cobalt/renderer/rasterizer/skia/typeface.h index f0efded..26aad50 100644 --- a/src/cobalt/renderer/rasterizer/skia/typeface.h +++ b/src/cobalt/renderer/rasterizer/skia/typeface.h
@@ -63,7 +63,6 @@ private: // Usually covers Latin-1 in a single page. static const int kPrimaryPageSize = 256; - typedef base::hash_map<int32, render_tree::GlyphIndex> CharacterToGlyphMap; // The underlying SkTypeface that was used to create this typeface. sk_sp<SkTypeface_Cobalt> typeface_; @@ -73,7 +72,6 @@ // Thread checking is used to used to ensure that they are only accessed and // modified on a single thread. std::unique_ptr<render_tree::GlyphIndex[]> primary_page_character_glyphs_; - CharacterToGlyphMap character_to_glyph_map_; THREAD_CHECKER(character_glyph_thread_checker_); };
diff --git a/src/cobalt/updater/updater_module.cc b/src/cobalt/updater/updater_module.cc index db02d9a..8f5663f 100644 --- a/src/cobalt/updater/updater_module.cc +++ b/src/cobalt/updater/updater_module.cc
@@ -105,7 +105,8 @@ if (updater_notification_ext_ != nullptr) { updater_notification_ext_->UpdaterState( ComponentStateToCobaltExtensionUpdaterNotificationState( - crx_update_item_.state)); + crx_update_item_.state), + GetCurrentEvergreenVersion().c_str()); } } else { status = "No status available";
diff --git a/src/starboard/android/apk/app/cobalt-ninja.sh b/src/starboard/android/apk/app/cobalt-ninja.sh index 6dc1375..f1edba2 100755 --- a/src/starboard/android/apk/app/cobalt-ninja.sh +++ b/src/starboard/android/apk/app/cobalt-ninja.sh
@@ -19,7 +19,6 @@ # https://cobalt.googlesource.com/cobalt/+/master/src/#Building-and-Running-the-Code # Allow for a developer-specific environment setup from .cobaltrc -# e.g., it may set DEPOT_TOOLS and/or setup some distributed build tools. local_rc=$(dirname $0)/.cobaltrc global_rc=${HOME}/.cobaltrc if [ -r ${local_rc} ]; then @@ -28,9 +27,6 @@ source ${global_rc} fi -# DEPOT_TOOLS may be set in .cobaltrc, otherwise assume it's in $HOME. -[ -x ${DEPOT_TOOLS}/ninja ] || DEPOT_TOOLS=${HOME}/depot_tools - # Use Cobalt's clang if it's not anywhere earlier in the PATH. SRC_DIR=$(cd $(dirname $0)/../../../..; pwd) PATH=$PATH:${SRC_DIR}/third_party/llvm-build/Release+Asserts/bin @@ -42,6 +38,4 @@ exit fi -# When running in CMake, depot_tools isn't in the path, so we have to be -# explicit about which ninja to run. Fail if we didn't find depot_tools. -exec ${DEPOT_TOOLS}/ninja "$@" +exec ninja "$@"
diff --git a/src/starboard/android/apk/build.id b/src/starboard/android/apk/build.id index ef01811..772184d 100644 --- a/src/starboard/android/apk/build.id +++ b/src/starboard/android/apk/build.id
@@ -1 +1 @@ -301999 \ No newline at end of file +302879 \ No newline at end of file
diff --git a/src/starboard/doc/c99.md b/src/starboard/doc/c99.md new file mode 100644 index 0000000..e767002 --- /dev/null +++ b/src/starboard/doc/c99.md
@@ -0,0 +1,4 @@ +<!-- +This file is required to exist by some tools but its contents are not used in +21.lts.1+. +-->
diff --git a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md index 247d19f..fe48bd6 100644 --- a/src/starboard/doc/evergreen/cobalt_evergreen_overview.md +++ b/src/starboard/doc/evergreen/cobalt_evergreen_overview.md
@@ -120,7 +120,7 @@ Evergreen: * `kSbSystemPathStorageDirectory` - * Dedidated location for storing Cobalt Evergreen-related binaries + * Dedicated location for storing Cobalt Evergreen-related binaries * This path must be writable and have at least 96MB of reserved space for Evergreen updates. Please see the “Platforms Requirements” section below for more details. @@ -403,7 +403,7 @@ │ └── app │ └── cobalt <--(SLOT_0) │ ├── content <--(relative path defined in kSystemImageContentPath) -│ │ ├── fonts <--(`minimal` configuration) +│ │ ├── fonts <--(`empty` configuration) │ │ ├── (icu) <--(only present when it needs to be updated by Cobalt Update) │ │ ├── licenses │ │ ├── ssl @@ -424,7 +424,7 @@ ├── installation_1 <--(SLOT_1 - currently unused) ├── installation_2 <--(SLOT_2 - contains new Cobalt version) │ ├── content - │ │ ├── fonts <--(`minimal` configuration) + │ │ ├── fonts <--(`empty` configuration) │ │ ├── (icu) <--(only present when it needs to be updated by Cobalt Update) │ │ ├── licenses │ │ ├── ssl @@ -460,13 +460,13 @@ the system font directory and setting the `cobalt_font_package` to `standard` or `limited` in your port. -Cobalt Evergreen (built by Google), will by default use the `minimal` font -package which is around 16KB to minimize storage requirements. A separate -`cobalt_font_package` variable is set to `minimal` in the Evergreen platform. +Cobalt Evergreen (built by Google), will by default use the `empty` font +package to minimize storage requirements. A separate +`cobalt_font_package` variable is set to `empty` in the Evergreen platform. On Raspberry Pi this is: -`minimal` set of fonts under: +`empty` set of fonts under: ``` <kSbSystemPathContentDirectory>/app/cobalt/content/fonts ```
diff --git a/src/starboard/elf_loader/program_table.cc b/src/starboard/elf_loader/program_table.cc index bab921d..425c16d 100644 --- a/src/starboard/elf_loader/program_table.cc +++ b/src/starboard/elf_loader/program_table.cc
@@ -65,7 +65,8 @@ SB_DLOG(INFO) << "elf_header->e_phnum=" << elf_header->e_phnum; Addr page_min = PAGE_START(elf_header->e_phoff); - Addr page_max = PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize)); + Addr page_max = + PAGE_END(elf_header->e_phoff + (phdr_num_ * elf_header->e_phentsize)); Addr page_offset = PAGE_OFFSET(elf_header->e_phoff); SB_DLOG(INFO) << "page_min=" << page_min; @@ -379,7 +380,7 @@ void ProgramTable::PublishEvergreenInfo(const char* file_path) { EvergreenInfo evergreen_info; - SbMemorySet(&evergreen_info, sizeof(EvergreenInfo), 0); + SbMemorySet(&evergreen_info, 0, sizeof(EvergreenInfo)); SbStringCopy(evergreen_info.file_path_buf, file_path, EVERGREEN_FILE_PATH_MAX_SIZE); evergreen_info.base_address = base_memory_address_;
diff --git a/src/starboard/elf_loader/sandbox.cc b/src/starboard/elf_loader/sandbox.cc index 05f4098..55cc559 100644 --- a/src/starboard/elf_loader/sandbox.cc +++ b/src/starboard/elf_loader/sandbox.cc
@@ -80,7 +80,7 @@ SB_LOG(ERROR) << "Failed to get user agent string"; } else { CrashpadAnnotations cobalt_version_info; - SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0); + SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations)); SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE); third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/loader_app/loader_app.cc b/src/starboard/loader_app/loader_app.cc index 489d214..c5c92a5 100644 --- a/src/starboard/loader_app/loader_app.cc +++ b/src/starboard/loader_app/loader_app.cc
@@ -126,7 +126,7 @@ SB_LOG(ERROR) << "Failed to get user agent string"; } else { CrashpadAnnotations cobalt_version_info; - SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0); + SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations)); SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE); third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/loader_app/slot_management.cc b/src/starboard/loader_app/slot_management.cc index 0639e7d..aef6c5e 100644 --- a/src/starboard/loader_app/slot_management.cc +++ b/src/starboard/loader_app/slot_management.cc
@@ -267,7 +267,7 @@ SB_LOG(ERROR) << "Failed to get user agent string"; } else { CrashpadAnnotations cobalt_version_info; - SbMemorySet(&cobalt_version_info, sizeof(CrashpadAnnotations), 0); + SbMemorySet(&cobalt_version_info, 0, sizeof(CrashpadAnnotations)); SbStringCopy(cobalt_version_info.user_agent_string, get_user_agent_func(), USER_AGENT_STRING_MAX_SIZE); third_party::crashpad::wrapper::AddAnnotationsToCrashpad(
diff --git a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc index df9ba2b..091a496 100644 --- a/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc +++ b/src/starboard/nplb/nplb_evergreen_compat_tests/fonts_test.cc
@@ -36,9 +36,15 @@ std::vector<char> system_fonts_dir(kSbFileMaxPath); ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontDirectory, system_fonts_dir.data(), kSbFileMaxPath)); - ASSERT_TRUE(SbFileExists(system_fonts_dir.data())); - std::string fonts_descriptor_file = system_fonts_dir.data(); +} + +TEST(FontsTest, VerifySystemFontsConfigDirectory) { + std::vector<char> system_fonts_conf_dir(kSbFileMaxPath); + ASSERT_TRUE(SbSystemGetPath(kSbSystemPathFontConfigurationDirectory, + system_fonts_conf_dir.data(), kSbFileMaxPath)); + ASSERT_TRUE(SbFileExists(system_fonts_conf_dir.data())); + std::string fonts_descriptor_file = system_fonts_conf_dir.data(); fonts_descriptor_file += kSbFileSepString; fonts_descriptor_file += kFileName; ASSERT_TRUE(SbFileExists(fonts_descriptor_file.c_str()));
diff --git a/src/starboard/raspi/shared/dispmanx_util.cc b/src/starboard/raspi/shared/dispmanx_util.cc index 906cfb0..e26dab4 100644 --- a/src/starboard/raspi/shared/dispmanx_util.cc +++ b/src/starboard/raspi/shared/dispmanx_util.cc
@@ -14,6 +14,8 @@ #include "starboard/raspi/shared/dispmanx_util.h" +#include <utility> + #include "starboard/common/scoped_ptr.h" #include "starboard/memory.h" @@ -91,8 +93,8 @@ void DispmanxYUV420Resource::ClearWithBlack() { scoped_array<uint8_t> data(new uint8_t[width() * height() * 3 / 2]); - SbMemorySet(data.get(), width() * height(), 0); - SbMemorySet(data.get() + width() * height(), width() * height() / 2, 0x80); + SbMemorySet(data.get(), 0, width() * height()); + SbMemorySet(data.get() + width() * height(), 0x80, width() * height() / 2); WriteData(data.get()); } @@ -108,7 +110,7 @@ void DispmanxRGB565Resource::ClearWithBlack() { scoped_array<uint8_t> data(new uint8_t[width() * height() * 2]); - SbMemorySet(data.get(), width() * height() * 2, 0); + SbMemorySet(data.get(), 0, width() * height() * 2); WriteData(data.get()); }