Import Cobalt 10.51583
diff --git a/src/base/base_paths_starboard.cc b/src/base/base_paths_starboard.cc index 6021b36..e02d2f4 100644 --- a/src/base/base_paths_starboard.cc +++ b/src/base/base_paths_starboard.cc
@@ -89,6 +89,28 @@ case base::DIR_HOME: // TODO: Add a home directory to SbSystemPathId and get it from there. return PathProviderStarboard(base::DIR_CACHE, result); + + case base::DIR_SYSTEM_FONTS: +#if SB_API_VERSION >= 4 + if (SbSystemGetPath(kSbSystemPathFontDirectory, path, + SB_ARRAY_SIZE_INT(path))) { + *result = FilePath(path); + return true; + } + DLOG(INFO) << "DIR_SYSTEM_FONTS not defined."; +#endif // SB_API_VERSION >= 4 + return false; + + case base::DIR_SYSTEM_FONTS_CONFIGURATION: +#if SB_API_VERSION >= 4 + if (SbSystemGetPath(kSbSystemPathFontConfigurationDirectory, path, + SB_ARRAY_SIZE_INT(path))) { + *result = FilePath(path); + return true; + } + DLOG(INFO) << "DIR_SYSTEM_FONTS_CONFIGURATION not defined."; +#endif // SB_API_VERSION >= 4 + return false; } return false;
diff --git a/src/base/base_paths_starboard.h b/src/base/base_paths_starboard.h index cfa9099..c8c6ec1 100644 --- a/src/base/base_paths_starboard.h +++ b/src/base/base_paths_starboard.h
@@ -31,6 +31,18 @@ DIR_HOME, // The root of the primary directory for a user (and their // programs) to place their personal files. + DIR_SYSTEM_FONTS, // Directory where system font files can be + // be found. This is only specified on + // platforms that provide fonts usable by + // Starboard applications. + + DIR_SYSTEM_FONTS_CONFIGURATION, // Directory where system font configuration + // metadata can be found. May be the same + // directory as DIR_SYSTEM_FONTS, but not + // necessarily. This is only specified on + // platforms that provide fonts usable by + // Starboard applications. + PATH_STARBOARD_END };
diff --git a/src/cobalt/base/base.gyp b/src/cobalt/base/base.gyp index 629d727..4753208 100644 --- a/src/cobalt/base/base.gyp +++ b/src/cobalt/base/base.gyp
@@ -23,6 +23,7 @@ 'sources': [ 'accessibility_changed_event.h', 'address_sanitizer.h', + 'camera_transform.h', 'clock.h', 'cobalt_paths.h', 'compiler.h',
diff --git a/src/cobalt/base/camera_transform.h b/src/cobalt/base/camera_transform.h new file mode 100644 index 0000000..ef0fafa --- /dev/null +++ b/src/cobalt/base/camera_transform.h
@@ -0,0 +1,64 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef COBALT_BASE_CAMERA_TRANSFORM_H_ +#define COBALT_BASE_CAMERA_TRANSFORM_H_ + +#include "base/optional.h" +#include "third_party/glm/glm/mat4x4.hpp" + +namespace base { + +// CameraTransform holds the affine transformations needed to apply a +// camera viewing a 3D scene. +class CameraTransform { + public: + struct ProjectionAndView { + glm::mat4 projection_matrix; + glm::mat4 view_matrix; + }; + + ProjectionAndView left_eye_or_mono; + base::optional<ProjectionAndView> right_eye; // For stereoscopic cameras. + + CameraTransform(glm::mat4 left_eye_or_mono_projection_matrix, + glm::mat4 left_eye_or_mono_view_matrix, + glm::mat4 right_eye_projection_matrix, + glm::mat4 right_eye_view_matrix) { + left_eye_or_mono.projection_matrix = left_eye_or_mono_projection_matrix; + left_eye_or_mono.view_matrix = left_eye_or_mono_view_matrix; + right_eye = ProjectionAndView(); + right_eye->projection_matrix = right_eye_projection_matrix; + right_eye->view_matrix = right_eye_view_matrix; + } + + CameraTransform(glm::mat4 left_eye_or_mono_projection_matrix, + glm::mat4 left_eye_or_mono_view_matrix) { + left_eye_or_mono.projection_matrix = left_eye_or_mono_projection_matrix; + left_eye_or_mono.view_matrix = left_eye_or_mono_view_matrix; + } +}; + +// Structure to keep track of the current orientation state. +struct CameraOrientation { + CameraOrientation() : roll(0.0f), pitch(0.0f), yaw(0.0f) {} + + float roll; + float pitch; + float yaw; +}; + +} // namespace base + +#endif // COBALT_BASE_CAMERA_TRANSFORM_H_
diff --git a/src/cobalt/browser/application.cc b/src/cobalt/browser/application.cc index 77ecccd..108115a 100644 --- a/src/cobalt/browser/application.cc +++ b/src/cobalt/browser/application.cc
@@ -363,9 +363,16 @@ options->renderer_module_options.skia_cache_size_in_bytes = static_cast<int>(auto_mem.skia_cache_size_in_bytes()->value()); - options->renderer_module_options.skia_texture_atlas_dimensions = + const memory_settings::TextureDimensions skia_glyph_atlas_texture_dimensions = auto_mem.skia_atlas_texture_dimensions()->value(); + // Right now the bytes_per_pixel is assumed in the engine. Any other value + // is currently forbidden. + DCHECK_EQ(2, skia_glyph_atlas_texture_dimensions.bytes_per_pixel()); + options->renderer_module_options.skia_glyph_texture_atlas_dimensions = + math::Size(skia_glyph_atlas_texture_dimensions.width(), + skia_glyph_atlas_texture_dimensions.height()); + options->web_module_options.javascript_options.gc_threshold_bytes = static_cast<size_t>(auto_mem.javascript_gc_threshold_in_bytes()->value());
diff --git a/src/cobalt/browser/browser.gyp b/src/cobalt/browser/browser.gyp index db75521..9ec2956 100644 --- a/src/cobalt/browser/browser.gyp +++ b/src/cobalt/browser/browser.gyp
@@ -35,10 +35,14 @@ 'memory_settings/build_settings.h', 'memory_settings/calculations.cc', 'memory_settings/calculations.h', + 'memory_settings/constants.h', 'memory_settings/memory_settings.cc', 'memory_settings/memory_settings.h', 'memory_settings/pretty_print.cc', 'memory_settings/pretty_print.h', + 'memory_settings/table_printer.cc', + 'memory_settings/table_printer.h', + 'memory_settings/texture_dimensions.h', 'memory_tracker/tool.cc', 'memory_tracker/tool.h', 'memory_tracker/tool/buffered_file_writer.cc', @@ -200,6 +204,8 @@ 'memory_settings/calculations_test.cc', 'memory_settings/pretty_print_test.cc', 'memory_settings/memory_settings_test.cc', + 'memory_settings/table_printer_test.cc', + 'memory_settings/test_common.h', 'memory_tracker/tool/tool_impl_test.cc', 'memory_tracker/tool/util_test.cc', ],
diff --git a/src/cobalt/browser/browser_module.cc b/src/cobalt/browser/browser_module.cc index fb03d85..50c5e80 100644 --- a/src/cobalt/browser/browser_module.cc +++ b/src/cobalt/browser/browser_module.cc
@@ -198,6 +198,14 @@ new h5vcc::H5vcc(settings, window, mutation_observer_task_manager)); } +renderer::RendererModule::Options RendererModuleWithCameraOptions( + renderer::RendererModule::Options options, + scoped_refptr<input::Camera3D> camera_3d) { + options.get_camera_transform = base::Bind( + &input::Camera3D::GetCameraTransformAndUpdateOrientation, camera_3d); + return options; // Copy. +} + } // namespace BrowserModule::BrowserModule(const GURL& url, @@ -215,7 +223,13 @@ #if defined(OS_STARBOARD) is_rendered_(false), #endif // OS_STARBOARD - renderer_module_(system_window, options.renderer_module_options), + input_device_manager_(input::InputDeviceManager::CreateFromWindow( + base::Bind(&BrowserModule::OnKeyEventProduced, + base::Unretained(this)), + system_window)), + renderer_module_(system_window, RendererModuleWithCameraOptions( + options.renderer_module_options, + input_device_manager_->camera_3d())), #if defined(ENABLE_GPU_ARRAY_BUFFER_ALLOCATOR) array_buffer_allocator_(new ResourceProviderArrayBufferAllocator( renderer_module_.pipeline()->GetResourceProvider())), @@ -247,8 +261,7 @@ kScreenshotCommandShortHelp, kScreenshotCommandLongHelp)), #endif // defined(ENABLE_SCREENSHOT) #endif // defined(ENABLE_DEBUG_CONSOLE) - ALLOW_THIS_IN_INITIALIZER_LIST( - h5vcc_url_handler_(this, system_window)), + ALLOW_THIS_IN_INITIALIZER_LIST(h5vcc_url_handler_(this, system_window)), web_module_options_(options.web_module_options), has_resumed_(true, false), #if defined(COBALT_CHECK_RENDER_TIMEOUT) @@ -315,10 +328,6 @@ } #endif // ENABLE_DEBUG_CONSOLE && ENABLE_DEBUG_COMMAND_LINE_SWITCHES - input_device_manager_ = input::InputDeviceManager::CreateFromWindow( - base::Bind(&BrowserModule::OnKeyEventProduced, base::Unretained(this)), - system_window); - #if defined(ENABLE_DEBUG_CONSOLE) debug_console_.reset(new DebugConsole( base::Bind(&BrowserModule::QueueOnDebugConsoleRenderTreeProduced, @@ -433,7 +442,7 @@ options.image_cache_capacity_multiplier_when_playing_video = COBALT_IMAGE_CACHE_CAPACITY_MULTIPLIER_WHEN_PLAYING_VIDEO; - options.input_poller = input_device_manager_->input_poller(); + options.camera_3d = input_device_manager_->camera_3d(); web_module_.reset(new WebModule( url, base::Bind(&BrowserModule::QueueOnRenderTreeProduced, base::Unretained(this)),
diff --git a/src/cobalt/browser/browser_module.h b/src/cobalt/browser/browser_module.h index fcb24ad..8147240 100644 --- a/src/cobalt/browser/browser_module.h +++ b/src/cobalt/browser/browser_module.h
@@ -262,6 +262,10 @@ bool is_rendered_; #endif // OS_STARBOARD + // Wraps input device and produces input events that can be passed into + // the web module. + scoped_ptr<input::InputDeviceManager> input_device_manager_; + // Sets up everything to do with graphics, from backend objects like the // display and graphics context to the rasterizer and rendering pipeline. renderer::RendererModule renderer_module_; @@ -302,10 +306,6 @@ // Will be signalled when the WebModule's Window.onload event is fired. base::WaitableEvent web_module_loaded_; - // Wraps input device and produces input events that can be passed into - // the web module. - scoped_ptr<input::InputDeviceManager> input_device_manager_; - // This will be called after the WebModule has been destroyed and recreated, // which could occur on navigation. base::Closure web_module_recreated_callback_;
diff --git a/src/cobalt/browser/debug_console/console_values.js b/src/cobalt/browser/debug_console/console_values.js index b0a7c79..2ed232e 100644 --- a/src/cobalt/browser/debug_console/console_values.js +++ b/src/cobalt/browser/debug_console/console_values.js
@@ -20,7 +20,7 @@ this.DEFAULT_KEY = 'default'; // Reduced space-separated list of CVal prefixes to display at start-up. this.DEFAULT_ACTIVE_SET = - 'Cobalt DevTools Memory.CPU Memory.MainWebModule Memory.JS ' + + 'Cobalt DevTools Memory.CPU Memory.MainWebModule Memory.JS Memory.Font ' + 'Event.Duration.MainWebModule.KeyDown Renderer.Rasterize.Duration'; var names = window.debugHub.getConsoleValueNames();
diff --git a/src/cobalt/browser/memory_settings/auto_mem.cc b/src/cobalt/browser/memory_settings/auto_mem.cc index 1c28846..a3df89c 100644 --- a/src/cobalt/browser/memory_settings/auto_mem.cc +++ b/src/cobalt/browser/memory_settings/auto_mem.cc
@@ -16,6 +16,7 @@ #include "cobalt/browser/memory_settings/auto_mem.h" +#include <algorithm> #include <string> #include <vector> @@ -23,9 +24,9 @@ #include "base/string_number_conversions.h" #include "base/string_split.h" #include "base/stringprintf.h" - #include "cobalt/browser/memory_settings/build_settings.h" #include "cobalt/browser/memory_settings/calculations.h" +#include "cobalt/browser/memory_settings/constants.h" #include "cobalt/browser/memory_settings/pretty_print.h" #include "cobalt/browser/switches.h" @@ -34,27 +35,55 @@ namespace memory_settings { namespace { +int64_t GetTotalCpuMemory() { return SbSystemGetTotalCPUMemory(); } + +base::optional<int64_t> GetTotalGpuMemory() { + base::optional<int64_t> total_gpu_memory; + if (SbSystemHasCapability(kSbSystemCapabilityCanQueryGPUMemoryStats)) { + total_gpu_memory = SbSystemGetTotalGPUMemory(); + } + return total_gpu_memory; +} + +// Determines if the string value signals "autoset". +bool StringValueSignalsAutoset(const std::string& value) { + std::string value_lower_case = value; + std::transform(value_lower_case.begin(), value_lower_case.end(), + value_lower_case.begin(), ::tolower); + bool is_autoset = (value_lower_case == "auto") || + (value_lower_case == "autoset") || + (value_lower_case == "-1"); + return is_autoset; +} + // Creates the specified memory setting type and binds it to (1) command line // or else (2) build setting or else (3) an auto_set value. template <typename MemorySettingType, typename ValueType> scoped_ptr<MemorySettingType> CreateMemorySetting( - const char* setting_name, const CommandLine& cmd_line, + const char* setting_name, + const CommandLine& cmd_line, // Optional. const base::optional<ValueType>& build_setting, const ValueType& autoset_value) { scoped_ptr<MemorySettingType> output(new MemorySettingType(setting_name)); + // True when the command line explicitly requests the variable to be autoset. + bool force_autoset = false; + // The value is set according to importance: // 1) Command line switches are the most important, so set those if they // exist. if (cmd_line.HasSwitch(setting_name)) { std::string value = cmd_line.GetSwitchValueNative(setting_name); - if (output->TryParseValue(MemorySetting::kCmdLine, value)) { + if (StringValueSignalsAutoset(value)) { + force_autoset = true; + } else if (output->TryParseValue(MemorySetting::kCmdLine, value)) { return output.Pass(); } } - // 2) Is there a build setting? Then set to build_setting. - if (build_setting) { + // 2) Is there a build setting? Then set to build_setting, unless the command + // line specifies that it should be autoset. + if (build_setting && !force_autoset) { output->set_value(MemorySetting::kBuildSetting, *build_setting); } else { // 3) Otherwise bind to the autoset_value. @@ -70,71 +99,119 @@ } void EnsureValuePositive(DimensionSetting* setting) { - const math::Size value = setting->value(); - if (value.width() < 0 || value.height() < 0) { - setting->set_value(setting->source_type(), math::Size(0, 0)); + const TextureDimensions value = setting->value(); + if (value.width() < 0 || value.height() < 0 || value.bytes_per_pixel() < 0) { + setting->set_value(setting->source_type(), TextureDimensions()); } } +void EnsureTwoBytesPerPixel(DimensionSetting* setting) { + TextureDimensions value = setting->value(); + if (value.bytes_per_pixel() != 2) { + LOG(ERROR) << "Only two bytes per pixel are allowed for setting: " + << setting->name(); + value.set_bytes_per_pixel(2); + setting->set_value(setting->source_type(), value); + } +} + +// Sums up the memory consumption of all memory settings with of the input +// memory type. +int64_t SumMemoryConsumption( + MemorySetting::MemoryType memory_type_filter, + const std::vector<const MemorySetting*>& memory_settings) { + int64_t sum = 0; + for (size_t i = 0; i < memory_settings.size(); ++i) { + const MemorySetting* setting = memory_settings[i]; + if (memory_type_filter == setting->memory_type()) { + sum += setting->MemoryConsumption(); + } + } + return sum; +} + } // namespace AutoMem::AutoMem(const math::Size& ui_resolution, const CommandLine& command_line, const BuildSettings& build_settings) { + // Set the misc cobalt engine size to a specific size. + misc_cobalt_cpu_size_in_bytes_.reset( + new IntSetting("misc_cobalt_cpu_size_in_bytes")); + misc_cobalt_cpu_size_in_bytes_->set_value( + MemorySetting::kAutoSet, kMiscCobaltSizeInBytes); + // Set the ImageCache image_cache_size_in_bytes_ = CreateMemorySetting<IntSetting, int64_t>( - switches::kImageCacheSizeInBytes, command_line, + switches::kImageCacheSizeInBytes, + command_line, build_settings.cobalt_image_cache_size_in_bytes, CalculateImageCacheSize(ui_resolution)); EnsureValuePositive(image_cache_size_in_bytes_.get()); + image_cache_size_in_bytes_->set_memory_type(MemorySetting::kGPU); // Set javascript gc threshold javascript_gc_threshold_in_bytes_ = CreateMemorySetting<IntSetting, int64_t>( - switches::kJavaScriptGcThresholdInBytes, command_line, + switches::kJavaScriptGcThresholdInBytes, + command_line, build_settings.javascript_garbage_collection_threshold_in_bytes, kDefaultJsGarbageCollectionThresholdSize); EnsureValuePositive(javascript_gc_threshold_in_bytes_.get()); // Set skia_atlas_texture_dimensions skia_atlas_texture_dimensions_ = - CreateMemorySetting<DimensionSetting, math::Size>( - switches::kSkiaTextureAtlasDimensions, command_line, + CreateMemorySetting<DimensionSetting, TextureDimensions>( + switches::kSkiaTextureAtlasDimensions, + command_line, build_settings.skia_texture_atlas_dimensions, CalculateSkiaGlyphAtlasTextureSize(ui_resolution)); // Not available for non-blitter platforms. if (build_settings.has_blitter) { - skia_atlas_texture_dimensions_->set_value(MemorySetting::kNotApplicable, - math::Size(0, 0)); + skia_atlas_texture_dimensions_->set_memory_type( + MemorySetting::kNotApplicable); + } else { + // Skia always uses gpu memory, when enabled. + skia_atlas_texture_dimensions_->set_memory_type(MemorySetting::kGPU); } EnsureValuePositive(skia_atlas_texture_dimensions_.get()); + EnsureTwoBytesPerPixel(skia_atlas_texture_dimensions_.get()); // Set skia_cache_size_in_bytes skia_cache_size_in_bytes_ = CreateMemorySetting<IntSetting, int64_t>( - switches::kSkiaCacheSizeInBytes, command_line, + switches::kSkiaCacheSizeInBytes, + command_line, build_settings.skia_cache_size_in_bytes, CalculateSkiaCacheSize(ui_resolution)); // Not available for blitter platforms. if (build_settings.has_blitter) { - skia_cache_size_in_bytes_->set_value(MemorySetting::kNotApplicable, 0); + skia_cache_size_in_bytes_->set_memory_type(MemorySetting::kNotApplicable); + } else { + // Skia always uses gpu memory, when enabled. + skia_cache_size_in_bytes_->set_memory_type(MemorySetting::kGPU); } EnsureValuePositive(skia_cache_size_in_bytes_.get()); // Set software_surface_cache_size_in_bytes software_surface_cache_size_in_bytes_ = CreateMemorySetting<IntSetting, int64_t>( - switches::kSoftwareSurfaceCacheSizeInBytes, command_line, + switches::kSoftwareSurfaceCacheSizeInBytes, + command_line, build_settings.software_surface_cache_size_in_bytes, CalculateSoftwareSurfaceCacheSizeInBytes(ui_resolution)); // Blitter only feature. if (!build_settings.has_blitter) { - software_surface_cache_size_in_bytes_->set_value( - MemorySetting::kNotApplicable, 0); + software_surface_cache_size_in_bytes_->set_memory_type( + MemorySetting::kNotApplicable); } EnsureValuePositive(software_surface_cache_size_in_bytes_.get()); } AutoMem::~AutoMem() {} +const IntSetting* AutoMem::misc_engine_cpu_size_in_bytes() const { + return misc_cobalt_cpu_size_in_bytes_.get(); +} + const IntSetting* AutoMem::image_cache_size_in_bytes() const { return image_cache_size_in_bytes_.get(); } @@ -155,11 +232,24 @@ return software_surface_cache_size_in_bytes_.get(); } -std::vector<const MemorySetting*> AutoMem::AllMemorySetttings() const { +std::vector<const MemorySetting*> AutoMem::AllMemorySettings() const { + AutoMem* this_unconst = const_cast<AutoMem*>(this); + std::vector<MemorySetting*> all_settings_mutable = + this_unconst->AllMemorySettingsMutable(); + std::vector<const MemorySetting*> all_settings; + all_settings.assign(all_settings_mutable.begin(), + all_settings_mutable.end()); + return all_settings; +} + +// Make sure that this is the same as AllMemorySettings(). +std::vector<MemorySetting*> AutoMem::AllMemorySettingsMutable() { + std::vector<MemorySetting*> all_settings; // Keep these in alphabetical order. all_settings.push_back(image_cache_size_in_bytes_.get()); all_settings.push_back(javascript_gc_threshold_in_bytes_.get()); + all_settings.push_back(misc_cobalt_cpu_size_in_bytes_.get()); all_settings.push_back(skia_atlas_texture_dimensions_.get()); all_settings.push_back(skia_cache_size_in_bytes_.get()); all_settings.push_back(software_surface_cache_size_in_bytes_.get()); @@ -167,8 +257,20 @@ } std::string AutoMem::ToPrettyPrintString() const { - std::vector<const MemorySetting*> all_settings = AllMemorySetttings(); - return GeneratePrettyPrintTable(all_settings); + std::stringstream ss; + std::vector<const MemorySetting*> all_settings = AllMemorySettings(); + ss << GeneratePrettyPrintTable(all_settings) << "\n"; + + int64_t cpu_consumption = + SumMemoryConsumption(MemorySetting::kCPU, all_settings); + int64_t gpu_consumption = + SumMemoryConsumption(MemorySetting::kGPU, all_settings); + + ss << GenerateMemoryTable(GetTotalCpuMemory(), GetTotalGpuMemory(), + cpu_consumption, gpu_consumption); + + std::string output_str = ss.str(); + return output_str; } } // namespace memory_settings
diff --git a/src/cobalt/browser/memory_settings/auto_mem.h b/src/cobalt/browser/memory_settings/auto_mem.h index 7d4bd2d..4d81db6 100644 --- a/src/cobalt/browser/memory_settings/auto_mem.h +++ b/src/cobalt/browser/memory_settings/auto_mem.h
@@ -44,19 +44,23 @@ const IntSetting* image_cache_size_in_bytes() const; const IntSetting* javascript_gc_threshold_in_bytes() const; + const IntSetting* misc_engine_cpu_size_in_bytes() const; const DimensionSetting* skia_atlas_texture_dimensions() const; const IntSetting* skia_cache_size_in_bytes() const; const IntSetting* software_surface_cache_size_in_bytes() const; - std::vector<const MemorySetting*> AllMemorySetttings() const; + std::vector<const MemorySetting*> AllMemorySettings() const; + std::vector<MemorySetting*> AllMemorySettingsMutable(); - // Generates a string table of the memory settings. This is used during - // startup to display memory configuration information. + // Generates a string table of the memory settings and available memory for + // cpu and gpu. This is used during startup to display memory configuration + // information. std::string ToPrettyPrintString() const; private: scoped_ptr<IntSetting> image_cache_size_in_bytes_; scoped_ptr<IntSetting> javascript_gc_threshold_in_bytes_; + scoped_ptr<IntSetting> misc_cobalt_cpu_size_in_bytes_; scoped_ptr<DimensionSetting> skia_atlas_texture_dimensions_; scoped_ptr<IntSetting> skia_cache_size_in_bytes_; scoped_ptr<IntSetting> software_surface_cache_size_in_bytes_;
diff --git a/src/cobalt/browser/memory_settings/auto_mem_test.cc b/src/cobalt/browser/memory_settings/auto_mem_test.cc index 4f6d6d7..b5a2ba5 100644 --- a/src/cobalt/browser/memory_settings/auto_mem_test.cc +++ b/src/cobalt/browser/memory_settings/auto_mem_test.cc
@@ -22,6 +22,7 @@ #include "base/optional.h" #include "cobalt/browser/memory_settings/build_settings.h" #include "cobalt/browser/memory_settings/calculations.h" +#include "cobalt/browser/memory_settings/test_common.h" #include "cobalt/browser/switches.h" #include "cobalt/math/size.h" #include "testing/gtest/include/gtest/gtest.h" @@ -32,8 +33,10 @@ const math::Size kResolution1080p(1920, 1080); -#define EXPECT_MEMORY_SETTING(SETTING, SOURCE, VALUE) \ +#define EXPECT_MEMORY_SETTING(SETTING, SOURCE, MEMORY_TYPE, VALUE) \ EXPECT_EQ(VALUE, SETTING->value()) << " failure for " << SETTING->name(); \ + EXPECT_EQ(MEMORY_TYPE, SETTING->memory_type()) << "failure for " \ + << SETTING->memory_type(); \ EXPECT_EQ(SOURCE, SETTING->source_type()) << " failure for " \ << SETTING->name(); @@ -61,43 +64,61 @@ // image_cache_size_in_bytes and javascript_gc_threshold_in_bytes settings // ignore the blitter type. EXPECT_MEMORY_SETTING(auto_mem.image_cache_size_in_bytes(), - MemorySetting::kCmdLine, 1234); + MemorySetting::kCmdLine, MemorySetting::kGPU, 1234); EXPECT_MEMORY_SETTING(auto_mem.javascript_gc_threshold_in_bytes(), - MemorySetting::kCmdLine, 2345); + MemorySetting::kCmdLine, MemorySetting::kCPU, 2345); // Certain features are only available for the blitter, and some features // are disabled, vice versa. if (builtin_settings.has_blitter) { // When blitter is active then skia_atlas_texture_dimensions are // not applicable because this is an OpenGl egl feature. - EXPECT_MEMORY_SETTING(auto_mem.skia_atlas_texture_dimensions(), - MemorySetting::kNotApplicable, math::Size(0, 0)); - + EXPECT_MEMORY_SETTING( + auto_mem.skia_atlas_texture_dimensions(), MemorySetting::kCmdLine, + MemorySetting::kNotApplicable, TextureDimensions(0, 0, 0)); // Skia cache is also an egl-only feature, which is not applicable // for blitter. EXPECT_MEMORY_SETTING(auto_mem.skia_cache_size_in_bytes(), + MemorySetting::kCmdLine, MemorySetting::kNotApplicable, 0); EXPECT_MEMORY_SETTING(auto_mem.software_surface_cache_size_in_bytes(), - MemorySetting::kCmdLine, 4567); + MemorySetting::kCmdLine, MemorySetting::kCPU, 4567); } else { // Skia atlas is an egl-only feature and therefore enabled. EXPECT_MEMORY_SETTING(auto_mem.skia_atlas_texture_dimensions(), - MemorySetting::kCmdLine, math::Size(1234, 5678)); + MemorySetting::kCmdLine, MemorySetting::kGPU, + TextureDimensions(1234, 5678, 2)); // Skia cache is an egl-only feature therefore it is enabled for egl. EXPECT_MEMORY_SETTING(auto_mem.skia_cache_size_in_bytes(), - MemorySetting::kCmdLine, 3456); + MemorySetting::kCmdLine, MemorySetting::kGPU, 3456); // Software surface cache is a blitter-only feature, therefore disabled // in egl. EXPECT_MEMORY_SETTING(auto_mem.software_surface_cache_size_in_bytes(), + MemorySetting::kCmdLine, MemorySetting::kNotApplicable, 0); } } } +// Tests the expectation that if the command line specifies that the variable +// is "autoset" that the builtin setting is overriden. +TEST(AutoMem, CommandLineSpecifiesAutoset) { + CommandLine command_line(CommandLine::NO_PROGRAM); + command_line.AppendSwitchASCII(switches::kImageCacheSizeInBytes, "autoset"); + BuildSettings build_settings; + build_settings.cobalt_image_cache_size_in_bytes = 1234; + + AutoMem auto_mem(kResolution1080p, command_line, build_settings); + + EXPECT_MEMORY_SETTING(auto_mem.image_cache_size_in_bytes(), + MemorySetting::kAutoSet, MemorySetting::kGPU, + CalculateImageCacheSize(kResolution1080p)); +} + // Tests that skia atlas texture will be bind to the built in value, iff it has // been set. TEST(AutoMem, SkiaAtlasTextureAtlasSize) { @@ -106,7 +127,7 @@ BuildSettings builtin_settings_with_default; builtin_settings_with_default.skia_texture_atlas_dimensions = - math::Size(1234, 5678); + TextureDimensions(1234, 5678, 2); AutoMem auto_mem(kResolution1080p, empty_command_line, builtin_settings); AutoMem auto_mem_with_default(kResolution1080p, empty_command_line, @@ -116,13 +137,14 @@ // build settings that it will bind to the auto-set value (computed from // CalculateSkiaGlyphAtlasTextureSize(...)). EXPECT_MEMORY_SETTING(auto_mem.skia_atlas_texture_dimensions(), - MemorySetting::kAutoSet, + MemorySetting::kAutoSet, MemorySetting::kGPU, CalculateSkiaGlyphAtlasTextureSize(kResolution1080p)); // Expect that when the skia_atlas_texture_dimensions is specified in the // build settings that it will bind to the final value. EXPECT_MEMORY_SETTING(auto_mem_with_default.skia_atlas_texture_dimensions(), - MemorySetting::kBuildSetting, math::Size(1234, 5678)); + MemorySetting::kBuildSetting, MemorySetting::kGPU, + TextureDimensions(1234, 5678, 2)); } // Tests that software surface cache will be bind to the built in value, iff @@ -145,11 +167,12 @@ // CalculateSoftwareSurfaceCacheSizeInBytes(...)). EXPECT_MEMORY_SETTING( auto_mem.software_surface_cache_size_in_bytes(), MemorySetting::kAutoSet, + MemorySetting::kCPU, CalculateSoftwareSurfaceCacheSizeInBytes(kResolution1080p)); EXPECT_MEMORY_SETTING( auto_mem_with_surface_cache.software_surface_cache_size_in_bytes(), - MemorySetting::kBuildSetting, 1234); + MemorySetting::kBuildSetting, MemorySetting::kCPU, 1234); } // Tests that skia cache will be bind to the built in value, iff @@ -165,11 +188,25 @@ builtin_settings_with_default); EXPECT_MEMORY_SETTING(auto_mem.skia_cache_size_in_bytes(), - MemorySetting::kAutoSet, + MemorySetting::kAutoSet, MemorySetting::kGPU, CalculateSkiaCacheSize(kResolution1080p)); EXPECT_MEMORY_SETTING(auto_mem_with_skia_cache.skia_cache_size_in_bytes(), - MemorySetting::kBuildSetting, 1234); + MemorySetting::kBuildSetting, MemorySetting::kGPU, + 1234); +} + +TEST(AutoMem, AllMemorySettingsAreOrderedByName) { + CommandLine empty_command_line(CommandLine::NO_PROGRAM); + BuildSettings builtin_settings; + + AutoMem auto_mem(kResolution1080p, empty_command_line, builtin_settings); + + std::vector<const MemorySetting*> settings = auto_mem.AllMemorySettings(); + + for (size_t i = 1; i < settings.size(); ++i) { + ASSERT_LT(settings[i-1]->name(), settings[i]->name()); + } } } // namespace memory_settings
diff --git a/src/cobalt/browser/memory_settings/build_settings.cc b/src/cobalt/browser/memory_settings/build_settings.cc index 65c646e..32c151e 100644 --- a/src/cobalt/browser/memory_settings/build_settings.cc +++ b/src/cobalt/browser/memory_settings/build_settings.cc
@@ -16,6 +16,8 @@ #include "cobalt/browser/memory_settings/build_settings.h" +#include "cobalt/browser/memory_settings/constants.h" + namespace cobalt { namespace browser { namespace memory_settings { @@ -37,10 +39,10 @@ return output; } -base::optional<math::Size> MakeDimensionsIfPositive(int width, int height) { - base::optional<math::Size> output; - if ((width > 0) && (height > 0)) { - output = math::Size(width, height); +base::optional<TextureDimensions> MakeDimensionsIfValid(TextureDimensions td) { + base::optional<TextureDimensions> output; + if ((td.width() > 0) && (td.height() > 0) && td.bytes_per_pixel() > 0) { + output = td; } return output; } @@ -49,6 +51,7 @@ BuildSettings GetDefaultBuildSettings() { BuildSettings settings; settings.has_blitter = HasBlitter(); + settings.cobalt_image_cache_size_in_bytes = MakeValidIfGreaterThanOrEqualToZero(COBALT_IMAGE_CACHE_SIZE_IN_BYTES); settings.javascript_garbage_collection_threshold_in_bytes = @@ -56,8 +59,10 @@ COBALT_JS_GARBAGE_COLLECTION_THRESHOLD_IN_BYTES); settings.skia_cache_size_in_bytes = MakeValidIfGreaterThanOrEqualToZero(COBALT_SKIA_CACHE_SIZE_IN_BYTES); - settings.skia_texture_atlas_dimensions = MakeDimensionsIfPositive( - COBALT_SKIA_GLYPH_ATLAS_WIDTH, COBALT_SKIA_GLYPH_ATLAS_HEIGHT); + settings.skia_texture_atlas_dimensions = + MakeDimensionsIfValid(TextureDimensions(COBALT_SKIA_GLYPH_ATLAS_WIDTH, + COBALT_SKIA_GLYPH_ATLAS_HEIGHT, + kSkiaGlyphAtlasTextureBytesPerPixel)); settings.software_surface_cache_size_in_bytes = MakeValidIfGreaterThanOrEqualToZero( COBALT_SOFTWARE_SURFACE_CACHE_SIZE_IN_BYTES);
diff --git a/src/cobalt/browser/memory_settings/build_settings.h b/src/cobalt/browser/memory_settings/build_settings.h index c57daea..3d71e31 100644 --- a/src/cobalt/browser/memory_settings/build_settings.h +++ b/src/cobalt/browser/memory_settings/build_settings.h
@@ -18,6 +18,7 @@ #define COBALT_BROWSER_MEMORY_SETTINGS_BUILD_SETTINGS_H_ #include "base/optional.h" +#include "cobalt/browser/memory_settings/texture_dimensions.h" #include "cobalt/math/size.h" #include "starboard/types.h" @@ -31,7 +32,7 @@ base::optional<int64_t> cobalt_image_cache_size_in_bytes; base::optional<int64_t> javascript_garbage_collection_threshold_in_bytes; base::optional<int64_t> skia_cache_size_in_bytes; - base::optional<math::Size> skia_texture_atlas_dimensions; + base::optional<TextureDimensions> skia_texture_atlas_dimensions; base::optional<int64_t> software_surface_cache_size_in_bytes; };
diff --git a/src/cobalt/browser/memory_settings/calculations.cc b/src/cobalt/browser/memory_settings/calculations.cc index 6111d95..7da7d3e 100644 --- a/src/cobalt/browser/memory_settings/calculations.cc +++ b/src/cobalt/browser/memory_settings/calculations.cc
@@ -18,6 +18,8 @@ #include <algorithm> +#include "cobalt/browser/memory_settings/build_settings.h" +#include "cobalt/browser/memory_settings/constants.h" #include "cobalt/math/size.h" namespace cobalt { @@ -95,7 +97,8 @@ kMinImageCacheSize, kMaxImageCacheSize); } -math::Size CalculateSkiaGlyphAtlasTextureSize(const math::Size& ui_resolution) { +TextureDimensions CalculateSkiaGlyphAtlasTextureSize( + const math::Size& ui_resolution) { // LinearRemap defines a mapping function which will map the number // of ui_resolution pixels to the number of texture atlas pixels such that: // 1080p (1920x1080) => maps to => 2048x2048 texture atlas pixels @@ -113,9 +116,13 @@ // Clamp the atlas texture to be within a minimum range. math::Size clamped_atlas_texture( - std::max<int>(kMinSkiaTextureAtlasWidth, atlas_texture.width()), - std::max<int>(kMinSkiaTextureAtlasWidth, atlas_texture.height())); - return clamped_atlas_texture; + std::max<int>(kMinSkiaGlyphTextureAtlasWidth, atlas_texture.width()), + std::max<int>(kMinSkiaGlyphTextureAtlasWidth, atlas_texture.height())); + + TextureDimensions texture_dimensions(clamped_atlas_texture.width(), + clamped_atlas_texture.height(), + kSkiaGlyphAtlasTextureBytesPerPixel); + return texture_dimensions; } int64_t CalculateSoftwareSurfaceCacheSizeInBytes(
diff --git a/src/cobalt/browser/memory_settings/calculations.h b/src/cobalt/browser/memory_settings/calculations.h index c90426a..cbb3afb 100644 --- a/src/cobalt/browser/memory_settings/calculations.h +++ b/src/cobalt/browser/memory_settings/calculations.h
@@ -18,6 +18,7 @@ #define COBALT_BROWSER_MEMORY_SETTINGS_CALCULATIONS_H_ #include "base/optional.h" +#include "cobalt/browser/memory_settings/texture_dimensions.h" #include "cobalt/math/size.h" #include "starboard/types.h" @@ -41,7 +42,8 @@ // and // kMinSkiaTextureAtlasHeight <= output.height() <= kMaxSkiaTextureAtlasHeight // will be true. -math::Size CalculateSkiaGlyphAtlasTextureSize(const math::Size& ui_resolution); +TextureDimensions CalculateSkiaGlyphAtlasTextureSize( + const math::Size& ui_resolution); // Calculates the SoftwareSurfaceCacheSize given the ui_resolution. int64_t CalculateSoftwareSurfaceCacheSizeInBytes( @@ -51,19 +53,6 @@ // to be 4MB @ 1080p and scales accordingly. int64_t CalculateSkiaCacheSize(const math::Size& ui_resolution); -// These internal values are exposed for testing. -enum MemorySizes { - kMinImageCacheSize = 20 * 1024 * 1024, // 20mb. - kMaxImageCacheSize = 64 * 1024 * 1024, // 64mb - - kMinSkiaTextureAtlasWidth = 2048, - kMinSkiaTextureAtlasHeight = 2048, - - kDefaultJsGarbageCollectionThresholdSize = 1 * 1024 * 1024, // 1mb - - kMinSkiaCacheSize = 4 * 1024 * 1024, // 4mb. -}; - } // namespace memory_settings } // namespace browser } // namespace cobalt
diff --git a/src/cobalt/browser/memory_settings/calculations_test.cc b/src/cobalt/browser/memory_settings/calculations_test.cc index 935dc41..1d82f58 100644 --- a/src/cobalt/browser/memory_settings/calculations_test.cc +++ b/src/cobalt/browser/memory_settings/calculations_test.cc
@@ -23,6 +23,9 @@ #include "base/command_line.h" #include "base/logging.h" +#include "cobalt/browser/memory_settings/build_settings.h" +#include "cobalt/browser/memory_settings/constants.h" +#include "cobalt/browser/memory_settings/test_common.h" #include "cobalt/browser/switches.h" #include "starboard/log.h" #include "starboard/memory.h" @@ -111,14 +114,14 @@ // function (side effect free) and will produce expected results. TEST(MemoryCalculations, CalculateSkiaGlyphAtlasTextureSize) { math::Size ui_dimensions; - math::Size atlas_texture_size; + TextureDimensions atlas_texture_size; // Test that the small resolution of 480p produces a texture atlas // that is minimal. ui_dimensions = GetDimensions(k480p); atlas_texture_size = CalculateSkiaGlyphAtlasTextureSize(ui_dimensions); - EXPECT_EQ(kMinSkiaTextureAtlasWidth, atlas_texture_size.width()); - EXPECT_EQ(kMinSkiaTextureAtlasHeight, atlas_texture_size.height()); + EXPECT_EQ(kMinSkiaGlyphTextureAtlasWidth, atlas_texture_size.width()); + EXPECT_EQ(kMinSkiaGlyphTextureAtlasHeight, atlas_texture_size.height()); // Test that expected resolution of 1080p produces a 2048x2048 // atlas texture.
diff --git a/src/cobalt/browser/memory_settings/constants.h b/src/cobalt/browser/memory_settings/constants.h new file mode 100644 index 0000000..2826296 --- /dev/null +++ b/src/cobalt/browser/memory_settings/constants.h
@@ -0,0 +1,45 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COBALT_BROWSER_MEMORY_SETTINGS_CONSTANTS_H_ +#define COBALT_BROWSER_MEMORY_SETTINGS_CONSTANTS_H_ + +namespace cobalt { +namespace browser { +namespace memory_settings { + +// These internal values are exposed for testing. +enum MemorySizes { + // Size of the engine, minus all caches. + kMiscCobaltSizeInBytes = 32 * 1024 * 1024, + + kMinImageCacheSize = 20 * 1024 * 1024, // 20mb. + kMaxImageCacheSize = 64 * 1024 * 1024, // 64mb + + kMinSkiaGlyphTextureAtlasWidth = 2048, + kMinSkiaGlyphTextureAtlasHeight = 2048, + kSkiaGlyphAtlasTextureBytesPerPixel = 2, + + kDefaultJsGarbageCollectionThresholdSize = 1 * 1024 * 1024, // 1mb + + kMinSkiaCacheSize = 4 * 1024 * 1024, // 4mb. +}; + +} // namespace memory_settings +} // namespace browser +} // namespace cobalt + +#endif // COBALT_BROWSER_MEMORY_SETTINGS_CONSTANTS_H_
diff --git a/src/cobalt/browser/memory_settings/memory_settings.cc b/src/cobalt/browser/memory_settings/memory_settings.cc index f6097c4..b71735b 100644 --- a/src/cobalt/browser/memory_settings/memory_settings.cc +++ b/src/cobalt/browser/memory_settings/memory_settings.cc
@@ -25,6 +25,8 @@ #include "base/string_number_conversions.h" #include "base/string_split.h" #include "base/stringprintf.h" +#include "cobalt/browser/memory_settings/build_settings.h" +#include "cobalt/browser/memory_settings/constants.h" #include "cobalt/browser/switches.h" #include "nb/lexical_cast.h" @@ -59,17 +61,22 @@ } // namespace MemorySetting::MemorySetting(ClassType type, const std::string& name) - : class_type_(type), name_(name), source_type_(kUnset) {} + : class_type_(type), + name_(name), + source_type_(kUnset), + memory_type_(kCPU) {} IntSetting::IntSetting(const std::string& name) : MemorySetting(kInt, name), value_() {} std::string IntSetting::ValueToString() const { std::stringstream ss; - ss << value_; + ss << value(); return ss.str(); } +int64_t IntSetting::MemoryConsumption() const { return value(); } + bool IntSetting::TryParseValue(SourceType source_type, const std::string& string_value) { bool parse_ok = false; @@ -89,23 +96,41 @@ std::string DimensionSetting::ValueToString() const { std::stringstream ss; - ss << value_.width() << "x" << value_.height(); + TextureDimensions value_data = value(); + ss << value_data.width() << "x" << value_data.height() << "x" + << value_data.bytes_per_pixel(); return ss.str(); } +int64_t DimensionSetting::MemoryConsumption() const { + return value().TotalBytes(); +} + bool DimensionSetting::TryParseValue(SourceType source_type, const std::string& string_value) { std::vector<ParsedIntValue> int_values = ParseDimensions(string_value); - const bool parse_ok = (int_values.size() == 2) && (!int_values[0].error_) && - (!int_values[1].error_); - if (parse_ok) { - math::Size rectangle(int_values[0].value_, int_values[1].value_); - set_value(source_type, rectangle); - return true; - } else { + + if ((int_values.size() < 2) || (int_values.size() > 3)) { LOG(ERROR) << "Invalid value for parse value setting: " << string_value; - return false; + return false; // Parse failed. } + + for (size_t i = 0; i < int_values.size(); ++i) { + if (int_values[i].error_) { + LOG(ERROR) << "Invalid value for parse value setting: " << string_value; + return false; // Parse failed. + } + } + + const int bytes_per_pixel = + int_values.size() == 3 ? + int_values[2].value_ : kSkiaGlyphAtlasTextureBytesPerPixel; + + TextureDimensions tex_dimensions(int_values[0].value_, int_values[1].value_, + bytes_per_pixel); + + set_value(source_type, tex_dimensions); + return true; } } // namespace memory_settings
diff --git a/src/cobalt/browser/memory_settings/memory_settings.h b/src/cobalt/browser/memory_settings/memory_settings.h index 1d13aa7..c1e3d80 100644 --- a/src/cobalt/browser/memory_settings/memory_settings.h +++ b/src/cobalt/browser/memory_settings/memory_settings.h
@@ -22,6 +22,7 @@ #include "base/compiler_specific.h" #include "base/optional.h" +#include "cobalt/browser/memory_settings/texture_dimensions.h" #include "cobalt/math/size.h" #include "starboard/configuration.h" #include "starboard/types.h" @@ -38,8 +39,9 @@ // SourceType defines the location where the setting was set from. // kNotApplicable means the setting is not supported on the current system // configuration. - enum SourceType { kUnset, kCmdLine, kBuildSetting, kAutoSet, kNotApplicable }; + enum SourceType { kUnset, kCmdLine, kBuildSetting, kAutoSet }; enum ClassType { kInt, kDimensions }; + enum MemoryType { kCPU, kGPU, kNotApplicable }; virtual std::string ValueToString() const = 0; // Returns true if the TryParseValue() succeeded when converting the string @@ -47,9 +49,17 @@ virtual bool TryParseValue(SourceType source_type, const std::string& string_value) = 0; + virtual int64_t MemoryConsumption() const = 0; + + // Setting kNotApplicable will invalidate the MemorySetting. + void set_memory_type(MemoryType memory_type) { memory_type_ = memory_type; } + const std::string& name() const { return name_; } SourceType source_type() const { return source_type_; } ClassType class_type() const { return class_type_; } + MemoryType memory_type() const { return memory_type_; } + + bool valid() const { return kNotApplicable != memory_type_; } protected: MemorySetting(ClassType type, const std::string& name); @@ -57,6 +67,7 @@ const ClassType class_type_; const std::string name_; SourceType source_type_; + MemoryType memory_type_; // Defaults to kCPU. private: // Default constructor for MemorySetting is forbidden. Do not use it. @@ -70,7 +81,9 @@ explicit IntSetting(const std::string& name); std::string ValueToString() const OVERRIDE; - int64_t value() const { return value_; } + virtual int64_t MemoryConsumption() const OVERRIDE; + + int64_t value() const { return valid() ? value_ : 0; } void set_value(SourceType source_type, int64_t val) { source_type_ = source_type; value_ = val; @@ -84,14 +97,19 @@ SB_DISALLOW_COPY_AND_ASSIGN(IntSetting); }; -// A memory setting for dimensions type values like "2048x4096". +// A memory setting for dimensions type values like "2048x4096x2" where +// the first value is width, second is height, and third is bytes_per_pixel. class DimensionSetting : public MemorySetting { public: explicit DimensionSetting(const std::string& name); std::string ValueToString() const OVERRIDE; - math::Size value() const { return value_; } - void set_value(SourceType source_type, const math::Size& val) { + virtual int64_t MemoryConsumption() const OVERRIDE; + + TextureDimensions value() const { + return valid() ? value_ : TextureDimensions(); + } + void set_value(SourceType source_type, const TextureDimensions& val) { source_type_ = source_type; value_ = val; } @@ -99,7 +117,7 @@ const std::string& string_value) OVERRIDE; private: - math::Size value_; + TextureDimensions value_; SB_DISALLOW_COPY_AND_ASSIGN(DimensionSetting); };
diff --git a/src/cobalt/browser/memory_settings/memory_settings_test.cc b/src/cobalt/browser/memory_settings/memory_settings_test.cc index 565d1c1..956965f 100644 --- a/src/cobalt/browser/memory_settings/memory_settings_test.cc +++ b/src/cobalt/browser/memory_settings/memory_settings_test.cc
@@ -22,6 +22,7 @@ #include <vector> #include "base/memory/scoped_ptr.h" +#include "cobalt/browser/memory_settings/test_common.h" #include "testing/gtest/include/gtest/gtest.h" namespace cobalt { @@ -41,9 +42,18 @@ scoped_ptr<DimensionSetting> rect_setting(new DimensionSetting("dummy")); ASSERT_TRUE( rect_setting->TryParseValue(MemorySetting::kCmdLine, "1234x5678")); - EXPECT_EQ(math::Size(1234, 5678), rect_setting->value()); + EXPECT_EQ(TextureDimensions(1234, 5678, 2), rect_setting->value()); EXPECT_EQ(MemorySetting::kCmdLine, rect_setting->source_type()); - EXPECT_EQ(std::string("1234x5678"), rect_setting->ValueToString()); + EXPECT_EQ(std::string("1234x5678x2"), rect_setting->ValueToString()); +} + +TEST(DimensionSetting, ParseFromStringWithBytesPerPixel) { + scoped_ptr<DimensionSetting> rect_setting(new DimensionSetting("dummy")); + ASSERT_TRUE( + rect_setting->TryParseValue(MemorySetting::kCmdLine, "1234x5678x12")); + EXPECT_EQ(TextureDimensions(1234, 5678, 12), rect_setting->value()); + EXPECT_EQ(MemorySetting::kCmdLine, rect_setting->source_type()); + EXPECT_EQ(std::string("1234x5678x12"), rect_setting->ValueToString()); } } // namespace memory_settings
diff --git a/src/cobalt/browser/memory_settings/pretty_print.cc b/src/cobalt/browser/memory_settings/pretty_print.cc index b153b5f..298fe3f 100644 --- a/src/cobalt/browser/memory_settings/pretty_print.cc +++ b/src/cobalt/browser/memory_settings/pretty_print.cc
@@ -17,129 +17,25 @@ #include "cobalt/browser/memory_settings/pretty_print.h" #include <algorithm> +#include <string> #include <vector> #include "cobalt/browser/memory_settings/memory_settings.h" +#include "cobalt/browser/memory_settings/table_printer.h" #include "starboard/log.h" +#include "starboard/string.h" namespace cobalt { namespace browser { namespace memory_settings { namespace { -class TablePrinter { - public: - struct Row { - std::string name; - std::string value; - std::string source; - }; - - static std::string ToString(const std::vector<Row>& rows) { - // First column is the name, the second is the value, then source. - size_t name_col_width = 0; - size_t value_col_width = 0; - size_t source_col_width = 0; - - for (size_t i = 0; i < rows.size(); ++i) { - const Row& row = rows[i]; - name_col_width = std::max<size_t>(name_col_width, row.name.size()); - value_col_width = std::max<size_t>(value_col_width, row.value.size()); - source_col_width = std::max<size_t>(source_col_width, row.source.size()); - } - - TablePrinter printer(name_col_width, value_col_width, source_col_width); - - std::stringstream output_ss; - std::string row_delimiter = printer.MakeDelimiterRow(); - - output_ss << printer.MakeHeaderRow() << "\n"; - output_ss << row_delimiter << "\n"; - - for (size_t i = 0; i < rows.size(); ++i) { - const Row& row = rows[i]; - std::string row_str = - printer.MakeDataRow(row.name, row.value, row.source); - output_ss << row_str << "\n"; - output_ss << row_delimiter << "\n"; - } - - return output_ss.str(); +std::string StringifySourceType(const MemorySetting* setting) { + if (!setting->valid()) { + return "N/A"; } - private: - TablePrinter(size_t name_col_width, size_t value_col_width, - size_t source_col_width) - : name_col_width_(name_col_width), - value_col_width_(value_col_width), - source_col_width_(source_col_width) { - Init(); - } - - void Init() { - std::stringstream fmt_row_ss; - // Example: "| %-30s | %9s | %9s |\n" - fmt_row_ss << "| %-" << name_col_width_ << "s | %" << value_col_width_ - << "s | %" << source_col_width_ << "s |"; - fmt_data_row_ = fmt_row_ss.str(); - } - - std::string MakeHeaderRow() const { - std::string name_str = "NAME"; - std::string value_str = "VALUE"; - std::string source_str = "SOURCE"; - - std::stringstream ss; - ss << name_str; - for (size_t i = 0; i < name_col_width_ + 3 - name_str.size(); ++i) { - ss << " "; - } - - ss << value_str; - for (size_t i = 0; i < value_col_width_ + 3 - value_str.size(); ++i) { - ss << " "; - } - - ss << source_str; - for (size_t i = 0; i < source_col_width_ + 4 - source_str.size(); ++i) { - ss << " "; - } - return ss.str(); - } - - std::string MakeDataRow(const std::string& name, const std::string& value, - const std::string& source) const { - std::string row_str = base::StringPrintf( - fmt_data_row_.c_str(), name.c_str(), value.c_str(), source.c_str()); - return row_str; - } - - std::string MakeDelimiterRow() const { - std::stringstream ss; - ss << "+"; - for (size_t i = 0; i < name_col_width_ + 2; ++i) { - ss << "-"; - } - ss << "+"; - for (size_t i = 0; i < value_col_width_ + 2; ++i) { - ss << "-"; - } - ss << "+"; - for (size_t i = 0; i < source_col_width_ + 2; ++i) { - ss << "-"; - } - ss << "+"; - return ss.str(); - } - - const size_t name_col_width_; - const size_t value_col_width_; - const size_t source_col_width_; - std::string fmt_data_row_; -}; - -std::string StringifySourceType(MemorySetting::SourceType source_type) { - switch (source_type) { + switch (setting->source_type()) { case MemorySetting::kUnset: { return "Unset"; } @@ -147,41 +43,121 @@ return "CmdLine"; } case MemorySetting::kBuildSetting: { - return "BuildSetting"; + return "Build"; } case MemorySetting::kAutoSet: { return "AutoSet"; } + } + + SB_NOTIMPLEMENTED() << "Unimplemented string for type: " + << setting->source_type(); + return "UNKNOWN"; +} + +std::string StringifyMemoryType(const MemorySetting* setting) { + switch (setting->memory_type()) { + case MemorySetting::kCPU: { + return "CPU"; + } + case MemorySetting::kGPU: { + return "GPU"; + } case MemorySetting::kNotApplicable: { return "N/A"; } } - SB_NOTIMPLEMENTED() << "Unimplemented string for type " << source_type; + SB_NOTIMPLEMENTED() << "Unimplemented string for memory type: " + << setting->memory_type(); return "UNKNOWN"; } +std::string StringifyValue(const MemorySetting* setting) { + if (!setting->valid()) { + return "N/A"; + } + return setting->ValueToString(); +} + +std::string ToMegabyteString(int64_t bytes) { + float megabytes = bytes / (1024.0f * 1024.0f); + + char buff[128]; + SbStringFormatF(buff, sizeof(buff), "%.1f MB", megabytes); + // Use 16 + return std::string(buff); +} + } // namespace std::string GeneratePrettyPrintTable( const std::vector<const MemorySetting*>& settings) { - std::vector<TablePrinter::Row> rows; + TablePrinter printer; + + std::vector<std::string> header; + header.push_back("NAME"); + header.push_back("VALUE"); + header.push_back(""); + header.push_back("TYPE"); + header.push_back("SOURCE"); + printer.AddRow(header); for (size_t i = 0; i < settings.size(); ++i) { const MemorySetting* setting = settings[i]; - TablePrinter::Row row; - row.name = setting->name(); - row.value = setting->ValueToString(); - row.source = StringifySourceType(setting->source_type()); - - rows.push_back(row); + std::vector<std::string> row; + row.push_back(setting->name()); + row.push_back(StringifyValue(setting)); + if (setting->valid()) { + row.push_back(ToMegabyteString(setting->MemoryConsumption())); + } else { + row.push_back("N/A"); + } + row.push_back(StringifyMemoryType(setting)); + row.push_back(StringifySourceType(setting)); + printer.AddRow(row); } - std::string table_string = TablePrinter::ToString(rows); + std::string table_string = printer.ToString(); return table_string; } +std::string GenerateMemoryTable(int64_t total_cpu_memory, + base::optional<int64_t> total_gpu_memory, + int64_t settings_cpu_consumption, + int64_t settings_gpu_consumption) { + TablePrinter printer; + std::vector<std::string> header; + header.push_back("TYPE"); + header.push_back("TOTAL"); + header.push_back("SETTINGS"); + printer.AddRow(header); + + std::vector<std::string> data_row; + data_row.push_back("CPU"); + data_row.push_back(ToMegabyteString(total_cpu_memory)); + data_row.push_back(ToMegabyteString(settings_cpu_consumption)); + printer.AddRow(data_row); + data_row.clear(); + + data_row.push_back("GPU"); + + std::string total_gpu_consumption_str; + if (!total_gpu_memory) { + total_gpu_consumption_str = "<UNKNOWN>"; + } else { + total_gpu_consumption_str = ToMegabyteString(*total_gpu_memory); + } + + data_row.push_back(total_gpu_consumption_str); + data_row.push_back(ToMegabyteString(settings_gpu_consumption)); + printer.AddRow(data_row); + data_row.clear(); + + return printer.ToString(); +} + } // namespace memory_settings } // namespace browser } // namespace cobalt
diff --git a/src/cobalt/browser/memory_settings/pretty_print.h b/src/cobalt/browser/memory_settings/pretty_print.h index dd533c0..be70421 100644 --- a/src/cobalt/browser/memory_settings/pretty_print.h +++ b/src/cobalt/browser/memory_settings/pretty_print.h
@@ -17,35 +17,58 @@ #ifndef COBALT_BROWSER_MEMORY_SETTINGS_PRETTY_PRINT_H_ #define COBALT_BROWSER_MEMORY_SETTINGS_PRETTY_PRINT_H_ -#include <map> #include <string> #include <vector> -#include "base/string_number_conversions.h" -#include "base/string_split.h" -#include "base/stringprintf.h" #include "cobalt/browser/memory_settings/memory_settings.h" +#include "starboard/types.h" namespace cobalt { namespace browser { namespace memory_settings { // Generates a table, ie: -// "NAME VALUE SOURCE \n" -// "+--------------------------------------+-----------+--------------+\n" -// "| image_cache_size_in_bytes | 1234 | CmdLine |\n" -// "+--------------------------------------+-----------+--------------+\n" -// "| javascript_gc_threshold_in_bytes | 1112 | AutoSet |\n" -// "+--------------------------------------+-----------+--------------+\n" -// "| skia_atlas_texture_dimensions | 1234x4567 | CmdLine |\n" -// "+--------------------------------------+-----------+--------------+\n" -// "| skia_cache_size_in_bytes | 0 | N/A |\n" -// "+--------------------------------------+-----------+--------------+\n" -// "| software_surface_cache_size_in_bytes | 8910 | BuildSetting |\n" -// "+--------------------------------------+-----------+--------------+\n"; +// +// NAME VALUE TYPE SOURCE +// _______________________________________________________________________________ +// | | | | | | +// | image_cache_size_in_bytes | 33554432 | 32.0 MB | GPU | AutoSet | +// |______________________________________|_____________|_________|______|_________| +// | | | | | | +// | javascript_gc_threshold_in_bytes | 8388608 | 8.0 MB | CPU | Build | +// |______________________________________|_____________|_________|______|_________| +// | | | | | | +// | misc_cobalt_engine_size_in_bytes | 33554432 | 32.0 MB | CPU | Build | +// |______________________________________|_____________|_________|______|_________| +// | | | | | | +// | skia_atlas_texture_dimensions | 4096x8192x2 | 64.0 MB | GPU | Build | +// |______________________________________|_____________|_________|______|_________| +// | | | | | | +// | skia_cache_size_in_bytes | 4194304 | 4.0 MB | GPU | Build | +// |______________________________________|_____________|_________|______|_________| +// | | | | | | +// | software_surface_cache_size_in_bytes | N/A | N/A | N/A | N/A | +// |______________________________________|_____________|_________|______|_________| std::string GeneratePrettyPrintTable( const std::vector<const MemorySetting*>& memory_settings); +// Generates a table, ie: +// +// TYPE TOTAL SETTINGS +// ____________________________ +// | | | | +// | CPU | 256.0 MB | 40.0 MB | +// |______|__________|__________| +// | | | | +// | GPU | 768.0 MB | 100.0 MB | +// |______|__________|__________| +// When optional total_gpu_memory is null then the the value in the output +// table will be <UNKNOWN>. +std::string GenerateMemoryTable(int64_t total_cpu_memory, + base::optional<int64_t> total_gpu_memory, + int64_t settings_cpu_consumption, + int64_t settings_gpu_consumption); + } // namespace memory_settings } // namespace browser } // namespace cobalt
diff --git a/src/cobalt/browser/memory_settings/pretty_print_test.cc b/src/cobalt/browser/memory_settings/pretty_print_test.cc index 079a099..ad5108e 100644 --- a/src/cobalt/browser/memory_settings/pretty_print_test.cc +++ b/src/cobalt/browser/memory_settings/pretty_print_test.cc
@@ -17,6 +17,7 @@ #include "cobalt/browser/memory_settings/pretty_print.h" #include <algorithm> +#include <map> #include <sstream> #include <string> #include <vector> @@ -36,77 +37,206 @@ namespace browser { namespace memory_settings { -scoped_ptr<MemorySetting> CreateMemorySetting( - MemorySetting::ClassType class_type, MemorySetting::SourceType source_type, - const std::string& name, const std::string& value) { - scoped_ptr<MemorySetting> setting; +class TestSettingGroup { + public: + TestSettingGroup() {} - switch (class_type) { - case MemorySetting::kInt: { - setting.reset(new IntSetting(name)); - break; - } - case MemorySetting::kDimensions: { - setting.reset(new DimensionSetting(name)); - break; - } - default: { - EXPECT_TRUE(false) << "Unexpected type " << class_type; - setting.reset(new IntSetting(name)); - break; + void LoadDefault() { + MakeSetting(MemorySetting::kInt, MemorySetting::kCmdLine, + MemorySetting::kGPU, switches::kImageCacheSizeInBytes, "1234"); + + MakeSetting(MemorySetting::kInt, MemorySetting::kAutoSet, + MemorySetting::kCPU, switches::kJavaScriptGcThresholdInBytes, + "1112"); + + MakeSetting(MemorySetting::kDimensions, MemorySetting::kCmdLine, + MemorySetting::kGPU, switches::kSkiaTextureAtlasDimensions, + "1234x4567"); + + MakeSetting(MemorySetting::kInt, MemorySetting::kCmdLine, + MemorySetting::kGPU, switches::kSkiaCacheSizeInBytes, + "12345678"); + + MakeSetting(MemorySetting::kInt, MemorySetting::kBuildSetting, + MemorySetting::kNotApplicable, + switches::kSoftwareSurfaceCacheSizeInBytes, "8910"); + } + + ~TestSettingGroup() { + for (ConstIter it = map_.begin(); it != map_.end(); ++it) { + delete it->second; } } - EXPECT_TRUE(setting->TryParseValue(source_type, value)); - return setting.Pass(); + + // The memory setting is owned internally. + void MakeSetting(MemorySetting::ClassType class_type, + MemorySetting::SourceType source_type, + MemorySetting::MemoryType memory_type, + const std::string& name, const std::string& value) { + const bool found = (map_.find(name) != map_.end()); + + ASSERT_FALSE(found); + map_[name] = + CreateMemorySetting(class_type, source_type, memory_type, name, value); + } + + std::vector<const MemorySetting*> AsConstVector() const { + std::vector<const MemorySetting*> output; + for (ConstIter it = map_.begin(); it != map_.end(); ++it) { + output.push_back(it->second); + } + return output; + } + + private: + static MemorySetting* CreateMemorySetting( + MemorySetting::ClassType class_type, + MemorySetting::SourceType source_type, + MemorySetting::MemoryType memory_type, const std::string& name, + const std::string& value) { + MemorySetting* memory_setting = NULL; + switch (class_type) { + case MemorySetting::kInt: { + memory_setting = new IntSetting(name); + break; + } + case MemorySetting::kDimensions: { + memory_setting = new DimensionSetting(name); + break; + } + default: { + EXPECT_TRUE(false) << "Unexpected type " << class_type; + memory_setting = new IntSetting(name); + break; + } + } + EXPECT_TRUE(memory_setting->TryParseValue(source_type, value)); + memory_setting->set_memory_type(memory_type); + return memory_setting; + } + + typedef std::map<std::string, MemorySetting*>::const_iterator ConstIter; + std::map<std::string, MemorySetting*> map_; +}; + +TEST(MemorySettingsPrettyPrint, GeneratePrettyPrintTable) { + TestSettingGroup setting_group; + setting_group.LoadDefault(); + std::string actual_string = + GeneratePrettyPrintTable(setting_group.AsConstVector()); + + const char* expected_string = + " NAME VALUE TYPE SOURCE \n" + " _______________________________________________________________________________ \n" + "| | | | | |\n" + "| image_cache_size_in_bytes | 1234 | 0.0 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| javascript_gc_threshold_in_bytes | 1112 | 0.0 MB | CPU | AutoSet |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| skia_atlas_texture_dimensions | 1234x4567x2 | 10.7 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| skia_cache_size_in_bytes | 12345678 | 11.8 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| software_surface_cache_size_in_bytes | N/A | N/A | N/A | N/A |\n" + "|______________________________________|_____________|_________|______|_________|\n"; + + EXPECT_STREQ(expected_string, actual_string.c_str()); +} + +TEST(MemorySettingsPrettyPrint, GenerateMemoryTableWithNoGpuMemory) { + const base::optional<int64_t> no_gpu_memory; + std::string actual_output = + GenerateMemoryTable(256 * 1024 * 1024, // 256 MB CPU available + no_gpu_memory, + 128 * 1024 * 1024, // 128 MB CPU consumption + 0); // 0 MB GPU consumption. + + const char* expected_output = + " TYPE TOTAL SETTINGS \n" + " _____________________________ \n" + "| | | |\n" + "| CPU | 256.0 MB | 128.0 MB |\n" + "|______|___________|__________|\n" + "| | | |\n" + "| GPU | <UNKNOWN> | 0.0 MB |\n" + "|______|___________|__________|\n"; + + EXPECT_STREQ(expected_output, actual_output.c_str()) << actual_output; +} + +TEST(MemorySettingsPrettyPrint, GenerateMemoryTableWithGpuMemory) { + std::string actual_output = + GenerateMemoryTable(256 * 1024 * 1024, // 256 MB CPU available. + 64 * 1024 * 1024, // 64 MB GPU available. + 128 * 1024 * 1024, // 128 MB CPU consumption. + 23592960); // 22.5 MB GPU consumption. + + const char* expected_output = + " TYPE TOTAL SETTINGS \n" + " ____________________________ \n" + "| | | |\n" + "| CPU | 256.0 MB | 128.0 MB |\n" + "|______|__________|__________|\n" + "| | | |\n" + "| GPU | 64.0 MB | 22.5 MB |\n" + "|______|__________|__________|\n"; + + EXPECT_STREQ(expected_output, actual_output.c_str()) << actual_output; } TEST(MemorySettingsPrettyPrint, ToString) { - std::vector<const MemorySetting*> memory_settings_ptr; - scoped_ptr<MemorySetting> image_cache_setting = - CreateMemorySetting(MemorySetting::kInt, MemorySetting::kCmdLine, - switches::kImageCacheSizeInBytes, "1234"); - memory_settings_ptr.push_back(image_cache_setting.get()); + TestSettingGroup test_setting_group; + test_setting_group.LoadDefault(); - scoped_ptr<MemorySetting> js_gc_setting = - CreateMemorySetting(MemorySetting::kInt, MemorySetting::kAutoSet, - switches::kJavaScriptGcThresholdInBytes, "1112"); - memory_settings_ptr.push_back(js_gc_setting.get()); + std::string actual_string = GeneratePrettyPrintTable( + test_setting_group.AsConstVector()); - scoped_ptr<MemorySetting> skia_texture_setting = - CreateMemorySetting(MemorySetting::kDimensions, MemorySetting::kCmdLine, - switches::kSkiaTextureAtlasDimensions, "1234x4567"); - memory_settings_ptr.push_back(skia_texture_setting.get()); + const char* expected_string = + " NAME VALUE TYPE SOURCE \n" + " _______________________________________________________________________________ \n" + "| | | | | |\n" + "| image_cache_size_in_bytes | 1234 | 0.0 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| javascript_gc_threshold_in_bytes | 1112 | 0.0 MB | CPU | AutoSet |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| skia_atlas_texture_dimensions | 1234x4567x2 | 10.7 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| skia_cache_size_in_bytes | 12345678 | 11.8 MB | GPU | CmdLine |\n" + "|______________________________________|_____________|_________|______|_________|\n" + "| | | | | |\n" + "| software_surface_cache_size_in_bytes | N/A | N/A | N/A | N/A |\n" + "|______________________________________|_____________|_________|______|_________|\n"; - scoped_ptr<MemorySetting> skia_cache_setting = - CreateMemorySetting(MemorySetting::kInt, MemorySetting::kNotApplicable, - switches::kSkiaCacheSizeInBytes, "0"); - memory_settings_ptr.push_back(skia_cache_setting.get()); + EXPECT_STREQ(expected_string, actual_string.c_str()) << actual_string; +} - scoped_ptr<MemorySetting> software_surface_setting = - CreateMemorySetting(MemorySetting::kInt, MemorySetting::kBuildSetting, - switches::kSoftwareSurfaceCacheSizeInBytes, "8910"); - memory_settings_ptr.push_back(software_surface_setting.get()); +TEST(MemorySettingsPrettyPrint, GenerateMemoryWithInvalidGpuMemoryConsumption) { + const base::optional<int64_t> no_gpu_memory; + std::string actual_output = GenerateMemoryTable( + 256 * 1024 * 1024, // 256 MB CPU available. + no_gpu_memory, // Signals that no gpu memory is available + // on this system. + 128 * 1024 * 1024, // 128 MB CPU consumption. + 16 * 1024 * 1024); // 16 MB GPU consumption. - std::string actual_string = GeneratePrettyPrintTable(memory_settings_ptr); + const char* expected_output = + " TYPE TOTAL SETTINGS \n" + " _____________________________ \n" + "| | | |\n" + "| CPU | 256.0 MB | 128.0 MB |\n" + "|______|___________|__________|\n" + "| | | |\n" + "| GPU | <UNKNOWN> | 16.0 MB |\n" + "|______|___________|__________|\n"; - std::string expected_string = - "NAME VALUE SOURCE \n" - "+--------------------------------------+-----------+--------------+\n" - "| image_cache_size_in_bytes | 1234 | CmdLine |\n" - "+--------------------------------------+-----------+--------------+\n" - "| javascript_gc_threshold_in_bytes | 1112 | AutoSet |\n" - "+--------------------------------------+-----------+--------------+\n" - "| skia_atlas_texture_dimensions | 1234x4567 | CmdLine |\n" - "+--------------------------------------+-----------+--------------+\n" - "| skia_cache_size_in_bytes | 0 | N/A |\n" - "+--------------------------------------+-----------+--------------+\n" - "| software_surface_cache_size_in_bytes | 8910 | BuildSetting |\n" - "+--------------------------------------+-----------+--------------+\n"; - - const bool strings_matched = (expected_string == actual_string); - EXPECT_TRUE(strings_matched) << "Strings Mismatched:\n\n" - << "Actual:\n" << actual_string << "\n" - << "Expected:\n" << expected_string << "\n"; + EXPECT_STREQ(expected_output, actual_output.c_str()) << actual_output; } } // namespace memory_settings
diff --git a/src/cobalt/browser/memory_settings/table_printer.cc b/src/cobalt/browser/memory_settings/table_printer.cc new file mode 100644 index 0000000..ee85579 --- /dev/null +++ b/src/cobalt/browser/memory_settings/table_printer.cc
@@ -0,0 +1,300 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cobalt/browser/memory_settings/table_printer.h" + +#include <algorithm> +#include <iomanip> +#include <sstream> +#include <string> + +#include "base/logging.h" + +namespace cobalt { +namespace browser { +namespace memory_settings { +namespace { + +std::string AddColor(TablePrinter::Color color, const std::string& value) { + const char* RED_START = "\x1b[31m"; + const char* GREEN_START = "\x1b[32m"; + const char* YELLOW_START = "\x1b[33m"; + const char* BLUE_START = "\x1b[34m"; + const char* MAGENTA_START = "\x1b[35m"; + const char* CYAN_START = "\x1b[36m"; + + const char* COLOR_END = "\x1b[0m"; + + if (color == TablePrinter::kDefault) { + return value; + } + + std::stringstream ss; + switch (color) { + case TablePrinter::kRed: { ss << RED_START; break; } + case TablePrinter::kGreen: { ss << GREEN_START; break; } + case TablePrinter::kYellow: { ss << YELLOW_START; break; } + case TablePrinter::kBlue: { ss << BLUE_START; break; } + case TablePrinter::kMagenta: { ss << MAGENTA_START; break; } + case TablePrinter::kCyan: { ss << CYAN_START; break; } + case TablePrinter::kDefault: { DCHECK(false) << "Unexpected"; break; } + } + + ss << value; + ss << COLOR_END; + return ss.str(); +} + +class TablePrinterImpl { + public: + // First row is the header. + typedef std::vector<std::string> Row; + // table[i] gets row, table[i][j] gets row/col + typedef std::vector<Row> Table; + static std::string ToString(const Table& table, + TablePrinter::Color text_color, + TablePrinter::Color table_color); + + private: + static bool CheckNotEmptyAndAllColumnsTheSame(const Table& rows); + static std::vector<size_t> MakeColumnSizeVector(const Table& table); + static size_t ColumnPrintSize(const Table& table, size_t which_col); + TablePrinterImpl(const std::vector<size_t>& column_sizes, + TablePrinter::Color text_color, + TablePrinter::Color table_printer); + + // " col1 col2 " + std::string MakeHeaderRow(const Row& header_row) const; + + // ex: "| value1 | value2 |" + std::string MakeDataRow(const Row& row) const; + + // ex: "|________|________|" + std::string MakeRowDelimiter() const; + + // Follows a data row to provide verticle space before a TopSeperatorRow(). + // ex: "| | |" + std::string MakeTopSeperatorRowAbove() const; + + // ex: " _________________ " + std::string MakeTopSeperatorRow() const; + + const std::vector<size_t>& column_sizes_; + const TablePrinter::Color text_color_; + const TablePrinter::Color table_color_; +}; + +std::string TablePrinterImpl::ToString(const Table& rows, + TablePrinter::Color text_color, + TablePrinter::Color table_color) { + if (!CheckNotEmptyAndAllColumnsTheSame(rows)) { + std::string error_msg = "ERROR - NOT ALL COLUMNS ARE THE SAME"; + DCHECK(false) << error_msg; + return error_msg; + } + + std::vector<size_t> column_sizes = MakeColumnSizeVector(rows); + TablePrinterImpl printer(column_sizes, text_color, table_color); + + std::stringstream output_ss; + output_ss << printer.MakeHeaderRow(rows[0]) << "\n"; + output_ss << printer.MakeTopSeperatorRow() << "\n"; + + std::string seperator_row_above = printer.MakeTopSeperatorRowAbove(); + std::string row_delimiter = printer.MakeRowDelimiter(); + + // Print body. + for (size_t i = 1; i < rows.size(); ++i) { + const Row& row = rows[i]; + + const std::string row_string = printer.MakeDataRow(row); + + output_ss << seperator_row_above << "\n"; + output_ss << row_string << "\n"; + output_ss << row_delimiter << "\n"; + } + return output_ss.str(); +} + +bool TablePrinterImpl::CheckNotEmptyAndAllColumnsTheSame(const Table& rows) { + if (rows.empty()) { + return false; + } + size_t num_columns = rows[0].size(); + for (size_t i = 1; i < rows.size(); ++i) { + if (num_columns != rows[i].size()) { + return false; + } + } + return true; +} + +// Given an input of rows, compute a column size vector. Each column size +// is the MAX of all the same columns sizes, +2. The +2 will account for +// padding on either side of the token during stringification. +// Example: +// std::vector<Row> rows; +// Row row; +// row.push_back("first_column"); +// row.push_back("second_column"); +// rows.push_back(row); +// Row row2; +// row2.push_back("first_column-2"); +// row2.push_back("second_column-2"); +// rows.push_back(row2); +// std::vector<size_t> column_sizes = MakeColumnSizeVector(rows); +// EXPECT_EQ(2, column_sizes.size()); +// EXPECT_EQ(16, column_sizes[0]); // "first_column-2".size() + 2 +// EXPECT_EQ(17, column_sizes[1]); // "second_column-2".size() + 2 +std::vector<size_t> TablePrinterImpl::MakeColumnSizeVector(const Table& table) { + DCHECK(!table.empty()); + const size_t num_cols = table[0].size(); + std::vector<size_t> column_sizes; + + for (size_t i = 0; i < num_cols; ++i) { + column_sizes.push_back(ColumnPrintSize(table, i)); + } + return column_sizes; +} + +size_t TablePrinterImpl::ColumnPrintSize(const Table& table, size_t which_col) { + size_t max_col_size = 0; + for (size_t i = 0; i < table.size(); ++i) { + size_t curr_col_size = table[i][which_col].size(); + max_col_size = std::max<size_t>(max_col_size, curr_col_size); + } + return max_col_size + 2; // +2 for padding on either side. +} + +TablePrinterImpl::TablePrinterImpl(const std::vector<size_t>& column_sizes, + TablePrinter::Color text_color, + TablePrinter::Color table_printer) + : column_sizes_(column_sizes), text_color_(text_color), + table_color_(table_printer) {} + +std::string TablePrinterImpl::MakeHeaderRow(const Row& header_row) const { + std::stringstream ss; + + for (size_t i = 0; i < header_row.size(); ++i) { + ss << " " << header_row[i]; + const size_t name_size = header_row[i].size(); + const size_t col_width = column_sizes_[i]; + + DCHECK_LT(name_size, col_width); + + for (size_t j = 0; j < col_width - name_size; ++j) { + ss << " "; + } + } + ss << " "; + std::string output = AddColor(text_color_, ss.str()); + return output; +} + +std::string TablePrinterImpl::MakeDataRow(const Row& row) const { + std::stringstream output_ss; + + const std::string vertical_bar = AddColor(table_color_, "|"); + + for (size_t i = 0; i < row.size(); ++i) { + std::stringstream token_ss; + token_ss << " "; // Padding + token_ss << row[i]; + token_ss << " "; + + std::string token = token_ss.str(); + + std::stringstream row_ss; + const int col_size = static_cast<int>(column_sizes_[i]); + row_ss << vertical_bar; + row_ss << std::setfill(' '); + row_ss << std::setw(col_size); + if (i == 0) { + row_ss << std::left; // Left justification for first column. + } else { + row_ss << std::right; // Right justification for all other columns. + } + + row_ss << AddColor(text_color_, token); + output_ss << row_ss.str(); + } + output_ss << vertical_bar; + return output_ss.str(); +} + +std::string TablePrinterImpl::MakeRowDelimiter() const { + std::stringstream ss; + for (size_t i = 0; i < column_sizes_.size(); ++i) { + ss << "|"; + const size_t col_width = column_sizes_[i]; + for (size_t j = 0; j < col_width; ++j) { + ss << "_"; + } + } + ss << "|"; + + std::string output = AddColor(table_color_, ss.str()); + return output; +} + +std::string TablePrinterImpl::MakeTopSeperatorRow() const { + std::stringstream ss; + for (size_t i = 0; i < column_sizes_.size(); ++i) { + if (i == 0) { + ss << " "; + } else { + ss << "_"; + } + const size_t col_width = column_sizes_[i]; + for (size_t j = 0; j < col_width; ++j) { + ss << "_"; + } + } + ss << " "; + std::string output = AddColor(table_color_, ss.str()); + return output; +} + +std::string TablePrinterImpl::MakeTopSeperatorRowAbove() const { + std::stringstream ss; + for (size_t i = 0; i < column_sizes_.size(); ++i) { + ss << "|"; + const size_t col_width = column_sizes_[i]; + for (size_t j = 0; j < col_width; ++j) { + ss << " "; + } + } + ss << "|"; + std::string output = AddColor(table_color_, ss.str()); + return output; +} + +} // namespace. + +TablePrinter::TablePrinter() : text_color_(kDefault), table_color_(kDefault) { +} + +void TablePrinter::AddRow(const TablePrinter::Row& row) { + table_.push_back(row); +} + +std::string TablePrinter::ToString() const { + return TablePrinterImpl::ToString(table_, text_color_, table_color_); +} + +} // namespace memory_settings +} // namespace browser +} // namespace cobalt
diff --git a/src/cobalt/browser/memory_settings/table_printer.h b/src/cobalt/browser/memory_settings/table_printer.h new file mode 100644 index 0000000..29d1d0f --- /dev/null +++ b/src/cobalt/browser/memory_settings/table_printer.h
@@ -0,0 +1,75 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COBALT_BROWSER_MEMORY_SETTINGS_TABLE_PRINTER_H_ +#define COBALT_BROWSER_MEMORY_SETTINGS_TABLE_PRINTER_H_ + +#include <string> +#include <vector> + +namespace cobalt { +namespace browser { +namespace memory_settings { + +// TablePrinter takes in rows of strings and then converts them into +// an ascii table that can be used to visualize information on stdout. +// Example: +// table.AddRow({"col1", "col2"}); +// table.AddRow({"value1", "value2"}); +// std::cout << table.ToString(); +// +// --> outputs --> +// +// "col1 col2 \n" +// "+--------+--------+\n" +// "| value1 | value2 |\n" +// "+--------+--------+\n"; +class TablePrinter { + public: + enum Color { + kDefault, + kRed, + kGreen, + kYellow, + kBlue, + kMagenta, + kCyan + }; + + typedef std::vector<std::string> Row; + TablePrinter(); + + void AddRow(const Row& row); + std::string ToString() const; + + // Adds color to the string output. kDefault will omit any color value and + // just do straight text. + // Note: If SbLogIsTty() returns false then color output is disabled and its + // recommended that these functions are not called. + void set_text_color(Color text_color) { text_color_ = text_color; } + void set_table_color(Color table_color) { table_color_ = table_color; } + + private: + std::vector<Row> table_; + Color text_color_; + Color table_color_; +}; + +} // namespace memory_settings +} // namespace browser +} // namespace cobalt + +#endif // COBALT_BROWSER_MEMORY_SETTINGS_TABLE_PRINTER_H_
diff --git a/src/cobalt/browser/memory_settings/table_printer_test.cc b/src/cobalt/browser/memory_settings/table_printer_test.cc new file mode 100644 index 0000000..f03250f --- /dev/null +++ b/src/cobalt/browser/memory_settings/table_printer_test.cc
@@ -0,0 +1,90 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cobalt/browser/memory_settings/table_printer.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace cobalt { +namespace browser { +namespace memory_settings { + +#define RED_START "\x1b[31m" +#define GREEN_START "\x1b[32m" +#define COLOR_END "\x1b[0m" + +std::vector<std::string> MakeRow2(const std::string& col1, + const std::string& col2) { + std::vector<std::string> row; + row.push_back(col1); + row.push_back(col2); + return row; +} + +TEST(TablePrinter, ToString) { + TablePrinter table; + + // Add header. + table.AddRow(MakeRow2("col1", "col2")); + table.AddRow(MakeRow2("value1", "value2")); + + std::string table_str = table.ToString(); + std::string expected_table_str = + " col1 col2 \n" + " _________________ \n" + "| | |\n" + "| value1 | value2 |\n" + "|________|________|\n"; + + EXPECT_STREQ(expected_table_str.c_str(), table_str.c_str()); +} + +TEST(TablePrinter, ToStringWithColor) { + TablePrinter table; + + // Adds color to table. + table.set_text_color(TablePrinter::kRed); + table.set_table_color(TablePrinter::kGreen); + + // Add header. + table.AddRow(MakeRow2("col1", "col2")); + table.AddRow(MakeRow2("value1", "value2")); + + // These defines will wrap color constants for string literals. +#define R(STR) RED_START STR COLOR_END +#define G(STR) GREEN_START STR COLOR_END + + std::string table_str = table.ToString(); + std::string expected_table_str = + R(" col1 col2 ") "\n" + G(" _________________ ") "\n" + G("| | |") "\n" + G("|") R(" value1 ") G("|") R(" value2 ") G("|") "\n" + G("|________|________|") "\n"; + +#undef R +#undef G + + EXPECT_STREQ(expected_table_str.c_str(), table_str.c_str()); +} + +#undef RED_START +#undef GREEN_START +#undef COLOR_END + +} // namespace memory_settings +} // namespace browser +} // namespace cobalt
diff --git a/src/cobalt/browser/memory_settings/test_common.h b/src/cobalt/browser/memory_settings/test_common.h new file mode 100644 index 0000000..7e489ff --- /dev/null +++ b/src/cobalt/browser/memory_settings/test_common.h
@@ -0,0 +1,49 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COBALT_BROWSER_MEMORY_SETTINGS_TEST_COMMON_H_ +#define COBALT_BROWSER_MEMORY_SETTINGS_TEST_COMMON_H_ + +#include <sstream> +#include <string> + +#include "cobalt/browser/memory_settings/texture_dimensions.h" +#include "cobalt/math/size.h" +#include "testing/gtest/include/gtest/gtest.h" + +// PrintToString() provides the proper functionality to pretty print custom +// types. +namespace testing { + +template <> +inline ::std::string PrintToString(const cobalt::math::Size& value) { + ::std::stringstream ss; + ss << "math::Size(" << value.width() << ", " << value.height() << ")"; + return ss.str(); +} + +template <> +inline ::std::string PrintToString( + const cobalt::browser::memory_settings::TextureDimensions& value) { + ::std::stringstream ss; + ss << "TextureDimensions(" << value.width() << "x" << value.height() << "x" + << value.bytes_per_pixel() << ")"; + return ss.str(); +} + +} // namespace testing + +#endif // COBALT_BROWSER_MEMORY_SETTINGS_TEST_COMMON_H_
diff --git a/src/cobalt/browser/memory_settings/texture_dimensions.h b/src/cobalt/browser/memory_settings/texture_dimensions.h new file mode 100644 index 0000000..0e6b9f7 --- /dev/null +++ b/src/cobalt/browser/memory_settings/texture_dimensions.h
@@ -0,0 +1,70 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COBALT_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_ +#define COBALT_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_ + +#include "starboard/types.h" + +namespace cobalt { +namespace browser { +namespace memory_settings { + +class TextureDimensions { + public: + TextureDimensions() : width_(), height_(), bytes_per_pixel_() {} + TextureDimensions(int w, int h, int d) + : width_(w), height_(h), bytes_per_pixel_(d) {} + TextureDimensions(const TextureDimensions& other) + : width_(other.width_), + height_(other.height_), + bytes_per_pixel_(other.bytes_per_pixel_) {} + + bool operator==(const TextureDimensions& other) const { + return width_ == other.width_ && height_ == other.height_ && + bytes_per_pixel_ == other.bytes_per_pixel_; + } + + bool operator!=(const TextureDimensions& other) const { + return !(*this == other); + } + + int width() const { return width_; } + int height() const { return height_; } + int bytes_per_pixel() const { return bytes_per_pixel_; } + + int64_t TotalBytes() const { + int64_t out = width_; + out *= height_; + out *= bytes_per_pixel_; + return out; + } + + void set_width(int width) { width_ = width; } + void set_height(int height) { height_ = height; } + void set_bytes_per_pixel(int bpp) { bytes_per_pixel_ = bpp; } + + private: + int width_; + int height_; + int bytes_per_pixel_; +}; + +} // namespace memory_settings +} // namespace browser +} // namespace cobalt + +#endif // COBALT_BROWSER_MEMORY_SETTINGS_TEXTURE_DIMENSIONS_H_
diff --git a/src/cobalt/browser/web_module.cc b/src/cobalt/browser/web_module.cc index f9cfc51..5087c2d 100644 --- a/src/cobalt/browser/web_module.cc +++ b/src/cobalt/browser/web_module.cc
@@ -493,7 +493,7 @@ base::Bind(&WebModule::Impl::OnRanAnimationFrameCallbacks, base::Unretained(this)), data.window_close_callback, data.window_minimize_callback, - data.system_window_, data.options.input_poller, + data.system_window_, data.options.camera_3d, media_session_client_->GetMediaSession(), data.options.csp_insecure_allowed_token, data.dom_max_element_depth); DCHECK(window_);
diff --git a/src/cobalt/browser/web_module.h b/src/cobalt/browser/web_module.h index 0054f19..3e29f72 100644 --- a/src/cobalt/browser/web_module.h +++ b/src/cobalt/browser/web_module.h
@@ -165,9 +165,8 @@ // default value is base::kThreadPriority_Low. base::ThreadPriority animated_image_decode_thread_priority; - // InputPoller to use for constantly polling the input key position or - // state. For example, this is used to support 3D camera movements. - scoped_refptr<input::InputPoller> input_poller; + // To support 3D camera movements. + scoped_refptr<input::Camera3D> camera_3d; script::JavaScriptEngine::Options javascript_options; };
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id index aa6da0c..86bfd59 100644 --- a/src/cobalt/build/build.id +++ b/src/cobalt/build/build.id
@@ -1 +1 @@ -49488 \ No newline at end of file +51583 \ No newline at end of file
diff --git a/src/cobalt/build/config/base.gypi b/src/cobalt/build/config/base.gypi index cc21f05..339b511 100644 --- a/src/cobalt/build/config/base.gypi +++ b/src/cobalt/build/config/base.gypi
@@ -45,17 +45,19 @@ # recommended that 'local_font_cache_size_in_bytes' be # increased to 24MB when using this package to account for # the extra memory required by bold CJK. This package is - # ~46.2MB. - # 'standard' -- The default package. It includes all non-CJK fallback - # fonts in both 'normal' and 'bold' weights, 'normal' weight - # CJK ('bold' weight CJK is synthesized from it), and all - # FCC fonts. This package is ~26.9MB. + # ~48.7MB. + # 'standard' -- The default package. It includes all sans-serif, serif, + # and FCC fonts, non-CJK fallback fonts in both 'normal' and + # 'bold' weights, and 'normal' weight CJK ('bold' weight CJK + # is synthesized from it). This package is ~29.4MB. # 'limited_with_jp' -- A significantly smaller package than 'standard'. - # This package removes the 'bold' weighted non-CJK fallback - # fonts (the 'normal' weight is still included and is used - # to synthesize bold), removes the FCC fonts (which must be - # downloaded from the web), and replaces standard CJK with - # low quality CJK. However, higher quality Japanese is still + # This package removes all but 'normal' and 'bold' weighted + # sans-serif and serif, removes the FCC fonts (which must be + # provided by the system or downloaded from the web), + # removes the 'bold' weighted non-CJK fallback fonts (the + # 'normal' weight is still included and is used to + # synthesize bold), and replaces standard CJK with low + # quality CJK. However, higher quality Japanese is still # included. Because low quality CJK cannot synthesize bold, # bold glyphs are unavailable in Chinese and Korean. This # package is ~10.9MB. @@ -68,7 +70,8 @@ # is ~7.7MB. # 'minimal' -- The smallest possible font package. It only includes # Roboto's Basic Latin characters. Everything else must be - # downloaded from the web. This package is ~16.4KB. + # provided by the system or downloaded from the web. This + # package is ~16.4KB. # NOTE: When bold is needed, but unavailable, it is typically synthesized, # resulting in lower quality glyphs than those generated directly from # a bold font. However, this does not occur with low quality CJK,
diff --git a/src/cobalt/build/gyp_cobalt b/src/cobalt/build/gyp_cobalt index 69180fb..e83ef44 100755 --- a/src/cobalt/build/gyp_cobalt +++ b/src/cobalt/build/gyp_cobalt
@@ -239,7 +239,7 @@ full_starboard_path = platforms[platform] assert full_starboard_path[:len(source_tree_dir)] == source_tree_dir starboard_path = full_starboard_path[len(source_tree_dir) + 1:] - starboard_path.replace(os.sep, '/') + starboard_path = starboard_path.replace(os.sep, '/') assert starboard_path[0] not in [ os.sep, os.altsep ] variables['starboard_path'] = starboard_path _AppendVariables(variables, self.common_args)
diff --git a/src/cobalt/content/fonts/README.md b/src/cobalt/content/fonts/README.md index 3bd0d89..1181646 100644 --- a/src/cobalt/content/fonts/README.md +++ b/src/cobalt/content/fonts/README.md
@@ -1,16 +1,34 @@ -## Description +# Fonts -This directory contains fonts that can be packaged with Cobalt. +By default, Cobalt includes a robust set of fonts that support most characters +encountered around the world. While this will likely meet many porters' needs, +the font system is also extremely configurable when desired. -## How to use +It can be configured in the following ways: + 1. The porter can select from a variety of font packages that Cobalt offers + and then override specific sections of those packages to add or remove + additional fonts. + 2. The porter can use system fonts to complement or even replace Cobalt's + fonts. However, it is important to note that, given the extensive language + support that Cobalt provides in its font packages, care should be taken + when replacing Cobalt's fonts to not significantly degrade that support. + +Both font packages and system fonts are described in more detail below. + +## Font Packages + +While the fonts included in Cobalt's default font package should work well in +most cases, Cobalt offers the ability to customize the fonts included in builds +through package profile selection and package overrides. + +### How to use To use this: - -1. Select one of the packages below. -2. Add a variable named `cobalt_font_package` in your platform's - `gyp_configuration.gypi` file. -3. Optional: Add package overrides, which can be used to add or remove fonts - from the package. + 1. Select one of the package profiles below. + 2. Add a variable named `cobalt_font_package` in your platform's + `gyp_configuration.gypi` file. + 3. Optional: Add package overrides, which can be used to add or remove fonts + from the package. Example: This example uses the 'limited' package, but overrides it to include bold @@ -22,16 +40,16 @@ 'cobalt_font_package_override_fallback_lang_cjk_low_quality': 0, } -## Packages +### Package Profiles * 'expanded' -- The largest package. It includes everything in the 'standard' package, along with 'bold' weight CJK. It is recommended that 'local_font_cache_size_in_bytes' be increased to 24MB when using this package to account for the extra memory required by - bold CJK. This package is ~46.2MB. + bold CJK. This package is ~48.7MB. Package category values: 'package_named_sans_serif': 4, - 'package_named_serif': 4, + 'package_named_serif': 3, 'package_named_fcc_fonts': 2, 'package_fallback_lang_non_cjk': 2, 'package_fallback_lang_cjk': 2, @@ -40,13 +58,13 @@ 'package_fallback_emoji': 1, 'package_fallback_symbols': 1, -* 'standard' -- The default package. It includes all non-CJK fallback fonts in - both 'normal' and 'bold' weights, 'normal' weight CJK ('bold' - weight CJK is synthesized from it), and all FCC fonts. This - package is ~26.9MB. +* 'standard' -- The default package. It includes all sans-serif, serif, and FCC + fonts, non-CJK fallback fonts in both 'normal' and 'bold' + weights, and 'normal' weight CJK ('bold' weight CJK is + synthesized from it). This package is ~29.4MB. Package category values: - 'package_named_sans_serif': 3, + 'package_named_sans_serif': 4, 'package_named_serif': 3, 'package_named_fcc_fonts': 2, 'package_fallback_lang_non_cjk': 2, @@ -57,13 +75,15 @@ 'package_fallback_symbols': 1, * 'limited_with_jp' -- A significantly smaller package than 'standard'. This - package removes the 'bold' weighted non-CJK fallback fonts (the - 'normal' weight is still included and is used to synthesize - bold), removes the FCC fonts (which must be downloaded from the - web), and replaces standard CJK with low quality CJK. However, - higher quality Japanese is still included. Because low quality - CJK cannot synthesize bold, bold glyphs are unavailable in - Chinese and Korean. This package is ~10.9MB. + package removes all but 'normal' and 'bold' weighted sans-serif + and serif, removes the FCC fonts (which must be provided by the + system or downloaded from the web), removes the 'bold' weighted + non-CJK fallback fonts (the 'normal' weight is still included + and is used to synthesize bold), and replaces standard CJK with + low quality CJK. However, higher quality Japanese is still + included. Because low quality CJK cannot synthesize bold, bold + glyphs are unavailable in Chinese and Korean. This package is + ~10.9MB. Package category values: 'package_named_sans_serif': 2, @@ -95,8 +115,8 @@ 'package_fallback_symbols': 1, * 'minimal' -- The smallest possible font package. It only includes Roboto's - Basic Latin characters. Everything else must be downloaded from - the web. This package is ~16.4KB. + Basic Latin characters. Everything else must be provided by the + system or downloaded from the web. This package is ~16.4KB. Package category values: 'package_named_sans_serif': 0, @@ -116,8 +136,8 @@ weight. -## Package font categories -Each package contains values for the following categories, which specifies the +### Package Font Categories +Each package contains values for the following categories, which specify the fonts from each category included within the package: * 'package_named_sans_serif': Named sans-serif fonts. @@ -151,7 +171,7 @@ Symbol-related fallback fonts. -## Package font category values +### Package Font Category Values The following explains the meaning behind the values that packages use for each of the font categories: * 0 -- No fonts from the specified category are included. @@ -165,7 +185,7 @@ include additional weights beyond 'normal' and 'bold'. -## Overriding packages +### Overriding Packages Font package overrides can be used to modify the files included within the selected package. The following override values are available for each font category: @@ -185,7 +205,7 @@ beyond 'normal' and 'bold'. -## Override mappings +### Override Package Mappings The mapping between the override category name and the package category name: * 'cobalt_font_package_override_named_sans_serif' ==> 'package_named_sans_serif' @@ -205,3 +225,37 @@ 'package_fallback_emoji' * 'cobalt_font_package_override_fallback_symbols' ==> 'package_fallback_symbols' + + +## System Fonts + +Beyond simply providing the ability to configure the fonts that are included +within its package, Cobalt supports the use of system fonts. + +### Starboard System Font Paths + +In order to enable system fonts, within SbSystemGetPath() porters must provide +paths for kSbSystemPathFontDirectory, which contains the system font files, and +for kSbSystemPathFontConfigurationDirectory, which contains the system font +configuration file. These directories may be the same. + +### System Font Configuration File + +In addition to providing the directory paths, porters must implement a fonts.xml +configuration file, which describes the system fonts that are available for use. + +The syntax of the system font configuration file is identical to that of +Cobalt's font configuration file, which can be used as a reference. The system +font configuration file can include both named font families and fallback font +families. However, system fonts shouldn't duplicate any family, alias, or font +names contained within Cobalt's font configuration, unless the corresponding +font files are stripped from Cobalt's font package. + +For example: if any of Cobalt's "sans-serif" font files are included in the +selected Cobalt font package, then the system font configuration cannot contain +a family named "sans-serif"; however, if Cobalt's "sans-serif" font files are +entirely stripped from the package, then the system may provide its own +"sans-serif" family without issues. + +For more information on creating a font configuration, see +[Cobalt's configuration file](config/common/fonts.xml).
diff --git a/src/cobalt/content/fonts/config/android/fonts.xml b/src/cobalt/content/fonts/config/android/fonts.xml new file mode 100644 index 0000000..451441d --- /dev/null +++ b/src/cobalt/content/fonts/config/android/fonts.xml
@@ -0,0 +1,412 @@ +<!-- + |============================================================================== + | OVERVIEW + | The font configuration files specify the local fonts available to Cobalt. + | They come in two flavors: + | 1. A required configuration file that Cobalt provides; it is loaded first + | and specifies the superset of all fonts that can be included within the + | Cobalt font package. + | 2. An optional configuration file that porters provide; it is loaded second + | and specifies the system fonts available for use. + | + | There are two types of font families that the configurations can define: + | named families and fallback families. + |============================================================================== + | NAMED FAMILIES + | Named families are families that can be retrieved by name during font + | matching. Providing a family with the optional "name" attribute makes it a + | named family. + | + | Additionally, the alias tag can be used when more than one name needs to be + | mapped to the same same family. The alias's "name" attribute specifies an + | alternate name for the family and its "to" attribute specifies the specific + | family that it maps to. There is no limit to the number of aliases that can + | map to the same family. However, it is important to note that duplicate names + | are not allowed between aliases and families; they must all be unique. + | + | As an example, see the alias mapping "fantasy" to "serif" below. Because of + | the alias, whenever the font-family "fantasy" is encountered, the "serif" + | family is returned. + | + | System fonts shouldn't duplicate any family, alias, or font names contained + | within Cobalt's font configuration, unless the corresponding font files are + | stripped from Cobalt's font package. + | + | For example: if any of Cobalt's "sans-serif" font files are included in the + | selected Cobalt font package, then the system font configuration cannot + | contain a family named "sans-serif"; however, if Cobalt's "sans-serif" font + | files are entirely stripped from the package, then the system may provide its + | own "sans-serif" family without issues. + |============================================================================== + | FALLBACK FAMILIES + | Fallback families are used when none of the named families within a + | "font-family" property are found to support a character. When this occurs, + | Cobalt searches the fallback families for a font that supports the character. + | + | Families are included as fallback families if one of two conditions are met: + | 1. They do not have a "name" attribute. + | 2. They have a "fallback_priority" attribute. + | This allows named families to also be fallback families when they are + | explicitly given a fallback priority. + | + | When the optional family attribute "fallback_priority" is included, then its + | value, which is an integer, dictates the fallback priority of the family. + | When it is not present, then the family is given the default priority of 0. + | + | Fallback families are chosen based on a match: full BCP-47 language tag + | including script, then just language with no script, and then all fonts are + | considered regardless of language. Within each of these, the highest priority + | family that satisfies the constraints and supports the character is chosen. + | If more than one family has the same fallback priority, then order of + | appearance within the xml document is the final tiebreaker. + | + | Cobalt families are loaded before system families and, as a result, always + | win the order of appearance fallback tiebreaker with system families. + | However, Cobalt fallback families all have the default fallback priority of + | 0; if it is desired that a system family be chosen before a Cobalt family + | during fallback, then this can be accomplished by giving it a priority + | greater than 0. + | + | The optional family attribute "pages" indicates which character pages are + | contained within the family. It is used with character fallback to allow the + | system to quickly determine that a character cannot appear in a font without + | requiring the full character map to be loaded into memory. Character pages + | are zero-indexed, and each page contains 256 characters, so character 1000 + | would be contained within page 3. + | + | For system families, it is safer not including "pages". When "pages" is + | included, the correct family may potentially be skipped if there is an error + | in the "pages" value. When "pages" is not included the correct fallback + | family is always selected. The cost of not including "pages" is that more + | full character maps will likely be loaded, which is a one-time performance + | hit per family, and results in a small increase in total memory usage. + |============================================================================== + | FONT ATTRIBUTES + | The optional font attributes "weight" and "style" are used to specify the + | weight and style that will be used during font matching within a family. + | "weight" must be a multiple of 100, between 100 and 900 inclusive; it + | defaults to 400 when not defined. + | "style" must have a value of either "normal" or "italic"; it defaults to + | "normal" when not defined. + | + | The optional font attributes "font_name" and "postscript_name" are used to + | allow the font to be matched during local src lookup with @font-face rules. + | https://www.w3.org/TR/css-fonts-3/#descdef-src + | + | The optional font attribute "disable_synthetic_bolding" prevents the font + | from being synthetically bolded. By default synthetic bolding is done when + | there is no bold font available and a bold weight (>500) is specified. + |============================================================================== + --> +<familyset version="1"> + <!-- first family is default --> + <family name="sans-serif"> + <font weight="100" style="normal" font_name="Roboto Thin" postscript_name="Roboto-Thin">Roboto-Thin.ttf</font> + <font weight="100" style="italic" font_name="Roboto Thin Italic" postscript_name="Roboto-Thin-Italic">Roboto-ThinItalic.ttf</font> + <font weight="300" style="normal" font_name="Roboto Light" postscript_name="Roboto-Light">Roboto-Light.ttf</font> + <font weight="300" style="italic" font_name="Roboto Light Italic" postscript_name="Roboto-Light-Italic">Roboto-LightItalic.ttf</font> + <font weight="400" style="normal" font_name="Roboto Regular" postscript_name="Roboto-Regular">Roboto-Regular.ttf</font> + <font weight="400" style="italic" font_name="Roboto Regular Italic" postscript_name="Roboto-Italic">Roboto-Italic.ttf</font> + <font weight="500" style="normal" font_name="Roboto Medium" postscript_name="Roboto-Medium">Roboto-Medium.ttf</font> + <font weight="500" style="italic" font_name="Roboto Medium Italic" postscript_name="Roboto-Medium-Italic">Roboto-MediumItalic.ttf</font> + <font weight="700" style="normal" font_name="Roboto Bold" postscript_name="Roboto-Bold">Roboto-Bold.ttf</font> + <font weight="700" style="italic" font_name="Roboto Bold Italic" postscript_name="Roboto-BoldItalic">Roboto-BoldItalic.ttf</font> + <font weight="900" style="normal" font_name="Roboto Black" postscript_name="Roboto-Black">Roboto-Black.ttf</font> + <font weight="900" style="italic" font_name="Roboto Black Italic" postscript_name="Roboto-Black-Italic">Roboto-BlackItalic.ttf</font> + </family> + <!-- Note that aliases must come after the fonts they reference. --> + <alias name="roboto" to="sans-serif" /> + <!-- This is the default font when Roboto is unavailable. --> + <family pages="0"> + <font weight="400" style="normal">Roboto-Regular-Subsetted.ttf</font> + </family> + <family name="sans-serif-condensed"> + <font weight="300" style="normal" font_name="Roboto Condensed Light" postscript_name="Roboto-Condensed-Light">RobotoCondensed-Light.ttf</font> + <font weight="300" style="italic" font_name="Roboto Condensed Light Italic" postscript_name="Roboto-Condensed-Light-Italic">RobotoCondensed-LightItalic.ttf</font> + <font weight="400" style="normal" font_name="Roboto Condensed Regular" postscript_name="Roboto-Condensed-Regular">RobotoCondensed-Regular.ttf</font> + <font weight="400" style="italic" font_name="Roboto Condensed Regular Italic" postscript_name="Roboto-Condensed-Regular-Italic">RobotoCondensed-Italic.ttf</font> + <font weight="700" style="normal" font_name="Roboto Condensed Bold" postscript_name="Roboto-Condensed-Bold">RobotoCondensed-Bold.ttf</font> + <font weight="700" style="italic" font_name="Roboto Condensed Bold Italic" postscript_name="Roboto-Condensed-Bold-Italic">RobotoCondensed-BoldItalic.ttf</font> + </family> + <family name="serif"> + <font weight="400" style="normal" font_name="Noto Serif" postscript_name="NotoSerif">NotoSerif-Regular.ttf</font> + <font weight="400" style="italic" font_name="Noto Serif Italic" postscript_name="NotoSerif-Italic">NotoSerif-Italic.ttf</font> + <font weight="700" style="normal" font_name="Noto Serif Bold" postscript_name="NotoSerif-Bold">NotoSerif-Bold.ttf</font> + <font weight="700" style="italic" font_name="Noto Serif Bold Italic" postscript_name="NotoSerif-BoldItalic">NotoSerif-BoldItalic.ttf</font> + </family> + <alias name="fantasy" to="serif" /> + <family name="monospace"> + <font weight="400" style="normal" font_name="Droid Sans Mono" postscript_name="DroidSansMono">DroidSansMono.ttf</font> + </family> + <alias name="sans-serif-monospace" to="monospace" /> + <family name="serif-monospace"> + <font weight="400" style="normal" font_name="Cutive Mono" postscript_name="CutiveMono-Regular">CutiveMono.ttf</font> + </family> + <family name="casual"> + <font weight="400" style="normal" font_name="Coming Soon" postscript_name="ComingSoon">ComingSoon.ttf</font> + </family> + <family name="cursive"> + <font weight="400" style="normal" font_name="Dancing Script" postscript_name="DancingScript">DancingScript-Regular.ttf</font> + <font weight="700" style="normal" font_name="Dancing Script Bold" postscript_name="DancingScript-Bold">DancingScript-Bold.ttf</font> + </family> + <family name="sans-serif-smallcaps"> + <font weight="400" style="normal" font_name="Carrois Gothic SC" postscript_name="CarroisGothicSC-Regular">CarroisGothicSC-Regular.ttf</font> + </family> + <!-- fallback fonts --> + <!-- "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"> + <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font> + <font weight="400" style="normal">NotoNaskhUI-Regular.ttf</font> + <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> + <font weight="700" style="normal">NotoNaskhUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font> + <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font> + <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font> + <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font> + </family> + <!-- Gujarati should come after Devanagari --> + <family> + <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> + </family> + <!-- Gurmukhi should come after Devanagari --> + <family> + <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font> + <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font> + <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansCham-Regular.ttf</font> + <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansVai-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansYi-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">Lohit-Odia.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> + </family> + <family lang="zh-Hans"> + <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="zh-Hans"> + <font weight="400" style="normal">NotoSansSC-Regular.otf</font> + <font weight="400" style="normal">NotoSansHans-Regular.otf</font> + </family> + <family lang="zh-Hant"> + <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="zh-Hant"> + <font weight="400" style="normal">NotoSansTC-Regular.otf</font> + <font weight="400" style="normal">NotoSansHant-Regular.otf</font> + </family> + <family lang="ja"> + <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="ja"> + <font weight="400" style="normal">NotoSansJP-Regular.otf</font> + </family> + <family lang="ko"> + <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="ko"> + <font weight="400" style="normal">NotoSansKR-Regular.otf</font> + </family> + <family> + <font weight="400" style="normal">NanumGothic.ttf</font> + </family> + <!-- + Pages are included for NotoEmoji-Regular because it is part of the + Cobalt font package. Font files that come from Android do not include + pages; this protects from subtle bugs that could be caused by Android + modifying the characters that a font supports. + --> + <family pages="0,32-33,35-39,41,43,48,50,254,496-502,4068,4072"> + <font weight="400" style="normal">NotoEmoji-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> + </family> + <!-- + Synthetic bolding is explicitly disabled for DroidSansFallback. The + quality of its synthetically bolded glyphs are not good enough to meet + Cobalt's standards. + --> + <family> + <font weight="400" style="normal" disable_synthetic_bolding="true">DroidSansFallback.ttf</font> + </family> + <family lang="ja"> + <font weight="400" style="normal">MTLmr3m.ttf</font> + </family> + <!-- + Tai Le and Mongolian are intentionally kept last, to make sure they don't override + the East Asian punctuation for Chinese. + --> + <family> + <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font> + </family> + <family> + <font weight="400" style="normal">NotoSansMongolian-Regular.ttf</font> + </family> +</familyset>
diff --git a/src/cobalt/content/fonts/config/common/fonts.xml b/src/cobalt/content/fonts/config/common/fonts.xml new file mode 100644 index 0000000..b60cc92 --- /dev/null +++ b/src/cobalt/content/fonts/config/common/fonts.xml
@@ -0,0 +1,376 @@ +<!-- + |============================================================================== + | OVERVIEW + | The font configuration files specify the local fonts available to Cobalt. + | They come in two flavors: + | 1. A required configuration file that Cobalt provides; it is loaded first + | and specifies the superset of all fonts that can be included within the + | Cobalt font package. + | 2. An optional configuration file that porters provide; it is loaded second + | and specifies the system fonts available for use. + | + | There are two types of font families that the configurations can define: + | named families and fallback families. + |============================================================================== + | NAMED FAMILIES + | Named families are families that can be retrieved by name during font + | matching. Providing a family with the optional "name" attribute makes it a + | named family. + | + | Additionally, the alias tag can be used when more than one name needs to be + | mapped to the same same family. The alias's "name" attribute specifies an + | alternate name for the family and its "to" attribute specifies the specific + | family that it maps to. There is no limit to the number of aliases that can + | map to the same family. However, it is important to note that duplicate names + | are not allowed between aliases and families; they must all be unique. + | + | As an example, see the alias mapping "fantasy" to "serif" below. Because of + | the alias, whenever the font-family "fantasy" is encountered, the "serif" + | family is returned. + | + | System fonts shouldn't duplicate any family, alias, or font names contained + | within Cobalt's font configuration, unless the corresponding font files are + | stripped from Cobalt's font package. + | + | For example: if any of Cobalt's "sans-serif" font files are included in the + | selected Cobalt font package, then the system font configuration cannot + | contain a family named "sans-serif"; however, if Cobalt's "sans-serif" font + | files are entirely stripped from the package, then the system may provide its + | own "sans-serif" family without issues. + |============================================================================== + | FALLBACK FAMILIES + | Fallback families are used when none of the named families within a + | "font-family" property are found to support a character. When this occurs, + | Cobalt searches the fallback families for a font that supports the character. + | + | Families are included as fallback families if one of two conditions are met: + | 1. They do not have a "name" attribute. + | 2. They have a "fallback_priority" attribute. + | This allows named families to also be fallback families when they are + | explicitly given a fallback priority. + | + | When the optional family attribute "fallback_priority" is included, then its + | value, which is an integer, dictates the fallback priority of the family. + | When it is not present, then the family is given the default priority of 0. + | + | Fallback families are chosen based on a match: full BCP-47 language tag + | including script, then just language with no script, and then all fonts are + | considered regardless of language. Within each of these, the highest priority + | family that satisfies the constraints and supports the character is chosen. + | If more than one family has the same fallback priority, then order of + | appearance within the xml document is the final tiebreaker. + | + | Cobalt families are loaded before system families and, as a result, always + | win the order of appearance fallback tiebreaker with system families. + | However, Cobalt fallback families all have the default fallback priority of + | 0; if it is desired that a system family be chosen before a Cobalt family + | during fallback, then this can be accomplished by giving it a priority + | greater than 0. + | + | The optional family attribute "pages" indicates which character pages are + | contained within the family. It is used with character fallback to allow the + | system to quickly determine that a character cannot appear in a font without + | requiring the full character map to be loaded into memory. Character pages + | are zero-indexed, and each page contains 256 characters, so character 1000 + | would be contained within page 3. + | + | For system families, it is safer not including "pages". When "pages" is + | included, the correct family may potentially be skipped if there is an error + | in the "pages" value. When "pages" is not included the correct fallback + | family is always selected. The cost of not including "pages" is that more + | full character maps will likely be loaded, which is a one-time performance + | hit per family, and results in a small increase in total memory usage. + |============================================================================== + | FONT ATTRIBUTES + | The optional font attributes "weight" and "style" are used to specify the + | weight and style that will be used during font matching within a family. + | "weight" must be a multiple of 100, between 100 and 900 inclusive; it + | defaults to 400 when not defined. + | "style" must have a value of either "normal" or "italic"; it defaults to + | "normal" when not defined. + | + | The optional font attributes "font_name" and "postscript_name" are used to + | allow the font to be matched during local src lookup with @font-face rules. + | https://www.w3.org/TR/css-fonts-3/#descdef-src + | + | The optional font attribute "disable_synthetic_bolding" prevents the font + | from being synthetically bolded. By default synthetic bolding is done when + | there is no bold font available and a bold weight (>500) is specified. + |============================================================================== + --> +<familyset version="1"> + <!-- first family is default --> + <family name="sans-serif"> + <font weight="100" style="normal" font_name="Roboto Thin" postscript_name="Roboto-Thin">Roboto-Thin.ttf</font> + <font weight="100" style="italic" font_name="Roboto Thin Italic" postscript_name="Roboto-Thin-Italic">Roboto-ThinItalic.ttf</font> + <font weight="300" style="normal" font_name="Roboto Light" postscript_name="Roboto-Light">Roboto-Light.ttf</font> + <font weight="300" style="italic" font_name="Roboto Light Italic" postscript_name="Roboto-Light-Italic">Roboto-LightItalic.ttf</font> + <font weight="400" style="normal" font_name="Roboto Regular" postscript_name="Roboto-Regular">Roboto-Regular.ttf</font> + <font weight="400" style="italic" font_name="Roboto Regular Italic" postscript_name="Roboto-Italic">Roboto-Italic.ttf</font> + <font weight="500" style="normal" font_name="Roboto Medium" postscript_name="Roboto-Medium">Roboto-Medium.ttf</font> + <font weight="500" style="italic" font_name="Roboto Medium Italic" postscript_name="Roboto-Medium-Italic">Roboto-MediumItalic.ttf</font> + <font weight="700" style="normal" font_name="Roboto Bold" postscript_name="Roboto-Bold">Roboto-Bold.ttf</font> + <font weight="700" style="italic" font_name="Roboto Bold Italic" postscript_name="Roboto-BoldItalic">Roboto-BoldItalic.ttf</font> + <font weight="900" style="normal" font_name="Roboto Black" postscript_name="Roboto-Black">Roboto-Black.ttf</font> + <font weight="900" style="italic" font_name="Roboto Black Italic" postscript_name="Roboto-Black-Italic">Roboto-BlackItalic.ttf</font> + </family> + <!-- Note that aliases must come after the fonts they reference. --> + <alias name="roboto" to="sans-serif" /> + <!-- This is the default font when Roboto is unavailable. --> + <family pages="0"> + <font weight="400" style="normal">Roboto-Regular-Subsetted.ttf</font> + </family> + <family name="serif"> + <font weight="400" style="normal" font_name="Noto Serif" postscript_name="NotoSerif">NotoSerif-Regular.ttf</font> + <font weight="400" style="italic" font_name="Noto Serif Italic" postscript_name="NotoSerif-Italic">NotoSerif-Italic.ttf</font> + <font weight="700" style="normal" font_name="Noto Serif Bold" postscript_name="NotoSerif-Bold">NotoSerif-Bold.ttf</font> + <font weight="700" style="italic" font_name="Noto Serif Bold Italic" postscript_name="NotoSerif-BoldItalic">NotoSerif-BoldItalic.ttf</font> + </family> + <alias name="fantasy" to="serif" /> + <family name="monospace"> + <font weight="400" style="normal" font_name="Droid Sans Mono" postscript_name="DroidSansMono">DroidSansMono.ttf</font> + </family> + <alias name="sans-serif-monospace" to="monospace" /> + <family name="serif-monospace"> + <font weight="400" style="normal" font_name="Cutive Mono" postscript_name="CutiveMono-Regular">CutiveMono.ttf</font> + </family> + <family name="casual"> + <font weight="400" style="normal" font_name="Coming Soon" postscript_name="ComingSoon">ComingSoon.ttf</font> + </family> + <family name="cursive"> + <font weight="400" style="normal" font_name="Dancing Script" postscript_name="DancingScript">DancingScript-Regular.ttf</font> + <font weight="700" style="normal" font_name="Dancing Script Bold" postscript_name="DancingScript-Bold">DancingScript-Bold.ttf</font> + </family> + <family name="sans-serif-smallcaps"> + <font weight="400" style="normal" font_name="Carrois Gothic SC" postscript_name="CarroisGothicSC-Regular">CarroisGothicSC-Regular.ttf</font> + </family> + <!-- fallback fonts --> + <!-- "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"> + <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font> + <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> + </family> + <family pages="0,18-19,45,171,254"> + <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font> + <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font> + </family> + <family pages="0,5,32,37,251,254"> + <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font> + <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> + </family> + <family pages="0,2-3,14,32,37,254"> + <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> + </family> + <family pages="0,5,251,254"> + <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font> + <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font> + </family> + <family pages="0,5,16,45,254"> + <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font> + </family> + <family pages="0,2,9,28,32,34,37,168,254"> + <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font> + </family> + <!-- Gujarati should come after Devanagari --> + <family pages="0,9-10,32,34,37,168,254"> + <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> + </family> + <!-- Gurmukhi should come after Devanagari --> + <family pages="0,9-10,32,34,37-38,168,254"> + <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font> + </family> + <family pages="0,9,11,32,34,37,254"> + <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font> + </family> + <family pages="0,3,9,13,32,34,37,254"> + <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font> + </family> + <family pages="0,9,32,34,37,254"> + <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font> + </family> + <family pages="0,9,12,32,34,37,254"> + <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font> + </family> + <family pages="0,9,12,32,34,37,254"> + <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font> + </family> + <family pages="0,9,11,32,34,37,254"> + <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> + </family> + <family pages="0,9,13,32,34,37,254"> + <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font> + <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font> + </family> + <family pages="0,23,25,32,37"> + <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> + </family> + <family pages="0,3,14,32,37"> + <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> + </family> + <family pages="0,16,32,37,169-170,254"> + <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font> + <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font> + </family> + <family pages="0,6-7,32,37,253-254"> + <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font> + <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> + </family> + <family pages="0,3,170"> + <font weight="400" style="normal">NotoSansCham-Regular.ttf</font> + <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> + </family> + <family pages="0,27,32,37,254"> + <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font> + </family> + <family pages="0,166,254,360-362"> + <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font> + </family> + <family pages="0,27,254"> + <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font> + </family> + <family pages="0,26,32,37,169,254"> + <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font> + </family> + <family pages="0,23,254"> + <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font> + </family> + <family pages="0-3,20-22,24,254"> + <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font> + </family> + <family pages="0,19,254"> + <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> + </family> + <family pages="0,3,29,37,44,254"> + <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font> + </family> + <family pages="0,44,254"> + <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font> + </family> + <family pages="0,23,254"> + <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font> + </family> + <family pages="0,32,37,169,254"> + <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font> + </family> + <family pages="0,169,254"> + <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font> + </family> + <family pages="0,28,37,254"> + <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font> + </family> + <family pages="0,9,25,254"> + <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font> + </family> + <family pages="0,2,164,254"> + <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font> + </family> + <family pages="0,6,8,254"> + <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font> + </family> + <family pages="0,170-171,254"> + <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font> + </family> + <family pages="0,25,254"> + <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font> + </family> + <family pages="0,6-7,32,46,253-254"> + <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font> + </family> + <family pages="0,28,254"> + <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font> + </family> + <family pages="0,169,254"> + <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font> + </family> + <family pages="0,32,37,168,254"> + <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font> + </family> + <family pages="0,27-28,254"> + <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font> + </family> + <family pages="0,9,32,37,168,254"> + <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font> + </family> + <family pages="0,3,6-7,32,34,37-38,254"> + <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font> + </family> + <family pages="0,23,254"> + <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font> + </family> + <family pages="0,26,32,34,37,254"> + <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font> + </family> + <family pages="0,32,37,167,170,254"> + <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font> + </family> + <family pages="0,15,32,37,254"> + <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font> + <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font> + </family> + <family pages="0,3,32,45,254"> + <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font> + </family> + <family pages="0,165-166,254"> + <font weight="400" style="normal">NotoSansVai-Regular.ttf</font> + </family> + <family pages="0,48,160-164,254-255"> + <font weight="400" style="normal">NotoSansYi-Regular.ttf</font> + </family> + <family pages="32-43,497-498"> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> + </family> + <family lang="zh-Hans" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> + <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="zh-Hant" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> + <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="ja" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> + <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="ko" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> + <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> + </family> + <family lang="ja" pages="0,32,34-35,46-159,249-250,254-255,498,512-523,525-527,530-538,540-543,545-547,550,552,554-559,561,563-568,570,572-573,575-579,582-584,586-594,596-608,610-612,614-618,620,622-625,627-628,630-631,633-638,640,642-646,649-655,658,660-664,666,669-678,681,695-696,760-761"> + <font weight="400" style="normal">NotoSansJP-Regular.otf</font> + </family> + <family pages="0,32-33,35-39,41,43,48,50,254,496-502,4068,4072"> + <font weight="400" style="normal">NotoEmoji-Regular.ttf</font> + </family> + <family pages="35,37-39,43,496,498"> + <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> + </family> + <!-- + Synthetic bolding is explicitly disabled for DroidSansFallback. The + quality of its synthetically bolded glyphs are not good enough to meet + Cobalt's standards. + --> + <family pages="0,14,17,32,48-51,77-159,172-215,249-250,254-255,260"> + <font weight="400" style="normal" disable_synthetic_bolding="true">DroidSansFallback.ttf</font> + </family> + <!-- + Tai Le and Mongolian 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"> + <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font> + </family> + <family pages="0,24,32,36-37,48,254"> + <font weight="400" style="normal" >NotoSansMongolian-Regular.ttf</font> + </family> +</familyset>
diff --git a/src/cobalt/content/fonts/font_files/Roboto-Black.ttf b/src/cobalt/content/fonts/font_files/Roboto-Black.ttf new file mode 100644 index 0000000..e8a835a --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-Black.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-BlackItalic.ttf b/src/cobalt/content/fonts/font_files/Roboto-BlackItalic.ttf new file mode 100644 index 0000000..49bc496 --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-BlackItalic.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-Light.ttf b/src/cobalt/content/fonts/font_files/Roboto-Light.ttf new file mode 100644 index 0000000..e50ce97 --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-Light.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-LightItalic.ttf b/src/cobalt/content/fonts/font_files/Roboto-LightItalic.ttf new file mode 100644 index 0000000..a2bfefe --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-LightItalic.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-Medium.ttf b/src/cobalt/content/fonts/font_files/Roboto-Medium.ttf new file mode 100644 index 0000000..f144b6d --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-Medium.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-MediumItalic.ttf b/src/cobalt/content/fonts/font_files/Roboto-MediumItalic.ttf new file mode 100644 index 0000000..e6e8319 --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-MediumItalic.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-Thin.ttf b/src/cobalt/content/fonts/font_files/Roboto-Thin.ttf new file mode 100644 index 0000000..77b470e --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-Thin.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/font_files/Roboto-ThinItalic.ttf b/src/cobalt/content/fonts/font_files/Roboto-ThinItalic.ttf new file mode 100644 index 0000000..5562612 --- /dev/null +++ b/src/cobalt/content/fonts/font_files/Roboto-ThinItalic.ttf Binary files differ
diff --git a/src/cobalt/content/fonts/xml/android/fonts.xml b/src/cobalt/content/fonts/xml/android/fonts.xml deleted file mode 100644 index 6a714c9..0000000 --- a/src/cobalt/content/fonts/xml/android/fonts.xml +++ /dev/null
@@ -1,329 +0,0 @@ -<familyset version="1"> -<!-- - Fallback fonts are chosen based on a match: full BCP-47 language tag - including script, then just language, and finally order (the first font - containing the glyph). Order of appearance is also the tiebreaker for weight - matching. - - NOTE: When the optional family attribute "fallback" is included for a - family, then it dictates whether or not that family is added to the fallback - list. However, when it is not included, then the lack of a "name" attribute - causes the family to be added to the fallback list. - - The optional family attribute "pages" indicates which character pages are - contained within the family. It is used with character fallback to allow the - system to quickly determine that a character cannot appear in a font without - requiring the full character map to be loaded into memory. Character pages - are zero indexed, and each page contains 256 characters, so character 1000 - would be contained within page 3. - - The optional font attribute "disable_synthetic_bolding" prevents the font - from being synthetically bolded. By default synthetic bolding is done when - there is no bold font available and a bold weight (>500) is specified. ---> - <!-- first family is default --> - <family name="sans-serif"> - <font weight="400" style="normal" font_name="Roboto Regular" postscript_name="Roboto-Regular">Roboto-Regular.ttf</font> - <font weight="400" style="italic" font_name="Roboto Regular Italic" postscript_name="Roboto-Italic">Roboto-Italic.ttf</font> - <font weight="700" style="normal" font_name="Roboto Bold" postscript_name="Roboto-Bold">Roboto-Bold.ttf</font> - <font weight="700" style="italic" font_name="Roboto Bold Italic" postscript_name="Roboto-BoldItalic">Roboto-BoldItalic.ttf</font> - </family> - <!-- Note that aliases must come after the fonts they reference. --> - <alias name="arial" to="sans-serif" /> - <alias name="helvetica" to="sans-serif" /> - <alias name="roboto" to="sans-serif" /> - <alias name="tahoma" to="sans-serif" /> - <alias name="verdana" to="sans-serif" /> - <!-- This is the default font when Roboto is unavailable. --> - <family fallback="true" pages="0"> - <font weight="400" style="normal">Roboto-Regular-Subsetted.ttf</font> - </family> - <family name="sans-serif-condensed"> - <font weight="400" style="normal" font_name="Roboto Condensed Regular" postscript_name="Roboto-Condensed-Regular">RobotoCondensed-Regular.ttf</font> - <font weight="400" style="italic" font_name="Roboto Condensed Regular Italic" postscript_name="Roboto-Condensed-Regular-Italic">RobotoCondensed-Italic.ttf</font> - <font weight="700" style="normal" font_name="Roboto Condensed Bold" postscript_name="Roboto-Condensed-Bold">RobotoCondensed-Bold.ttf</font> - <font weight="700" style="italic" font_name="Roboto Condensed Bold Italic" postscript_name="Roboto-Condensed-Bold-Italic">RobotoCondensed-BoldItalic.ttf</font> - </family> - <family name="serif"> - <font weight="400" style="normal" font_name="Noto Serif" postscript_name="NotoSerif">NotoSerif-Regular.ttf</font> - <font weight="400" style="italic" font_name="Noto Serif Italic" postscript_name="NotoSerif-Italic">NotoSerif-Italic.ttf</font> - <font weight="700" style="normal" font_name="Noto Serif Bold" postscript_name="NotoSerif-Bold">NotoSerif-Bold.ttf</font> - <font weight="700" style="italic" font_name="Noto Serif Bold Italic" postscript_name="NotoSerif-BoldItalic">NotoSerif-BoldItalic.ttf</font> - </family> - <alias name="times" to="serif" /> - <alias name="times new roman" to="serif" /> - <alias name="palatino" to="serif" /> - <alias name="georgia" to="serif" /> - <alias name="baskerville" to="serif" /> - <alias name="goudy" to="serif" /> - <alias name="fantasy" to="serif" /> - <alias name="ITC Stone Serif" to="serif" /> - <family name="monospace"> - <font weight="400" style="normal" font_name="Droid Sans Mono" postscript_name="DroidSansMono">DroidSansMono.ttf</font> - </family> - <alias name="sans-serif-monospace" to="monospace" /> - <alias name="monaco" to="monospace" /> - <family name="serif-monospace"> - <font weight="400" style="normal" font_name="Cutive Mono" postscript_name="CutiveMono-Regular">CutiveMono.ttf</font> - </family> - <alias name="courier" to="serif-monospace" /> - <alias name="courier new" to="serif-monospace" /> - <family name="casual"> - <font weight="400" style="normal" font_name="Coming Soon" postscript_name="ComingSoon">ComingSoon.ttf</font> - </family> - <family name="cursive"> - <font weight="400" style="normal" font_name="Dancing Script" postscript_name="DancingScript">DancingScript-Regular.ttf</font> - <font weight="700" style="normal" font_name="Dancing Script Bold" postscript_name="DancingScript-Bold">DancingScript-Bold.ttf</font> - </family> - <family name="sans-serif-smallcaps"> - <font weight="400" style="normal" font_name="Carrois Gothic SC" postscript_name="CarroisGothicSC-Regular">CarroisGothicSC-Regular.ttf</font> - </family> - <!-- fallback fonts --> - <family fallback="true" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254"> - <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font> - <font weight="400" style="normal">NotoNaskhUI-Regular.ttf</font> - <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> - <font weight="700" style="normal">NotoNaskhUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,18-19,45,171,254"> - <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font> - <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,32,37,251,254"> - <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font> - <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> - </family> - <family fallback="true" pages="0,2-3,14,32,37,254"> - <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,251,254"> - <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font> - <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,16,45,254"> - <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font> - </family> - <family fallback="true" pages="0,2,9,28,32,34,37,168,254"> - <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font> - </family> - <!-- Gujarati should come after Devanagari --> - <family fallback="true" pages="0,9-10,32,34,37,168,254"> - <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> - </family> - <!-- Gurmukhi should come after Devanagari --> - <family fallback="true" pages="0,9-10,32,34,37-38,168,254"> - <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,11,32,34,37,254"> - <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,9,13,32,34,37,254"> - <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,32,34,37,254"> - <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,12,32,34,37,254"> - <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,12,32,34,37,254"> - <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,11,32,34,37,254"> - <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,13,32,34,37,254"> - <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font> - <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font> - </family> - <family fallback="true" pages="0,23,25,32,37"> - <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,14,32,37"> - <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,16,32,37,169-170,254"> - <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,6-7,32,37,253-254"> - <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font> - <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,170"> - <font weight="400" style="normal">NotoSansCham-Regular.ttf</font> - <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> - </family> - <family fallback="true" pages="0,27,32,37,254"> - <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,166,254,360-362"> - <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font> - </family> - <family fallback="true" pages="0,27,254"> - <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font> - </family> - <family fallback="true" pages="0,26,32,37,169,254"> - <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font> - </family> - <family fallback="true" pages="0-3,20-22,24,254"> - <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font> - </family> - <family fallback="true" pages="0,19,254"> - <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> - </family> - <family fallback="true" pages="0-3,29,37,44,254"> - <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,44,254"> - <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,169,254"> - <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,169,254"> - <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font> - </family> - <family fallback="true" pages="0,28,37,254"> - <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font> - </family> - <family fallback="true" pages="0,9,25,254"> - <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font> - </family> - <family fallback="true" pages="0,2,164,254"> - <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font> - </family> - <family fallback="true" pages="0,6,8,254"> - <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,170-171,254"> - <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font> - </family> - <family fallback="true" pages="0,25,254"> - <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font> - </family> - <family fallback="true" pages="0,6-7,32,46,253-254"> - <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font> - </family> - <family fallback="true" pages="0,28,254"> - <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font> - </family> - <family fallback="true" pages="0,169,254"> - <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,168,254"> - <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font> - </family> - <family fallback="true" pages="0,27-28,254"> - <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,9,32,37,168,254"> - <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font> - </family> - <family fallback="true" pages="0,3,6-7,32,34,37-38,254"> - <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font> - </family> - <family fallback="true" pages="0,26,32,34,37,254"> - <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,167,170,254"> - <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font> - </family> - <family fallback="true" pages="0,15,32,37,254"> - <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,32,45,254"> - <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font> - </family> - <family fallback="true" pages="0,165-166,254"> - <font weight="400" style="normal">NotoSansVai-Regular.ttf</font> - </family> - <family fallback="true" pages="0,48,160-164,254-255"> - <font weight="400" style="normal">NotoSansYi-Regular.ttf</font> - </family> - <family fallback="true" pages="0,9,11,32,34,37"> - <font weight="400" style="normal">Lohit-Odia.ttf</font> - </family> - <family fallback="true" pages="32-43,48,497-498"> - <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> - </family> - <family fallback="true" lang="zh-Hans" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="zh-Hans" pages="0,2,32-39,41,43,46-159,249-250,254-255,497-498,512-513,518,524,531-533,553,565,572,574,577,584-586,597,602,606,610,612,614-615,617,619-620,632,639,644,646-647,651-652,654,662,664,671,679-682,687,689,691-696,698-702,704-718"> - <font weight="400" style="normal">NotoSansSC-Regular.otf</font> - <font weight="400" style="normal">NotoSansHans-Regular.otf</font> - </family> - <family fallback="true" lang="zh-Hant" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="zh-Hant" pages="0,32,34,46-48,50,52-159,249-250,254-255,498,512-657,660-661,663-678,685,760-761"> - <font weight="400" style="normal">NotoSansTC-Regular.otf</font> - <font weight="400" style="normal">NotoSansHant-Regular.otf</font> - </family> - <family fallback="true" lang="ja" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="ja" pages="0,32,34-35,46-159,249-250,254-255,498,512-523,525-527,530-538,540-543,545-547,550,552,554-559,561,563-568,570,572-573,575-579,582-584,586-594,596-608,610-612,614-618,620,622-625,627-628,630-631,633-638,640,642-646,649-655,658,660-664,666,669-678,681,695-696,760-761"> - <font weight="400" style="normal">NotoSansJP-Regular.otf</font> - </family> - <family fallback="true" lang="ko" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="ko" pages="0,17,32,48-50,169,172-215,255"> - <font weight="400" style="normal">NotoSansKR-Regular.otf</font> - </family> - <family fallback="true" pages="0,17,32,49-50,172-215"> - <font weight="400" style="normal">NanumGothic.ttf</font> - </family> - <family fallback="true" pages="0,32-33,35-39,41,43,48,50,254,496-502,4068,4072"> - <font weight="400" style="normal">NotoEmoji-Regular.ttf</font> - </family> - <family fallback="true" pages="35,37-39,43,496,498"> - <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> - </family> - <!-- - Synthetic bolding is explicitly disabled for DroidSansFallback. The - quality of its synthetically bolded glyphs are not good enough to meet - Cobalt's standards. - --> - <family fallback="true" pages="0,14,17,32,48-159,172-215,249-250,254-255,260"> - <font weight="400" style="normal" disable_synthetic_bolding="true">DroidSansFallback.ttf</font> - </family> - <family fallback="true" lang="ja" pages="0,2-4,32-38,48,50-51,78-159,249-250,255"> - <font weight="400" style="normal">MTLmr3m.ttf</font> - </family> - <!-- - Tai Le and Mongolian are intentionally kept last, to make sure they don't override - the East Asian punctuation for Chinese. - --> - <family fallback="true" pages="0,3,16,25,48,254"> - <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font> - </family> - <family fallback="true" pages="0,24,32,36-37,48,254"> - <font weight="400" style="normal">NotoSansMongolian-Regular.ttf</font> - </family> -</familyset>
diff --git a/src/cobalt/content/fonts/xml/common/fonts.xml b/src/cobalt/content/fonts/xml/common/fonts.xml deleted file mode 100644 index 2ff5097..0000000 --- a/src/cobalt/content/fonts/xml/common/fonts.xml +++ /dev/null
@@ -1,301 +0,0 @@ -<familyset version="1"> -<!-- - Fallback fonts are chosen based on a match: full BCP-47 language tag - including script, then just language, and finally order (the first font - containing the glyph). Order of appearance is also the tiebreaker for weight - matching. - - NOTE: When the optional family attribute "fallback" is included for a - family, then it dictates whether or not that family is added to the fallback - list. However, when it is not included, then the lack of a "name" attribute - causes the family to be added to the fallback list. - - The optional family attribute "pages" indicates which character pages are - contained within the family. It is used with character fallback to allow the - system to quickly determine that a character cannot appear in a font without - requiring the full character map to be loaded into memory. Character pages - are zero indexed, and each page contains 256 characters, so character 1000 - would be contained within page 3. - - The optional font attribute "disable_synthetic_bolding" prevents the font - from being synthetically bolded. By default synthetic bolding is done when - there is no bold font available and a bold weight (>500) is specified. ---> - <!-- first family is default --> - <family name="sans-serif"> - <font weight="400" style="normal" font_name="Roboto Regular" postscript_name="Roboto-Regular">Roboto-Regular.ttf</font> - <font weight="400" style="italic" font_name="Roboto Regular Italic" postscript_name="Roboto-Italic">Roboto-Italic.ttf</font> - <font weight="700" style="normal" font_name="Roboto Bold" postscript_name="Roboto-Bold">Roboto-Bold.ttf</font> - <font weight="700" style="italic" font_name="Roboto Bold Italic" postscript_name="Roboto-BoldItalic">Roboto-BoldItalic.ttf</font> - </family> - <!-- Note that aliases must come after the fonts they reference. --> - <alias name="arial" to="sans-serif" /> - <alias name="helvetica" to="sans-serif" /> - <alias name="roboto" to="sans-serif" /> - <alias name="tahoma" to="sans-serif" /> - <alias name="verdana" to="sans-serif" /> - <!-- This is the default font when Roboto is unavailable. --> - <family fallback="true" pages="0"> - <font weight="400" style="normal">Roboto-Regular-Subsetted.ttf</font> - </family> - <family name="serif"> - <font weight="400" style="normal" font_name="Noto Serif" postscript_name="NotoSerif">NotoSerif-Regular.ttf</font> - <font weight="400" style="italic" font_name="Noto Serif Italic" postscript_name="NotoSerif-Italic">NotoSerif-Italic.ttf</font> - <font weight="700" style="normal" font_name="Noto Serif Bold" postscript_name="NotoSerif-Bold">NotoSerif-Bold.ttf</font> - <font weight="700" style="italic" font_name="Noto Serif Bold Italic" postscript_name="NotoSerif-BoldItalic">NotoSerif-BoldItalic.ttf</font> - </family> - <alias name="times" to="serif" /> - <alias name="times new roman" to="serif" /> - <alias name="palatino" to="serif" /> - <alias name="georgia" to="serif" /> - <alias name="baskerville" to="serif" /> - <alias name="goudy" to="serif" /> - <alias name="fantasy" to="serif" /> - <alias name="ITC Stone Serif" to="serif" /> - <family name="monospace"> - <font weight="400" style="normal" font_name="Droid Sans Mono" postscript_name="DroidSansMono">DroidSansMono.ttf</font> - </family> - <alias name="sans-serif-monospace" to="monospace" /> - <alias name="monaco" to="monospace" /> - <family name="serif-monospace"> - <font weight="400" style="normal" font_name="Cutive Mono" postscript_name="CutiveMono-Regular">CutiveMono.ttf</font> - </family> - <alias name="courier" to="serif-monospace" /> - <alias name="courier new" to="serif-monospace" /> - <family name="casual"> - <font weight="400" style="normal" font_name="Coming Soon" postscript_name="ComingSoon">ComingSoon.ttf</font> - </family> - <family name="cursive"> - <font weight="400" style="normal" font_name="Dancing Script" postscript_name="DancingScript">DancingScript-Regular.ttf</font> - <font weight="700" style="normal" font_name="Dancing Script Bold" postscript_name="DancingScript-Bold">DancingScript-Bold.ttf</font> - </family> - <family name="sans-serif-smallcaps"> - <font weight="400" style="normal" font_name="Carrois Gothic SC" postscript_name="CarroisGothicSC-Regular">CarroisGothicSC-Regular.ttf</font> - </family> - <!-- fallback fonts --> - <family fallback="true" name="Noto Naskh Arabic UI" pages="0,6-8,32,37,46,251-254"> - <font weight="400" style="normal">NotoNaskhArabicUI-Regular.ttf</font> - <font weight="700" style="normal">NotoNaskhArabicUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,18-19,45,171,254"> - <font weight="400" style="normal">NotoSansEthiopic-Regular.ttf</font> - <font weight="700" style="normal">NotoSansEthiopic-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,32,37,251,254"> - <font weight="400" style="normal">NotoSansHebrew-Regular.ttf</font> - <font weight="700" style="normal">NotoSansHebrew-Bold.ttf</font> - </family> - <family fallback="true" pages="0,2-3,14,32,37,254"> - <font weight="400" style="normal">NotoSansThaiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansThaiUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,251,254"> - <font weight="400" style="normal">NotoSansArmenian-Regular.ttf</font> - <font weight="700" style="normal">NotoSansArmenian-Bold.ttf</font> - </family> - <family fallback="true" pages="0,5,16,45,254"> - <font weight="400" style="normal">NotoSansGeorgian-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGeorgian-Bold.ttf</font> - </family> - <family fallback="true" pages="0,2,9,28,32,34,37,168,254"> - <font weight="400" style="normal">NotoSansDevanagariUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansDevanagariUI-Bold.ttf</font> - </family> - <!-- Gujarati should come after Devanagari --> - <family fallback="true" pages="0,9-10,32,34,37,168,254"> - <font weight="400" style="normal">NotoSansGujaratiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGujaratiUI-Bold.ttf</font> - </family> - <!-- Gurmukhi should come after Devanagari --> - <family fallback="true" pages="0,9-10,32,34,37-38,168,254"> - <font weight="400" style="normal">NotoSansGurmukhiUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansGurmukhiUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,11,32,34,37,254"> - <font weight="400" style="normal">NotoSansTamilUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTamilUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,9,13,32,34,37,254"> - <font weight="400" style="normal">NotoSansMalayalamUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansMalayalamUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,32,34,37,254"> - <font weight="400" style="normal">NotoSansBengaliUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansBengaliUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,12,32,34,37,254"> - <font weight="400" style="normal">NotoSansTeluguUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTeluguUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,12,32,34,37,254"> - <font weight="400" style="normal">NotoSansKannadaUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansKannadaUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,11,32,34,37,254"> - <font weight="400" style="normal">NotoSansOriyaUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansOriyaUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,9,13,32,34,37,254"> - <font weight="400" style="normal">NotoSansSinhala-Regular.ttf</font> - <font weight="700" style="normal">NotoSansSinhala-Bold.ttf</font> - </family> - <family fallback="true" pages="0,23,25,32,37"> - <font weight="400" style="normal">NotoSansKhmerUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansKhmerUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,14,32,37"> - <font weight="400" style="normal">NotoSansLaoUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansLaoUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,16,32,37,169-170,254"> - <font weight="400" style="normal">NotoSansMyanmarUI-Regular.ttf</font> - <font weight="700" style="normal">NotoSansMyanmarUI-Bold.ttf</font> - </family> - <family fallback="true" pages="0,6-7,32,37,253-254"> - <font weight="400" style="normal">NotoSansThaana-Regular.ttf</font> - <font weight="700" style="normal">NotoSansThaana-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,170"> - <font weight="400" style="normal">NotoSansCham-Regular.ttf</font> - <font weight="700" style="normal">NotoSansCham-Bold.ttf</font> - </family> - <family fallback="true" pages="0,27,32,37,254"> - <font weight="400" style="normal">NotoSansBalinese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,166,254,360-362"> - <font weight="400" style="normal">NotoSansBamum-Regular.ttf</font> - </family> - <family fallback="true" pages="0,27,254"> - <font weight="400" style="normal">NotoSansBatak-Regular.ttf</font> - </family> - <family fallback="true" pages="0,26,32,37,169,254"> - <font weight="400" style="normal">NotoSansBuginese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansBuhid-Regular.ttf</font> - </family> - <family fallback="true" pages="0-3,20-22,24,254"> - <font weight="400" style="normal">NotoSansCanadianAboriginal-Regular.ttf</font> - </family> - <family fallback="true" pages="0,19,254"> - <font weight="400" style="normal">NotoSansCherokee-Regular.ttf</font> - </family> - <family fallback="true" pages="0,3,29,37,44,254"> - <font weight="400" style="normal">NotoSansCoptic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,44,254"> - <font weight="400" style="normal">NotoSansGlagolitic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansHanunoo-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,169,254"> - <font weight="400" style="normal">NotoSansJavanese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,169,254"> - <font weight="400" style="normal">NotoSansKayahLi-Regular.ttf</font> - </family> - <family fallback="true" pages="0,28,37,254"> - <font weight="400" style="normal">NotoSansLepcha-Regular.ttf</font> - </family> - <family fallback="true" pages="0,9,25,254"> - <font weight="400" style="normal">NotoSansLimbu-Regular.ttf</font> - </family> - <family fallback="true" pages="0,2,164,254"> - <font weight="400" style="normal">NotoSansLisu-Regular.ttf</font> - </family> - <family fallback="true" pages="0,6,8,254"> - <font weight="400" style="normal">NotoSansMandaic-Regular.ttf</font> - </family> - <family fallback="true" pages="0,170-171,254"> - <font weight="400" style="normal">NotoSansMeeteiMayek-Regular.ttf</font> - </family> - <family fallback="true" pages="0,25,254"> - <font weight="400" style="normal">NotoSansNewTaiLue-Regular.ttf</font> - </family> - <family fallback="true" pages="0,6-7,32,46,253-254"> - <font weight="400" style="normal">NotoSansNKo-Regular.ttf</font> - </family> - <family fallback="true" pages="0,28,254"> - <font weight="400" style="normal">NotoSansOlChiki-Regular.ttf</font> - </family> - <family fallback="true" pages="0,169,254"> - <font weight="400" style="normal">NotoSansRejang-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,168,254"> - <font weight="400" style="normal">NotoSansSaurashtra-Regular.ttf</font> - </family> - <family fallback="true" pages="0,27-28,254"> - <font weight="400" style="normal">NotoSansSundanese-Regular.ttf</font> - </family> - <family fallback="true" pages="0,9,32,37,168,254"> - <font weight="400" style="normal">NotoSansSylotiNagri-Regular.ttf</font> - </family> - <family fallback="true" pages="0,3,6-7,32,34,37-38,254"> - <font weight="400" style="normal">NotoSansSyriacEstrangela-Regular.ttf</font> - </family> - <family fallback="true" pages="0,23,254"> - <font weight="400" style="normal">NotoSansTagbanwa-Regular.ttf</font> - </family> - <family fallback="true" pages="0,26,32,34,37,254"> - <font weight="400" style="normal">NotoSansTaiTham-Regular.ttf</font> - </family> - <family fallback="true" pages="0,32,37,167,170,254"> - <font weight="400" style="normal">NotoSansTaiViet-Regular.ttf</font> - </family> - <family fallback="true" pages="0,15,32,37,254"> - <font weight="400" style="normal">NotoSansTibetan-Regular.ttf</font> - <font weight="700" style="normal">NotoSansTibetan-Bold.ttf</font> - </family> - <family fallback="true" pages="0,3,32,45,254"> - <font weight="400" style="normal">NotoSansTifinagh-Regular.ttf</font> - </family> - <family fallback="true" pages="0,165-166,254"> - <font weight="400" style="normal">NotoSansVai-Regular.ttf</font> - </family> - <family fallback="true" pages="0,48,160-164,254-255"> - <font weight="400" style="normal">NotoSansYi-Regular.ttf</font> - </family> - <family fallback="true" pages="32-43,497-498"> - <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted.ttf</font> - </family> - <family fallback="true" lang="zh-Hans" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="2">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="zh-Hant" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="3">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="ja" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="0">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="ko" pages="0-4,17,30,32-39,41,43,46-159,169,172-215,249-251,254-255,497-498,512-658,660-682,685,687,689,691-696,698-702,704-718,760-761"> - <font weight="400" style="normal" index="1">NotoSansCJK-Regular.ttc</font> - </family> - <family fallback="true" lang="ja" pages="0,32,34-35,46-159,249-250,254-255,498,512-523,525-527,530-538,540-543,545-547,550,552,554-559,561,563-568,570,572-573,575-579,582-584,586-594,596-608,610-612,614-618,620,622-625,627-628,630-631,633-638,640,642-646,649-655,658,660-664,666,669-678,681,695-696,760-761"> - <font weight="400" style="normal">NotoSansJP-Regular.otf</font> - </family> - <family fallback="true" pages="0,32-33,35-39,41,43,48,50,254,496-502,4068,4072"> - <font weight="400" style="normal">NotoEmoji-Regular.ttf</font> - </family> - <family fallback="true" pages="35,37-39,43,496,498"> - <font weight="400" style="normal">NotoSansSymbols-Regular-Subsetted2.ttf</font> - </family> - <!-- - Synthetic bolding is explicitly disabled for DroidSansFallback. The - quality of its synthetically bolded glyphs are not good enough to meet - Cobalt's standards. - --> - <family fallback="true" pages="0,14,17,32,48-51,77-159,172-215,249-250,254-255,260"> - <font weight="400" style="normal" disable_synthetic_bolding="true">DroidSansFallback.ttf</font> - </family> - <!-- - Tai Le and Mongolian are intentionally kept last, to make sure they don't override - the East Asian punctuation for Chinese. - --> - <family fallback="true" pages="0,3,16,25,48,254"> - <font weight="400" style="normal">NotoSansTaiLe-Regular.ttf</font> - </family> - <family fallback="true" pages="0,24,32,36-37,48,254"> - <font weight="400" style="normal" >NotoSansMongolian-Regular.ttf</font> - </family> -</familyset>
diff --git a/src/cobalt/dom/camera_3d.cc b/src/cobalt/dom/camera_3d.cc index 376f981..297d1cd 100644 --- a/src/cobalt/dom/camera_3d.cc +++ b/src/cobalt/dom/camera_3d.cc
@@ -19,8 +19,7 @@ namespace cobalt { namespace dom { -Camera3D::Camera3D(const scoped_refptr<input::InputPoller>& input_poller) - : impl_(new Camera3DImpl(input_poller)) {} +Camera3D::Camera3D(const scoped_refptr<input::Camera3D>& impl) : impl_(impl) {} void Camera3D::CreateKeyMapping(int keycode, uint32 camera_axis, float degrees_per_second) {
diff --git a/src/cobalt/dom/camera_3d.h b/src/cobalt/dom/camera_3d.h index 03d04cb..056683b 100644 --- a/src/cobalt/dom/camera_3d.h +++ b/src/cobalt/dom/camera_3d.h
@@ -17,8 +17,7 @@ #ifndef COBALT_DOM_CAMERA_3D_H_ #define COBALT_DOM_CAMERA_3D_H_ -#include "cobalt/dom/camera_3d_impl.h" -#include "cobalt/input/input_poller.h" +#include "cobalt/input/camera_3d.h" #include "cobalt/script/wrappable.h" namespace cobalt { @@ -29,14 +28,14 @@ public: enum CameraAxes { // Restricted to [0deg, 360deg] - kDomCameraRoll = Camera3DImpl::kCameraRoll, + kDomCameraRoll = input::Camera3D::kCameraRoll, // Restricted to [-90deg, 90deg] - kDomCameraPitch = Camera3DImpl::kCameraPitch, + kDomCameraPitch = input::Camera3D::kCameraPitch, // Restricted to [0deg, 360deg] - kDomCameraYaw = Camera3DImpl::kCameraYaw, + kDomCameraYaw = input::Camera3D::kCameraYaw, }; - explicit Camera3D(const scoped_refptr<input::InputPoller>& input_poller); + explicit Camera3D(const scoped_refptr<input::Camera3D>& impl); // Creates a mapping between the specified keyCode and the specified camera // axis, such that while the key is pressed, the cameraAxis will rotate at a @@ -53,18 +52,18 @@ void Reset(); // Custom, not in any spec. - scoped_refptr<Camera3DImpl> impl() { return impl_; } + scoped_refptr<input::Camera3D> impl() { return impl_; } DEFINE_WRAPPABLE_TYPE(Camera3D); private: - // We delegate all calls to an Impl version of Camera3D so that all camera - // state is stored within an object that is *not* a script::Wrappable. This - // is important because Camera3DImpl will typically be attached to a render + // We delegate all calls to the implementation of Camera3D so that all camera + // state is stored within an object that is *not* a script::Wrappable. This + // is important because input::Camera3D will typically be attached to a render // tree, and render trees passed to the rasterizer have the potential to - // outlive the WebModule that created them, and the Camera3DImpl class is - // designed for just this. - scoped_refptr<Camera3DImpl> impl_; + // outlive the WebModule that created them, and input::Camera3D is designed + // for just this. + scoped_refptr<input::Camera3D> impl_; DISALLOW_COPY_AND_ASSIGN(Camera3D); };
diff --git a/src/cobalt/dom/data_view.h b/src/cobalt/dom/data_view.h index d6bfb21..15f645b 100644 --- a/src/cobalt/dom/data_view.h +++ b/src/cobalt/dom/data_view.h
@@ -16,6 +16,7 @@ #define COBALT_DOM_DATA_VIEW_H_ #include <algorithm> +#include <iterator> #include "build/build_config.h" #include "cobalt/dom/array_buffer.h"
diff --git a/src/cobalt/dom/document.cc b/src/cobalt/dom/document.cc index 4869925..2f3ad0e 100644 --- a/src/cobalt/dom/document.cc +++ b/src/cobalt/dom/document.cc
@@ -215,11 +215,11 @@ TRACK_MEMORY_SCOPE("DOM"); // https://www.w3.org/TR/2015/WD-dom-20150428/#dom-document-createevent // The match of interface name is case-insensitive. - if (strcasecmp(interface_name.c_str(), "event") == 0 || - strcasecmp(interface_name.c_str(), "events") == 0) { + if (base::strcasecmp(interface_name.c_str(), "event") == 0 || + base::strcasecmp(interface_name.c_str(), "events") == 0) { return new Event(Event::Uninitialized); - } else if (strcasecmp(interface_name.c_str(), "uievent") == 0 || - strcasecmp(interface_name.c_str(), "uievents") == 0) { + } else if (base::strcasecmp(interface_name.c_str(), "uievent") == 0 || + base::strcasecmp(interface_name.c_str(), "uievents") == 0) { return new UIEvent(Event::Uninitialized); }
diff --git a/src/cobalt/dom/font_face.cc b/src/cobalt/dom/font_face.cc index 3b5e2ad..97f92cf 100644 --- a/src/cobalt/dom/font_face.cc +++ b/src/cobalt/dom/font_face.cc
@@ -48,12 +48,12 @@ size_t FontFaceStyleSet::GetClosestStyleEntryIndex( const render_tree::FontStyle& pattern) const { size_t closest_index = 0; - int min_score = std::numeric_limits<int>::max(); + int max_score = std::numeric_limits<int>::min(); for (size_t i = 0; i < entries_.size(); ++i) { int score = MatchScore(pattern, entries_[i].style); - if (score < min_score) { + if (score > max_score) { closest_index = i; - min_score = score; + max_score = score; } } @@ -63,9 +63,43 @@ int FontFaceStyleSet::MatchScore( const render_tree::FontStyle& pattern, const render_tree::FontStyle& candidate) const { + // This logic is taken from Skia and is based upon the algorithm specified + // within the spec: + // https://www.w3.org/TR/css-fonts-3/#font-matching-algorithm + int score = 0; - score += (pattern.slant == candidate.slant) ? 0 : 1000; - score += std::abs(pattern.weight - candidate.weight); + + // CSS style (italic/oblique) + // Being italic trumps all valid weights which are not italic. + // Note that newer specs differentiate between italic and oblique. + if ((pattern.slant == render_tree::FontStyle::kItalicSlant) == + (candidate.slant == render_tree::FontStyle::kItalicSlant)) { + score += 1001; + } + + // The 'closer' to the target weight, the higher the score. + // 1000 is the 'heaviest' recognized weight + if (pattern.weight == candidate.weight) { + score += 1000; + } else if (pattern.weight <= 500) { + if (400 <= pattern.weight && pattern.weight < 450) { + if (450 <= candidate.weight && candidate.weight <= 500) { + score += 500; + } + } + if (candidate.weight <= pattern.weight) { + score += 1000 - pattern.weight + candidate.weight; + } else { + score += 1000 - candidate.weight; + } + } else if (pattern.weight > 500) { + if (candidate.weight > pattern.weight) { + score += 1000 + pattern.weight - candidate.weight; + } else { + score += candidate.weight; + } + } + return score; }
diff --git a/src/cobalt/dom/media_source/media_source.cc b/src/cobalt/dom/media_source/media_source.cc index 63abdec..c87fdb5 100644 --- a/src/cobalt/dom/media_source/media_source.cc +++ b/src/cobalt/dom/media_source/media_source.cc
@@ -96,7 +96,7 @@ } *mime = tokens[0]; for (size_t i = 1; i < tokens.size(); ++i) { - if (strncasecmp(tokens[i].c_str(), kCodecs, strlen(kCodecs))) { + if (base::strncasecmp(tokens[i].c_str(), kCodecs, strlen(kCodecs))) { continue; } *codecs = tokens[i].substr(strlen("codecs="));
diff --git a/src/cobalt/dom/window.cc b/src/cobalt/dom/window.cc index 16bdb99..665126d 100644 --- a/src/cobalt/dom/window.cc +++ b/src/cobalt/dom/window.cc
@@ -95,7 +95,7 @@ const base::Closure& window_close_callback, const base::Closure& window_minimize_callback, system_window::SystemWindow* system_window, - const scoped_refptr<input::InputPoller>& input_poller, + const scoped_refptr<input::Camera3D>& camera_3d, const scoped_refptr<MediaSession>& media_session, int csp_insecure_allowed_token, int dom_max_element_depth) : width_(width), @@ -125,7 +125,7 @@ ALLOW_THIS_IN_INITIALIZER_LIST( relay_on_load_event_(new RelayLoadEvent(this))), console_(new Console(execution_state)), - camera_3d_(new Camera3D(input_poller)), + camera_3d_(new Camera3D(camera_3d)), ALLOW_THIS_IN_INITIALIZER_LIST(window_timers_(new WindowTimers(this))), ALLOW_THIS_IN_INITIALIZER_LIST(animation_frame_request_callback_list_( new AnimationFrameRequestCallbackList(this))),
diff --git a/src/cobalt/dom/window.h b/src/cobalt/dom/window.h index d162f0a..36eddab 100644 --- a/src/cobalt/dom/window.h +++ b/src/cobalt/dom/window.h
@@ -38,7 +38,7 @@ #include "cobalt/dom/test_runner.h" #endif // ENABLE_TEST_RUNNER #include "cobalt/dom/window_timers.h" -#include "cobalt/input/input_poller.h" +#include "cobalt/input/camera_3d.h" #include "cobalt/loader/decoder.h" #include "cobalt/loader/fetcher_factory.h" #include "cobalt/loader/font/remote_typeface_cache.h" @@ -131,7 +131,7 @@ const base::Closure& window_close_callback, const base::Closure& window_minimize_callback, system_window::SystemWindow* system_window, - const scoped_refptr<input::InputPoller>& input_poller, + const scoped_refptr<input::Camera3D>& camera_3d, const scoped_refptr<cobalt::media_session::MediaSession>& media_session, int csp_insecure_allowed_token = 0, int dom_max_element_depth = 0);
diff --git a/src/cobalt/input/camera_3d.h b/src/cobalt/input/camera_3d.h new file mode 100644 index 0000000..5138c80 --- /dev/null +++ b/src/cobalt/input/camera_3d.h
@@ -0,0 +1,82 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef COBALT_INPUT_CAMERA_3D_H_ +#define COBALT_INPUT_CAMERA_3D_H_ + +#include "base/memory/ref_counted.h" +#include "cobalt/base/camera_transform.h" +#include "cobalt/input/input_poller.h" +#include "starboard/window.h" + +namespace cobalt { +namespace input { + +// Obtains camera parameters from hardware input to render a 3D scene. +// Interface to the Web module and Renderer module. Some settings may not apply +// depending on the specfic hardware implementation, so their setter methods +// have empty default implementations. +class Camera3D : public base::RefCountedThreadSafe<Camera3D> { + public: + enum CameraAxes { + // Restricted to [0deg, 360deg] + kCameraRoll = 0x00, + // Restricted to [-90deg, 90deg] + kCameraPitch = 0x01, + // Restricted to [0deg, 360deg] + kCameraYaw = 0x02, + }; + + // Functions to map input keys to camera controls. + virtual void CreateKeyMapping(int keycode, uint32 camera_axis, + float degrees_per_second) { + UNREFERENCED_PARAMETER(keycode); + UNREFERENCED_PARAMETER(camera_axis); + UNREFERENCED_PARAMETER(degrees_per_second); + } + virtual void ClearKeyMapping(int keycode) { UNREFERENCED_PARAMETER(keycode); } + virtual void ClearAllKeyMappings() {} + + // Return the camera's current view direction. + virtual base::CameraOrientation GetOrientation() const = 0; + + // The above methods are meant as an interface for the Camera3D's WebAPI on + // the WebModule thread, but the methods below will be accessed on the + // renderer thread. So, all the methods on this class may be synchronized to + // guard against these potentially parallel accesses. It is expected that the + // renderer will call them at a higher frequency than the WebModule. + + // Updates the camera's perspective parameters. + virtual void UpdatePerspective(float width_to_height_aspect_ratio, + float vertical_fov) { + UNREFERENCED_PARAMETER(width_to_height_aspect_ratio); + UNREFERENCED_PARAMETER(vertical_fov); + } + + // Returns the camera's view and projection matrices, setup according to the + // latest available orientation and perspective information. This queries the + // orientation from hardware inputs, and leaves it in the state of the class + // to be queried by GetOrientation(). + virtual base::CameraTransform GetCameraTransformAndUpdateOrientation() = 0; + + // Resets camera to default orientation. + virtual void Reset() {} + + virtual ~Camera3D() {} +}; + +} // namespace input +} // namespace cobalt + +#endif // COBALT_INPUT_CAMERA_3D_H_
diff --git a/src/cobalt/input/camera_3d_input_poller.cc b/src/cobalt/input/camera_3d_input_poller.cc new file mode 100644 index 0000000..95447a6 --- /dev/null +++ b/src/cobalt/input/camera_3d_input_poller.cc
@@ -0,0 +1,165 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "cobalt/input/camera_3d_input_poller.h" + +#include <algorithm> +#include <cmath> + +#include "cobalt/input/create_default_camera_3d.h" +#include "third_party/glm/glm/gtc/matrix_transform.hpp" +#include "third_party/glm/glm/gtx/transform.hpp" + +namespace cobalt { +namespace input { + +Camera3DInputPoller::Camera3DInputPoller( + const scoped_refptr<input::InputPoller>& input_poller) + : input_poller_(input_poller), + width_to_height_aspect_ratio_(16.0f / 9.0f), + vertical_fov_(60.0f) {} + +void Camera3DInputPoller::CreateKeyMapping(int keycode, uint32 camera_axis, + float degrees_per_second) { + base::AutoLock lock(mutex_); + keycode_map_[keycode] = KeycodeMappingInfo(camera_axis, degrees_per_second); +} + +void Camera3DInputPoller::ClearKeyMapping(int keycode) { + base::AutoLock lock(mutex_); + keycode_map_.erase(keycode); +} + +void Camera3DInputPoller::ClearAllKeyMappings() { + base::AutoLock lock(mutex_); + keycode_map_.clear(); +} + +base::CameraOrientation Camera3DInputPoller::GetOrientation() const { + base::AutoLock lock(mutex_); + return orientation_; +} + +namespace { + +const float kPiF = static_cast<float>(M_PI); + +float DegreesToRadians(float degrees) { return (degrees / 360.0f) * 2 * kPiF; } + +} // namespace + +base::CameraTransform +Camera3DInputPoller::GetCameraTransformAndUpdateOrientation() { + base::AutoLock lock(mutex_); + AccumulateOrientation(); + + // Note that we invert the rotation angles since this matrix is applied to + // the objects in our scene, and if the camera moves right, the objects, + // relatively, would move right. + glm::mat4 view_matrix = + glm::rotate(-DegreesToRadians(orientation_.roll), glm::vec3(0, 0, 1)) * + glm::rotate(-DegreesToRadians(orientation_.pitch), glm::vec3(1, 0, 0)) * + glm::rotate(-DegreesToRadians(orientation_.yaw), glm::vec3(0, 1, 0)); + + // Setup a (right-handed) perspective projection matrix. + const float kNearZ = 0.01f; + const float kFarZ = 1000.0f; + glm::mat4 projection_matrix = glm::perspectiveRH( + vertical_fov_, width_to_height_aspect_ratio_, kNearZ, kFarZ); + + return base::CameraTransform(projection_matrix, view_matrix); +} + +void Camera3DInputPoller::UpdatePerspective(float width_to_height_aspect_ratio, + float vertical_fov) { + width_to_height_aspect_ratio_ = width_to_height_aspect_ratio; + vertical_fov_ = vertical_fov; +} + +void Camera3DInputPoller::Reset() { + base::AutoLock lock(mutex_); + orientation_ = base::CameraOrientation(); +} + +void Camera3DInputPoller::AccumulateOrientation() { + if (!input_poller_) { + // Nothing to do if no input poller was provided. + return; + } + + base::TimeTicks now = base::TimeTicks::Now(); + if (last_update_) { + base::TimeDelta delta = now - *last_update_; + // Cap out the maximum time delta that we will accumulate changes over, to + // avoid a random extra long time delta that completely changes the camera + // orientation. + const base::TimeDelta kMaxTimeDelta = base::TimeDelta::FromMilliseconds(40); + if (delta > kMaxTimeDelta) { + delta = kMaxTimeDelta; + } + + for (KeycodeMap::const_iterator iter = keycode_map_.begin(); + iter != keycode_map_.end(); ++iter) { + // If the key does not have analog output, the AnalogInput() method will + // always return 0.0f, so check this first, and if it is indeed 0, + // fallback to a check to see if the button is digital and pressed. + float value = input_poller_->AnalogInput(static_cast<SbKey>(iter->first)); + if (value == 0.0f) { + value = input_poller_->IsPressed(static_cast<SbKey>(iter->first)) + ? 1.0f + : 0.0f; + } + + // Get a pointer to the camera axis angle that this key is bound to. + float* target_angle; + switch (iter->second.axis) { + case kCameraRoll: + target_angle = &orientation_.roll; + break; + case kCameraPitch: + target_angle = &orientation_.pitch; + break; + case kCameraYaw: + target_angle = &orientation_.yaw; + break; + } + + // Apply the angle adjustment from the key. + *target_angle += value * iter->second.degrees_per_second * + static_cast<float>(delta.InSecondsF()); + + // Apply any clamping or wrapping to the resulting camera angles. + if (iter->second.axis == kCameraPitch) { + *target_angle = std::min(90.0f, std::max(-90.0f, *target_angle)); + } else { + *target_angle = static_cast<float>(fmod(*target_angle, 360)); + if (*target_angle < 0) { + *target_angle += 360; + } + } + } + } + last_update_ = now; +} + +scoped_refptr<Camera3D> CreatedDefaultCamera3D( + SbWindow window, const scoped_refptr<InputPoller>& input_poller) { + UNREFERENCED_PARAMETER(window); + return new Camera3DInputPoller(input_poller); +} + +} // namespace input +} // namespace cobalt
diff --git a/src/cobalt/input/camera_3d_input_poller.h b/src/cobalt/input/camera_3d_input_poller.h new file mode 100644 index 0000000..bd89ad5 --- /dev/null +++ b/src/cobalt/input/camera_3d_input_poller.h
@@ -0,0 +1,91 @@ +/* + * Copyright 2017 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef COBALT_INPUT_CAMERA_3D_INPUT_POLLER_H_ +#define COBALT_INPUT_CAMERA_3D_INPUT_POLLER_H_ + +#include <map> +#include <utility> + +#include "base/optional.h" +#include "base/synchronization/lock.h" +#include "cobalt/input/camera_3d.h" +#include "cobalt/input/input_poller.h" +#include "third_party/glm/glm/mat4x4.hpp" + +namespace cobalt { +namespace input { + +// Implements a camera that gets its orientation information from hand- +// controlled inputs. +class Camera3DInputPoller : public Camera3D { + public: + explicit Camera3DInputPoller( + const scoped_refptr<input::InputPoller>& input_poller); + + void CreateKeyMapping(int keycode, uint32 camera_axis, + float degrees_per_second) OVERRIDE; + void ClearKeyMapping(int keycode) OVERRIDE; + void ClearAllKeyMappings() OVERRIDE; + base::CameraOrientation GetOrientation() const OVERRIDE; + + // Returns the camera transforms based on hand-controlled inputs mapped + // by the functions above + base::CameraTransform GetCameraTransformAndUpdateOrientation() OVERRIDE; + + virtual void UpdatePerspective(float width_to_height_aspect_ratio, + float vertical_fov) OVERRIDE; + + virtual void Reset() OVERRIDE; + + private: + struct KeycodeMappingInfo { + KeycodeMappingInfo() : axis(0), degrees_per_second(0.0f) {} + KeycodeMappingInfo(uint32 axis, float degrees_per_second) + : axis(axis), degrees_per_second(degrees_per_second) {} + + uint32 axis; + float degrees_per_second; + }; + + typedef std::map<int, KeycodeMappingInfo> KeycodeMap; + + void AccumulateOrientation(); + + mutable base::Lock mutex_; + + // The current accumulated camera orientation state. + base::CameraOrientation orientation_; + + // The time that the last update to the camera's state has occurred. + base::optional<base::TimeTicks> last_update_; + + // A map of keys bound to camera movements. + KeycodeMap keycode_map_; + + // The input poller from which we can check the state of a given key. + scoped_refptr<input::InputPoller> input_poller_; + + float width_to_height_aspect_ratio_; + float vertical_fov_; + + DISALLOW_COPY_AND_ASSIGN(Camera3DInputPoller); +}; + +} // namespace input +} // namespace cobalt + +#endif // COBALT_INPUT_CAMERA_3D_INPUT_POLLER_H_
diff --git a/src/cobalt/input/create_default_camera_3d.h b/src/cobalt/input/create_default_camera_3d.h new file mode 100644 index 0000000..a9859a4 --- /dev/null +++ b/src/cobalt/input/create_default_camera_3d.h
@@ -0,0 +1,32 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef COBALT_INPUT_CREATE_DEFAULT_CAMERA_3D_H_ +#define COBALT_INPUT_CREATE_DEFAULT_CAMERA_3D_H_ + +#include "base/memory/ref_counted.h" +#include "cobalt/input/camera_3d.h" +#include "cobalt/input/input_poller.h" +#include "starboard/window.h" + +namespace cobalt { +namespace input { + +scoped_refptr<Camera3D> CreatedDefaultCamera3D( + SbWindow window, const scoped_refptr<InputPoller>& input_poller); + +} // namespace input +} // namespace cobalt + +#endif // COBALT_INPUT_CREATE_DEFAULT_CAMERA_3D_H_
diff --git a/src/cobalt/input/input.gyp b/src/cobalt/input/input.gyp index 27a850e..b220f36 100644 --- a/src/cobalt/input/input.gyp +++ b/src/cobalt/input/input.gyp
@@ -18,6 +18,8 @@ 'target_name': 'input', 'type': 'static_library', 'sources': [ + 'camera_3d.h', + 'create_default_camera_3d.h', 'input_device_manager.h', 'input_device_manager_fuzzer.cc', 'input_device_manager_fuzzer.h', @@ -52,6 +54,17 @@ 'input_device_manager_desktop.h', ], }], + ['enable_vr==1', { + 'sources': [ + 'private/camera_3d_vr.cc', + 'private/camera_3d_vr.h', + ], + }, { # enable_vr!=1 + 'sources': [ + 'camera_3d_input_poller.cc', + 'camera_3d_input_poller.h', + ], + }], ], }, ],
diff --git a/src/cobalt/input/input_device_manager.h b/src/cobalt/input/input_device_manager.h index ccd0991..4dae106 100644 --- a/src/cobalt/input/input_device_manager.h +++ b/src/cobalt/input/input_device_manager.h
@@ -15,6 +15,7 @@ #ifndef COBALT_INPUT_INPUT_DEVICE_MANAGER_H_ #define COBALT_INPUT_INPUT_DEVICE_MANAGER_H_ +#include "cobalt/input/camera_3d.h" #include "cobalt/input/input_poller.h" #include "cobalt/input/key_event_handler.h" @@ -41,12 +42,16 @@ virtual ~InputDeviceManager() {} scoped_refptr<InputPoller> input_poller() { return input_poller_; } + scoped_refptr<Camera3D> camera_3d() { return camera_3d_; } protected: InputDeviceManager() {} // Used for polling the input outside of InputDeviceManager. scoped_refptr<InputPoller> input_poller_; + + // Used for holding the 3D camera state. + scoped_refptr<Camera3D> camera_3d_; }; } // namespace input
diff --git a/src/cobalt/input/input_device_manager_desktop.cc b/src/cobalt/input/input_device_manager_desktop.cc index 7d291ac..5925fe8 100644 --- a/src/cobalt/input/input_device_manager_desktop.cc +++ b/src/cobalt/input/input_device_manager_desktop.cc
@@ -16,6 +16,7 @@ #include <string> +#include "cobalt/input/create_default_camera_3d.h" #include "cobalt/input/input_poller_impl.h" #include "cobalt/system_window/input_event.h" @@ -31,6 +32,10 @@ base::Unretained(this))), keypress_generator_filter_(callback) { input_poller_ = new InputPollerImpl(); + DCHECK(system_window_); + camera_3d_ = + CreatedDefaultCamera3D(system_window->GetSbWindow(), input_poller_); + if (system_window_) { // Add this object's keyboard event callback to the system window. system_window_->event_dispatcher()->AddEventCallback(
diff --git a/src/cobalt/layout/layout_manager.cc b/src/cobalt/layout/layout_manager.cc index 88f5a41..c5be2b6 100644 --- a/src/cobalt/layout/layout_manager.cc +++ b/src/cobalt/layout/layout_manager.cc
@@ -14,6 +14,7 @@ #include "cobalt/layout/layout_manager.h" +#include <algorithm> #include <cmath> #include <string> @@ -104,14 +105,22 @@ namespace { void UpdateCamera( - float width_to_height_aspect_ratio, scoped_refptr<dom::Camera3DImpl> camera, + float width_to_height_aspect_ratio, scoped_refptr<input::Camera3D> camera, float max_horizontal_fov_rad, float max_vertical_fov_rad, render_tree::MatrixTransform3DNode::Builder* transform_node_builder, base::TimeDelta time) { UNREFERENCED_PARAMETER(time); - transform_node_builder->transform = camera->QueryViewPerspectiveMatrix( - width_to_height_aspect_ratio, max_horizontal_fov_rad, - max_vertical_fov_rad); + float vertical_fov_rad = + std::min(max_vertical_fov_rad, + 2 * static_cast<float>(atan(tan(max_horizontal_fov_rad * 0.5f) / + width_to_height_aspect_ratio))); + camera->UpdatePerspective(width_to_height_aspect_ratio, vertical_fov_rad); + base::CameraTransform transform( + camera->GetCameraTransformAndUpdateOrientation()); + DCHECK(!transform.right_eye); + transform_node_builder->transform = + transform.left_eye_or_mono.projection_matrix * + transform.left_eye_or_mono.view_matrix; } scoped_refptr<render_tree::Node> AttachCameraNodes(
diff --git a/src/cobalt/layout/replaced_box.cc b/src/cobalt/layout/replaced_box.cc index 4811118..c687b10 100644 --- a/src/cobalt/layout/replaced_box.cc +++ b/src/cobalt/layout/replaced_box.cc
@@ -657,11 +657,21 @@ scoped_refptr<render_tree::Node> filter_node = new FilterNode(MapToMeshFilter(stereo_mode, builder), animate_node); - // Attach a 3D camera to the map-to-mesh node. +#if !SB_HAS(VIRTUAL_REALITY) + // Attach a 3D camera to the map-to-mesh node, so the rendering of its + // content can be transformed. border_node_builder->AddChild( used_style_provider()->attach_camera_node_function().Run( filter_node, mtm_function->horizontal_fov_in_radians(), mtm_function->vertical_fov_in_radians())); +#else + // Camera node unnecessary in VR, since the 3D scene is completely immersive, + // and the whole render tree is placed within it and subject to camera + // transforms, not just the map-to-mesh node. + // TODO: Reconcile both paths with respect to this if Cobalt adopts a global + // camera or a document-wide notion of 3D space layout. + border_node_builder->AddChild(filter_node); +#endif } void ReplacedBox::RenderAndAnimateContentWithLetterboxing(
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..7a6e6eb --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..962cc4b --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 150px; + box-shadow: -15px 20px 10px -10px rgb(0, 0, 0) inset; + border-radius: 75px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..72b9bc4 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..b23b31e --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 150px; + box-shadow: -10px 10px 25px 25px rgb(0, 0, 0) inset; + border-radius: 75px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..59ab8f9 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..fde861b --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 150px; + box-shadow: -15px 20px 10px -10px rgb(0, 0, 0); + border-radius: 75px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..37dad12 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..a50cd60 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-circle-with-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 150px; + box-shadow: -10px 10px 25px 25px rgb(0, 0, 0); + border-radius: 75px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners-expected.png new file mode 100644 index 0000000..d5224b4 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners.html new file mode 100644 index 0000000..5ca1fd3 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-negative-spread-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: -15px 20px 10px -10px rgb(0, 0, 0) inset; + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners-expected.png new file mode 100644 index 0000000..c66a8f7 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners.html new file mode 100644 index 0000000..ed1a91b --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: -10px 10px 0px 5px rgb(0, 0, 0) inset; + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..7951ab2 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..4723bb4 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-inset-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: -10px 10px 25px 5px rgb(0, 0, 0) inset; + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners-expected.png new file mode 100644 index 0000000..2619297 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners.html new file mode 100644 index 0000000..df40829 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-negative-spread-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: -15px 20px 10px -10px rgb(0, 0, 0); + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners-expected.png new file mode 100644 index 0000000..0ca9935 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners.html new file mode 100644 index 0000000..33a9f70 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: 10px 10px 0px 25px rgb(0, 0, 0); + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners-expected.png b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners-expected.png new file mode 100644 index 0000000..7e22074 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners.html b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners.html new file mode 100644 index 0000000..42edb67 --- /dev/null +++ b/src/cobalt/layout_tests/testdata/css3-background/7-1-box-shadow-with-spread-blur-and-rounded-corners.html
@@ -0,0 +1,22 @@ +<!DOCTYPE html> +<!-- + | Tests that a box shadow works with both spread, blur and rounded corners. + --> +<html> +<head> + <style> + div { + position: absolute; + left: 20px; + top: 20px; + width: 150px; + height: 100px; + box-shadow: 10px 10px 25px 25px rgb(0, 0, 0); + border-radius: 20px; + } + </style> +</head> +<body> + <div></div> +</body> +</html>
diff --git a/src/cobalt/layout_tests/testdata/css3-background/layout_tests.txt b/src/cobalt/layout_tests/testdata/css3-background/layout_tests.txt index 2d35370..2c12a56 100644 --- a/src/cobalt/layout_tests/testdata/css3-background/layout_tests.txt +++ b/src/cobalt/layout_tests/testdata/css3-background/layout_tests.txt
@@ -60,9 +60,9 @@ 14-2-1-background-with-repeat-position-image-color 14-2-1-multiple-layers-background-image 3-10-background-none-declares-initial-value-for-background-color +3-11-2-body-background-can-be-set-to-transparent-later 3-11-2-propagate-computed-value-of-background-from-body-to-root 3-11-2-propagate-computed-value-of-background-from-html-to-root -3-11-2-body-background-can-be-set-to-transparent-later 4-0-border-color-with-solid-border-style 4-0-border-color-with-solid-border-style-and-background-color 4-0-border-set-using-border-color-and-border-style @@ -87,11 +87,22 @@ 7-1-1-outset-box-shadow-applies-to-border-box 7-1-2-box-shadow-with-blur 7-1-box-shadow-appears-even-with-overflow-hidden +7-1-box-shadow-circle-with-inset-negative-spread-blur-and-rounded-corners +7-1-box-shadow-circle-with-inset-spread-blur-and-rounded-corners +7-1-box-shadow-circle-with-negative-spread-blur-and-rounded-corners +7-1-box-shadow-circle-with-spread-blur-and-rounded-corners 7-1-box-shadow-offset-top-left 7-1-box-shadow-with-inset-and-outset-blur +7-1-box-shadow-with-inset-negative-spread-and-rounded-corners +7-1-box-shadow-with-inset-spread-and-rounded-corners +7-1-box-shadow-with-inset-spread-blur-and-rounded-corners +7-1-box-shadow-with-negative-spread-and-rounded-corners 7-1-box-shadow-with-spread-and-blur +7-1-box-shadow-with-spread-and-rounded-corners +7-1-box-shadow-with-spread-blur-and-rounded-corners 7-1-circle-box-shadow-offset-top-left 7-1-circle-box-shadow-with-inset 7-1-circle-box-shadow-with-spread 7-1-simple-black-box-shadow 7-1-simple-red-box-shadow +
diff --git a/src/cobalt/layout_tests/testdata/css3-fonts/5-2-use-numerical-font-weights-in-family-face-matching-expected.png b/src/cobalt/layout_tests/testdata/css3-fonts/5-2-use-numerical-font-weights-in-family-face-matching-expected.png index 2b69abe..c0f8d5e 100644 --- a/src/cobalt/layout_tests/testdata/css3-fonts/5-2-use-numerical-font-weights-in-family-face-matching-expected.png +++ b/src/cobalt/layout_tests/testdata/css3-fonts/5-2-use-numerical-font-weights-in-family-face-matching-expected.png Binary files differ
diff --git a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt index 8363eef..87dab78 100644 --- a/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt +++ b/src/cobalt/layout_tests/testdata/web-platform-tests/XMLHttpRequest/web_platform_tests.txt
@@ -142,7 +142,7 @@ send-conditional.htm,FAIL send-content-type-charset.htm,FAIL send-content-type-string.htm,FAIL -send-data-arraybuffer.htm,FAIL +send-data-arraybuffer.htm,PASS send-data-blob.htm,FAIL send-data-es-object.htm,DISABLE send-data-unexpected-tostring.htm,FAIL
diff --git a/src/cobalt/render_tree/resource_provider.h b/src/cobalt/render_tree/resource_provider.h index aa716d7..69e0f6c 100644 --- a/src/cobalt/render_tree/resource_provider.h +++ b/src/cobalt/render_tree/resource_provider.h
@@ -97,7 +97,7 @@ // Return the associated SbDecodeTargetProvider with the ResourceProvider, // if it exists. Returns NULL if SbDecodeTarget is not supported. virtual SbDecodeTargetProvider* GetSbDecodeTargetProvider() = 0; -#endif // SB_VERSION(3) && SB_HAS(GRAPHICS) +#endif // SB__API_VERSION >= 4 #endif // SB_HAS(GRAPHICS) // Returns a raw chunk of memory that can later be passed into a function like
diff --git a/src/cobalt/render_tree/resource_provider_stub.h b/src/cobalt/render_tree/resource_provider_stub.h index 84658d8..5d33cd0 100644 --- a/src/cobalt/render_tree/resource_provider_stub.h +++ b/src/cobalt/render_tree/resource_provider_stub.h
@@ -223,6 +223,7 @@ bool SupportsSbDecodeTarget() OVERRIDE { return false; } #endif // SB_API_VERSION >= 3 && SB_HAS(GRAPHICS) +#if SB_HAS(GRAPHICS) #if SB_API_VERSION >= 4 SbDecodeTargetGraphicsContextProvider* GetSbDecodeTargetGraphicsContextProvider() OVERRIDE { @@ -231,6 +232,7 @@ #elif SB_API_VERSION >= 3 SbDecodeTargetProvider* GetSbDecodeTargetProvider() OVERRIDE { return NULL; } #endif // SB_API_VERSION >= 4 +#endif // SB_HAS(GRAPHICS) scoped_ptr<RawImageMemory> AllocateRawImageMemory(size_t size_in_bytes, size_t alignment) OVERRIDE {
diff --git a/src/cobalt/renderer/copy_font_data.gypi b/src/cobalt/renderer/copy_font_data.gypi index 971f550..b62574e 100644 --- a/src/cobalt/renderer/copy_font_data.gypi +++ b/src/cobalt/renderer/copy_font_data.gypi
@@ -22,10 +22,10 @@ 'conditions': [ [ 'cobalt_font_package == "expanded"', { - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/common', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/common', 'package_named_sans_serif': 4, - 'package_named_serif': 4, + 'package_named_serif': 3, 'package_named_fcc_fonts': 2, 'package_fallback_lang_non_cjk': 2, 'package_fallback_lang_cjk': 2, @@ -37,9 +37,9 @@ # 'unlimited' is deprecated but is mapped to 'standard' [ 'cobalt_font_package == "standard" or cobalt_font_package == "unlimited"', { - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/common', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/common', - 'package_named_sans_serif': 3, + 'package_named_sans_serif': 4, 'package_named_serif': 3, 'package_named_fcc_fonts': 2, 'package_fallback_lang_non_cjk': 2, @@ -50,9 +50,9 @@ 'package_fallback_symbols': 1, }], - # '10megabytes' is deprecated but is mapped to 'limited_with_noto_jp' + # '10megabytes' is deprecated but is mapped to 'limited_with_jp' [ 'cobalt_font_package == "limited_with_jp" or cobalt_font_package == "10megabytes"', { - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/common', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/common', 'package_named_sans_serif': 2, 'package_named_serif': 0, @@ -66,7 +66,7 @@ }], [ 'cobalt_font_package == "limited"', { - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/common', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/common', 'package_named_sans_serif': 2, 'package_named_serif': 0, @@ -80,7 +80,7 @@ }], [ 'cobalt_font_package == "minimal"', { - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/common', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/common', 'package_named_sans_serif': 0, 'package_named_serif': 0, @@ -97,7 +97,7 @@ # fonts.xml contains a superset of what we expect to find on Android # devices. The Android SbFile implementation falls back to system font # files for those not in cobalt content. - 'source_xml_file_dir': '<(static_contents_source_dir)/fonts/xml/android', + 'source_font_config_dir': '<(static_contents_source_dir)/fonts/config/android', # Emojis are currently included because Cobalt's version of Skia does # not support Android's color emojis and will be removed when Skia is @@ -147,7 +147,7 @@ { 'destination': '<(static_contents_output_data_dir)/fonts/', 'files': [ - '<(source_xml_file_dir)/fonts.xml', + '<(source_font_config_dir)/fonts.xml', ], 'conditions': [ [ 'package_named_sans_serif == 0', { @@ -171,6 +171,18 @@ '<(source_font_files_dir)/Roboto-BoldItalic.ttf', ], }], + [ 'package_named_sans_serif >= 4', { + 'files+': [ + '<(source_font_files_dir)/Roboto-Thin.ttf', + '<(source_font_files_dir)/Roboto-ThinItalic.ttf', + '<(source_font_files_dir)/Roboto-Light.ttf', + '<(source_font_files_dir)/Roboto-LightItalic.ttf', + '<(source_font_files_dir)/Roboto-Medium.ttf', + '<(source_font_files_dir)/Roboto-MediumItalic.ttf', + '<(source_font_files_dir)/Roboto-Black.ttf', + '<(source_font_files_dir)/Roboto-BlackItalic.ttf', + ], + }], [ 'package_named_serif >= 1', { 'files+': [ '<(source_font_files_dir)/NotoSerif-Regular.ttf',
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color.glsl new file mode 100644 index 0000000..418d2b8 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color.glsl
@@ -0,0 +1,26 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec3 ucircle_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = + vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = + (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0).aaaa); + } + vec4 output_Stage1; + { + // Stage 1: Circle + float d = length(ucircle_Stage1.xy - fragCoordYDown.xy) - ucircle_Stage1.z; + d = clamp(d, 0.0, 1.0); + output_Stage1 = (output_Stage0 * d); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color_negative.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color_negative.glsl new file mode 100644 index 0000000..00529b7 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_alpha_texcoords_and_color_negative.glsl
@@ -0,0 +1,26 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec3 ucircle_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = + vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = + (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0).aaaa); + } + vec4 output_Stage1; + { + // Stage 1: Circle + float d = ucircle_Stage1.z - length(fragCoordYDown.xy - ucircle_Stage1.xy); + d = clamp(d, 0.0, 1.0); + output_Stage1 = (output_Stage0 * d); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_circle_edge.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_circle_edge.glsl new file mode 100644 index 0000000..2bfdc7f --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_circle_edge.glsl
@@ -0,0 +1,33 @@ +#version 100 +precision mediump float; +uniform vec3 ucircle_Stage1; +uniform float uRTHeight; +uniform vec3 ucircle_Stage2; +varying vec4 vColor; +varying vec4 vCircleEdge_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: CircleEdge + float d = length(vCircleEdge_Stage0.xy); + float edgeAlpha = clamp(vCircleEdge_Stage0.z - d, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: Circle + float d = length(ucircle_Stage1.xy - fragCoordYDown.xy) - ucircle_Stage1.z; + d = clamp(d, 0.0, 1.0); + output_Stage1 = (output_Stage0 * d); + } + vec4 output_Stage2; + { + // Stage 2: Circle + float d = ucircle_Stage2.z - length(fragCoordYDown.xy - ucircle_Stage2.xy); + d = clamp(d, 0.0, 1.0); + output_Stage2 = (output_Stage1 * d); + } + gl_FragColor = (vColor * output_Stage2); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_texture_negative.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_texture_negative.glsl new file mode 100644 index 0000000..9d74546 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circle_masked_texture_negative.glsl
@@ -0,0 +1,24 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec3 ucircle_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + vec4 output_Stage1; + { + // Stage 1: Circle + float d = length(ucircle_Stage1.xy - fragCoordYDown.xy) - ucircle_Stage1.z; + d = clamp(d, 0.0, 1.0); + output_Stage1 = (output_Stage0 * d); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_circle_edge.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_circle_edge.glsl new file mode 100644 index 0000000..81428de --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_circle_edge.glsl
@@ -0,0 +1,29 @@ +#version 100 +precision mediump float; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec4 vCircleEdge_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: CircleEdge + float d = length(vCircleEdge_Stage0.xy); + float edgeAlpha = clamp(vCircleEdge_Stage0.z - d, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + alpha = 1.0 - alpha; + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = (vColor * output_Stage1); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_gr_rrect_blur.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_gr_rrect_blur.glsl new file mode 100644 index 0000000..78f115b --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_gr_rrect_blur.glsl
@@ -0,0 +1,52 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uproxyRect_Stage0; +uniform float ucornerRadius_Stage0; +uniform float ublurRadius_Stage0; +uniform float uRTHeight; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +varying vec4 vColor; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: GrRRectBlur + vec2 rectCenter = (uproxyRect_Stage0.xy + uproxyRect_Stage0.zw)/2.0; + vec2 translatedFragPos = fragCoordYDown.xy - uproxyRect_Stage0.xy; + float threshold = ucornerRadius_Stage0 + 2.0*ublurRadius_Stage0; + vec2 middle = uproxyRect_Stage0.zw - uproxyRect_Stage0.xy - 2.0*threshold; + if (translatedFragPos.x >= threshold && translatedFragPos.x < (middle.x+threshold)) + { + translatedFragPos.x = threshold; + } + else if (translatedFragPos.x >= (middle.x + threshold)) + { + translatedFragPos.x -= middle.x - 1.0; + } + if (translatedFragPos.y > threshold && translatedFragPos.y < (middle.y+threshold)) + { + translatedFragPos.y = threshold; + } + else if (translatedFragPos.y >= (middle.y + threshold)) + { + translatedFragPos.y -= middle.y - 1.0; + } + vec2 proxyDims = vec2(2.0*threshold+1.0); + vec2 texCoord = translatedFragPos / proxyDims; + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, texCoord).aaaa); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + alpha = 1.0 - alpha; + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_blur.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_blur.glsl new file mode 100644 index 0000000..c363929 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_blur.glsl
@@ -0,0 +1,47 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uproxyRect_Stage0; +uniform float uprofileSize_Stage0; +uniform float uRTHeight; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +varying vec4 vColor; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: RectBlur + vec4 src=vColor; + vec2 translatedPos = fragCoordYDown.xy - uproxyRect_Stage0.xy; + float width = uproxyRect_Stage0.z - uproxyRect_Stage0.x; + float height = uproxyRect_Stage0.w - uproxyRect_Stage0.y; + vec2 smallDims = vec2(width - uprofileSize_Stage0, height-uprofileSize_Stage0); + float center = 2.0 * floor(uprofileSize_Stage0/2.0 + .25) - 1.0; + vec2 wh = smallDims - vec2(center,center); + float horiz_lookup; + { + float coord = (0.5 * (abs(2.0*translatedPos.x - width) - wh.x))/uprofileSize_Stage0; + horiz_lookup = texture2D(uSampler0_Stage0, vec2(coord,0.5)).aaaa.a; + } + float vert_lookup; + { + float coord = (0.5 * (abs(2.0*translatedPos.y - height) - wh.y))/uprofileSize_Stage0; + vert_lookup = texture2D(uSampler0_Stage0, vec2(coord,0.5)).aaaa.a; + } + float final = horiz_lookup * vert_lookup; + output_Stage0 = src * vec4(final); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + alpha = 1.0 - alpha; + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_ring.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_ring.glsl new file mode 100644 index 0000000..d76962f --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_rect_ring.glsl
@@ -0,0 +1,45 @@ +#version 100 +precision mediump float; +uniform vec4 urect_Stage0; +uniform float uRTHeight; +uniform vec4 urect_Stage1; +uniform vec4 uinnerRect_Stage2; +uniform float uradiusPlusHalf_Stage2; +varying vec4 vColor; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: AARect + float xSub, ySub; + xSub = min(fragCoordYDown.x - urect_Stage0.x, 0.0); + xSub += min(urect_Stage0.z - fragCoordYDown.x, 0.0); + ySub = min(fragCoordYDown.y - urect_Stage0.y, 0.0); + ySub += min(urect_Stage0.w - fragCoordYDown.y, 0.0); + float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0)); + alpha = 1.0 - alpha; + output_Stage0 = (vColor * alpha); + } + vec4 output_Stage1; + { + // Stage 1: AARect + float xSub, ySub; + xSub = min(fragCoordYDown.x - urect_Stage1.x, 0.0); + xSub += min(urect_Stage1.z - fragCoordYDown.x, 0.0); + ySub = min(fragCoordYDown.y - urect_Stage1.y, 0.0); + ySub += min(urect_Stage1.w - fragCoordYDown.y, 0.0); + float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0)); + output_Stage1 = (output_Stage0 * alpha); + } + vec4 output_Stage2; + { + // Stage 2: CircularRRect + vec2 dxy0 = uinnerRect_Stage2.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage2.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage2 - length(dxy), 0.0, 1.0); + output_Stage2 = (output_Stage1 * alpha); + } + gl_FragColor = output_Stage2; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture.glsl new file mode 100644 index 0000000..17a7770 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture.glsl
@@ -0,0 +1,27 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture_negative.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture_negative.glsl new file mode 100644 index 0000000..0c3de5d --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_circular_rrect_masked_texture_negative.glsl
@@ -0,0 +1,28 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + alpha = 1.0 - alpha; + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_rrect.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_rrect.glsl new file mode 100644 index 0000000..411e72a --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_rrect.glsl
@@ -0,0 +1,39 @@ +#version 100 +precision mediump float; +uniform vec4 uinnerRect_Stage1; +uniform float uRTHeight; +uniform vec2 uinvRadiiXY_Stage1; +varying vec4 vColor; +varying vec2 vEllipseOffsets_Stage0; +varying vec4 vEllipseRadii_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: EllipseEdge + vec2 scaledOffset = vEllipseOffsets_Stage0*vEllipseRadii_Stage0.xy; + float test = dot(scaledOffset, scaledOffset) - 1.0; + vec2 grad = 2.0*scaledOffset*vEllipseRadii_Stage0.xy; + float grad_dot = dot(grad, grad); + grad_dot = max(grad_dot, 1.0e-4); + float invlen = inversesqrt(grad_dot); + float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage1; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 + approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = (vColor * output_Stage1); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_texture_negative.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_texture_negative.glsl new file mode 100644 index 0000000..0c57707 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_masked_texture_negative.glsl
@@ -0,0 +1,33 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uellipse_Stage1; +uniform float uRTHeight; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; + +void main() { + vec4 fragCoordYDown = + vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + + vec4 output_Stage1; + { + // Stage 1: Ellipse + vec2 d = fragCoordYDown.xy - uellipse_Stage1.xy; + vec2 Z = d * uellipse_Stage1.zw; + float implicit = dot(Z, d) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 + approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + + gl_FragColor = output_Stage1; +} \ No newline at end of file
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_ring_masked_color.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_ring_masked_color.glsl new file mode 100644 index 0000000..6616121 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_ellipse_ring_masked_color.glsl
@@ -0,0 +1,49 @@ +#version 100 +precision mediump float; +uniform vec4 uellipse_Stage1; +uniform float uRTHeight; +uniform vec4 uellipse_Stage2; +varying vec4 vColor; +varying vec2 vEllipseOffsets_Stage0; +varying vec4 vEllipseRadii_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: EllipseEdge + vec2 scaledOffset = vEllipseOffsets_Stage0*vEllipseRadii_Stage0.xy; + float test = dot(scaledOffset, scaledOffset) - 1.0; + vec2 grad = 2.0*scaledOffset*vEllipseRadii_Stage0.xy; + float grad_dot = dot(grad, grad); + grad_dot = max(grad_dot, 1.0e-4); + float invlen = inversesqrt(grad_dot); + float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: Ellipse + vec2 d = fragCoordYDown.xy - uellipse_Stage1.xy; + vec2 Z = d * uellipse_Stage1.zw; + float implicit = dot(Z, d) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 + approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + vec4 output_Stage2; + { + // Stage 2: Ellipse + vec2 d = fragCoordYDown.xy - uellipse_Stage2.xy; + vec2 Z = d * uellipse_Stage2.zw; + float implicit = dot(Z, d) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 - approx_dist, 0.0, 1.0); + output_Stage2 = (output_Stage1 * alpha); + } + gl_FragColor = (vColor * output_Stage2); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rect_edge_masked_ellipse.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rect_edge_masked_ellipse.glsl new file mode 100644 index 0000000..054570a --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rect_edge_masked_ellipse.glsl
@@ -0,0 +1,50 @@ +#version 100 +precision mediump float; +uniform vec4 urect_Stage0; +uniform float uRTHeight; +uniform vec4 urect_Stage1; +uniform vec4 uinnerRect_Stage2; +uniform vec2 uinvRadiiXY_Stage2; +varying vec4 vColor; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: AARect + float xSub, ySub; + xSub = min(fragCoordYDown.x - urect_Stage0.x, 0.0); + xSub += min(urect_Stage0.z - fragCoordYDown.x, 0.0); + ySub = min(fragCoordYDown.y - urect_Stage0.y, 0.0); + ySub += min(urect_Stage0.w - fragCoordYDown.y, 0.0); + float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0)); + alpha = 1.0 - alpha; + output_Stage0 = (vColor * alpha); + } + vec4 output_Stage1; + { + // Stage 1: AARect + float xSub, ySub; + xSub = min(fragCoordYDown.x - urect_Stage1.x, 0.0); + xSub += min(urect_Stage1.z - fragCoordYDown.x, 0.0); + ySub = min(fragCoordYDown.y - urect_Stage1.y, 0.0); + ySub += min(urect_Stage1.w - fragCoordYDown.y, 0.0); + float alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0)); + output_Stage1 = (output_Stage0 * alpha); + } + vec4 output_Stage2; + { + // Stage 2: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage2.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage2.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage2; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 - approx_dist, 0.0, 1.0); + output_Stage2 = (output_Stage1 * alpha); + } + gl_FragColor = output_Stage2; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_circle_edge.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_circle_edge.glsl new file mode 100644 index 0000000..a74961c --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_circle_edge.glsl
@@ -0,0 +1,40 @@ +#version 100 +precision mediump float; +uniform vec4 uinnerRect_Stage1; +uniform float uradiusPlusHalf_Stage1; +uniform float uRTHeight; +uniform vec4 uinnerRect_Stage2; +uniform float uradiusPlusHalf_Stage2; +varying vec4 vColor; +varying vec4 vCircleEdge_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: CircleEdge + float d = length(vCircleEdge_Stage0.xy); + float edgeAlpha = clamp(vCircleEdge_Stage0.z - d, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: CircularRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage1 - length(dxy), 0.0, 1.0); + alpha = 1.0 - alpha; + output_Stage1 = (output_Stage0 * alpha); + } + vec4 output_Stage2; + { + // Stage 2: CircularRRect + vec2 dxy0 = uinnerRect_Stage2.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage2.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + float alpha = clamp(uradiusPlusHalf_Stage2 - length(dxy), 0.0, 1.0); + output_Stage2 = (output_Stage1 * alpha); + } + gl_FragColor = (vColor * output_Stage2); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture.glsl new file mode 100644 index 0000000..2a2574d --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture.glsl
@@ -0,0 +1,32 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uinnerRect_Stage1; +uniform float uRTHeight; +uniform vec2 uinvRadiiXY_Stage1; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + vec4 output_Stage1; + { + // Stage 1: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage1; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 - approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture_negative.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture_negative.glsl new file mode 100644 index 0000000..b2f1111 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_masked_texture_negative.glsl
@@ -0,0 +1,32 @@ +#version 100 +precision mediump float; +uniform sampler2D uSampler0_Stage0; +uniform vec4 uinnerRect_Stage1; +uniform float uRTHeight; +uniform vec2 uinvRadiiXY_Stage1; +varying vec4 vColor; +varying vec2 vMatrixCoord_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: Texture + output_Stage0 = (vColor * texture2D(uSampler0_Stage0, vMatrixCoord_Stage0)); + } + vec4 output_Stage1; + { + // Stage 1: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage1; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 + approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + gl_FragColor = output_Stage1; +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_ring_masked_ellipse_edge.glsl b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_ring_masked_ellipse_edge.glsl new file mode 100644 index 0000000..97428cf --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/fragment_skia_rrect_ring_masked_ellipse_edge.glsl
@@ -0,0 +1,55 @@ +#version 100 +precision mediump float; +uniform vec4 uinnerRect_Stage1; +uniform float uRTHeight; +uniform vec2 uinvRadiiXY_Stage1; +uniform vec4 uinnerRect_Stage2; +uniform vec2 uinvRadiiXY_Stage2; +varying vec4 vColor; +varying vec2 vEllipseOffsets_Stage0; +varying vec4 vEllipseRadii_Stage0; +void main() +{ + vec4 fragCoordYDown = vec4(gl_FragCoord.x, uRTHeight - gl_FragCoord.y, 1.0, 1.0); + vec4 output_Stage0; + { + // Stage 0: EllipseEdge + vec2 scaledOffset = vEllipseOffsets_Stage0*vEllipseRadii_Stage0.xy; + float test = dot(scaledOffset, scaledOffset) - 1.0; + vec2 grad = 2.0*scaledOffset*vEllipseRadii_Stage0.xy; + float grad_dot = dot(grad, grad); + grad_dot = max(grad_dot, 1.0e-4); + float invlen = inversesqrt(grad_dot); + float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0); + output_Stage0 = vec4(edgeAlpha); + } + vec4 output_Stage1; + { + // Stage 1: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage1.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage1.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage1; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 + approx_dist, 0.0, 1.0); + output_Stage1 = (output_Stage0 * alpha); + } + vec4 output_Stage2; + { + // Stage 2: EllipticalRRect + vec2 dxy0 = uinnerRect_Stage2.xy - fragCoordYDown.xy; + vec2 dxy1 = fragCoordYDown.xy - uinnerRect_Stage2.zw; + vec2 dxy = max(max(dxy0, dxy1), 0.0); + vec2 Z = dxy * uinvRadiiXY_Stage2; + float implicit = dot(Z, dxy) - 1.0; + float grad_dot = 4.0 * dot(Z, Z); + grad_dot = max(grad_dot, 1.0e-4); + float approx_dist = implicit * inversesqrt(grad_dot); + float alpha = clamp(0.5 - approx_dist, 0.0, 1.0); + output_Stage2 = (output_Stage1 * alpha); + } + gl_FragColor = (vColor * output_Stage2); +}
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/shaders.gypi b/src/cobalt/renderer/glimp_shaders/glsl/shaders.gypi index 7f7455c..2740656 100644 --- a/src/cobalt/renderer/glimp_shaders/glsl/shaders.gypi +++ b/src/cobalt/renderer/glimp_shaders/glsl/shaders.gypi
@@ -32,18 +32,31 @@ 'fragment_skia_antialiased_oval.glsl', 'fragment_skia_bounded_x_convolution_filtered_texture.glsl', 'fragment_skia_bounded_y_convolution_filtered_texture.glsl', + 'fragment_skia_circle_masked_alpha_texcoords_and_color.glsl', + 'fragment_skia_circle_masked_alpha_texcoords_and_color_negative.glsl', + 'fragment_skia_circle_masked_circle_edge.glsl', 'fragment_skia_circle_masked_texture.glsl', 'fragment_skia_circle_masked_texture_domain.glsl', + 'fragment_skia_circle_masked_texture_negative.glsl', 'fragment_skia_circle_outside_masked_circle.glsl', + 'fragment_skia_circular_rrect_masked_circle_edge.glsl', + 'fragment_skia_circular_rrect_masked_gr_rrect_blur.glsl', + 'fragment_skia_circular_rrect_masked_rect_blur.glsl', + 'fragment_skia_circular_rrect_masked_rect_ring.glsl', + 'fragment_skia_circular_rrect_masked_texture.glsl', + 'fragment_skia_circular_rrect_masked_texture_negative.glsl', 'fragment_skia_color_filtered_texture.glsl', 'fragment_skia_color_only.glsl', 'fragment_skia_color_with_coverage.glsl', 'fragment_skia_convolution_filtered_texture.glsl', 'fragment_skia_distance_field_texture.glsl', 'fragment_skia_distance_field_texture_non_similar.glsl', + 'fragment_skia_ellipse_masked_rrect.glsl', 'fragment_skia_ellipse_masked_texture.glsl', 'fragment_skia_ellipse_masked_texture_domain.glsl', + 'fragment_skia_ellipse_masked_texture_negative.glsl', 'fragment_skia_ellipse_outside_masked_ellipse.glsl', + 'fragment_skia_ellipse_ring_masked_color.glsl', 'fragment_skia_linear_gradient_many_colors.glsl', 'fragment_skia_linear_gradient_three_colors.glsl', 'fragment_skia_linear_gradient_two_colors.glsl', @@ -52,9 +65,14 @@ 'fragment_skia_radial_gradient_three_colors.glsl', 'fragment_skia_radial_gradient_two_colors.glsl', 'fragment_skia_rect_blur.glsl', + 'fragment_skia_rect_edge_masked_ellipse.glsl', 'fragment_skia_rect_outside_masked_color.glsl', 'fragment_skia_rect_outside_masked_rect_blur.glsl', 'fragment_skia_rect_outside_masked_texture.glsl', + 'fragment_skia_rrect_masked_circle_edge.glsl', + 'fragment_skia_rrect_masked_texture.glsl', + 'fragment_skia_rrect_masked_texture_negative.glsl', + 'fragment_skia_rrect_ring_masked_ellipse_edge.glsl', 'fragment_skia_texcoords_and_color.glsl', 'fragment_skia_texcoords_and_color_with_edge_clamped_texels.glsl', 'fragment_skia_texture_domain.glsl', @@ -68,6 +86,7 @@ 'vertex_skia_antialiased_oval.glsl', 'vertex_skia_color_only.glsl', 'vertex_skia_color_with_coverage.glsl', + 'vertex_skia_ellipse_edge.glsl', 'vertex_skia_texcoords_and_color.glsl', 'vertex_skia_texcoords_and_color_with_texcoord_matrix.glsl', 'vertex_skia_texcoords_derived_from_position.glsl',
diff --git a/src/cobalt/renderer/glimp_shaders/glsl/vertex_skia_ellipse_edge.glsl b/src/cobalt/renderer/glimp_shaders/glsl/vertex_skia_ellipse_edge.glsl new file mode 100644 index 0000000..358da94 --- /dev/null +++ b/src/cobalt/renderer/glimp_shaders/glsl/vertex_skia_ellipse_edge.glsl
@@ -0,0 +1,27 @@ +#version 100 +uniform mat3 uViewM; +uniform vec4 urtAdjustment; +attribute vec2 inPosition; +attribute vec4 inColor; +attribute vec2 inEllipseOffset; +attribute vec4 inEllipseRadii; +varying vec4 vColor; +varying vec2 vEllipseOffsets_Stage0; +varying vec4 vEllipseRadii_Stage0; +void main() +{ + vec3 pos3 = uViewM * vec3(inPosition, 1); + vColor = inColor; + { + // Stage 0: EllipseEdge + vEllipseOffsets_Stage0 = inEllipseOffset; + vEllipseRadii_Stage0 = inEllipseRadii; + } + { + // Stage 1: Ellipse + } + { + // Stage 2: Ellipse + } + gl_Position = vec4(dot(pos3.xz, urtAdjustment.xy), dot(pos3.yz, urtAdjustment.zw), 0, pos3.z); +}
diff --git a/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc b/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc index 664edb4..8f932a9 100644 --- a/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc +++ b/src/cobalt/renderer/rasterizer/egl/textured_mesh_renderer.cc
@@ -182,7 +182,7 @@ GL_CALL(glAttachShader(result.gl_program_id, blit_vertex_shader)); - std::string sampler_type = "sampler"; + std::string sampler_type = "sampler2D"; if (texture_target == GL_TEXTURE_EXTERNAL_OES) { sampler_type = "samplerExternalOES"; }
diff --git a/src/cobalt/renderer/rasterizer/pixel_test.cc b/src/cobalt/renderer/rasterizer/pixel_test.cc index 5700075..16b0c2a 100644 --- a/src/cobalt/renderer/rasterizer/pixel_test.cc +++ b/src/cobalt/renderer/rasterizer/pixel_test.cc
@@ -2674,13 +2674,438 @@ Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 0.0f)); } -TEST_F(PixelTest, BoxShadowWithInsetSpreadAndBlur) { +TEST_F(PixelTest, BoxShadowWithInset25pxSpreadAndBlur) { TestTree(CreateShadowRectWithBackground( output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f)); } +TEST_F(PixelTest, BoxShadowCircleWithInset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithOutset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithInset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, + BoxShadowCircleWithInset25pxSpread1pxBlurRoundedCornersAndNoOffset) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(0.0f, 0.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithOutset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithInset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithOutset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowCircleWithInset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, + BoxShadowBigCircleWithInset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 25, 150, 150), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(75, 75))); +} + +TEST_F(PixelTest, + BoxShadowCircleWithOutset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 50, 50), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(25, 25))); +} + +TEST_F(PixelTest, BoxShadowEllipseWithInset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, BoxShadowEllipseWithOutset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, BoxShadowEllipseWithInset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, + BoxShadowEllipseWithOutset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, BoxShadowEllipseWithInset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, + BoxShadowEllipseWithOutset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, + BoxShadowEllipseWithInset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, + BoxShadowBigEllipseWithInset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 25, 190, 150), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(95, 75))); +} + +TEST_F(PixelTest, + BoxShadowEllipseWithOutset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 140, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(70, 50))); +} + +TEST_F(PixelTest, BoxShadowWithInset5pxSpreadAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, BoxShadowWithOutset5pxSpreadAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpreadAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpreadAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, + 25.0f, RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, BoxShadowWithInset5pxSpread5pxBlurAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(0.0f, 0.0f), 5.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset5pxSpread5pxBlurAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(0.0f, 0.0f), 5.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset5pxSpreadAndDifferentRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(20, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset5pxSpreadAndDifferentRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 5.0f, + RoundedCorners(20, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset5pxSpread25pxBlurAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 25.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, BoxShadowWithOutset5pxSpread25pxBlurAndSameRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 25.0f, ColorRGBA(0, 0, 0, 1)), false, + 5.0f, RoundedCorners(20, 20))); +} + +TEST_F(PixelTest, + BoxShadowWithInset5pxSpread25pxBlurAndDifferentRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 25.0f, ColorRGBA(0, 0, 0, 1)), true, 5.0f, + RoundedCorners(20, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithOutset5pxSpread25pxBlurAndDifferentRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(10.0f, 10.0f), 25.0f, ColorRGBA(0, 0, 0, 1)), false, + 5.0f, RoundedCorners(20, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpreadAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpread1pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpread8pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpread50pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(25, 50, 150, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(5, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInset25pxSpreadAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutset25pxSpreadAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 0.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithInset25pxSpread1pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithOutset25pxSpread1pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 1.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithInset25pxSpread8pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithOutset25pxSpread8pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 8.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithInset25pxSpread50pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), true, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithOutset25pxSpread50pxBlurAndIsometricRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(8.0f, 8.0f), 50.0f, ColorRGBA(0, 0, 0, 1)), false, 25.0f, + RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(-15.0f, 20.0f), 10.0f, ColorRGBA(0, 0, 0, 1)), true, + -10.0f, RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, + BoxShadowWithOutsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(-15.0f, 20.0f), 10.0f, ColorRGBA(0, 0, 0, 1)), false, + -10.0f, RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithInsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(-15.0f, 20.0f), 2.0f, ColorRGBA(0, 0, 0, 1)), true, + -10.0f, RoundedCorners(10, 10))); +} + +TEST_F(PixelTest, BoxShadowWithOutsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners) { + TestTree(CreateShadowRectWithBackground( + output_surface_size(), ColorRGBA(1.0f, 1.0f, 1.0f, 1.0f), + ColorRGBA(0.5f, 0.5f, 0.5f, 1.0f), RectF(50, 50, 100, 100), + Shadow(Vector2dF(-15.0f, 20.0f), 2.0f, ColorRGBA(0, 0, 0, 1)), false, + -10.0f, RoundedCorners(10, 10))); +} + TEST_F(PixelTest, FilterBlurred0Point1PxText) { TestTree(new FilterNode( BlurFilter(0.1f),
diff --git a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc index 2554c09..a892498 100644 --- a/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc +++ b/src/cobalt/renderer/rasterizer/skia/hardware_resource_provider.cc
@@ -302,7 +302,7 @@ SkAutoTUnref<SkTypeface_Cobalt> typeface( base::polymorphic_downcast<SkTypeface_Cobalt*>( font_manager->matchFamilyStyleCharacter( - 0, CobaltFontStyleToSkFontStyle(font_style), language.c_str(), + NULL, CobaltFontStyleToSkFontStyle(font_style), language.c_str(), character))); return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface)); }
diff --git a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc index 1e2f1cf..f8b34ab 100644 --- a/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc +++ b/src/cobalt/renderer/rasterizer/skia/render_tree_node_visitor.cc
@@ -1442,35 +1442,54 @@ void DrawRoundedRectShadowNode(render_tree::RectShadowNode* node, SkCanvas* canvas) { - if (node->data().shadow.blur_sigma > 0.0f) { - NOTIMPLEMENTED() << "Cobalt doesn't currently support rendering blurred " - "box shadows on rounded rectangles."; - return; - } - if (!IsCircle(node->data().rect.size(), *node->data().rounded_corners)) { - NOTIMPLEMENTED() << "Cobalt does not support box shadows with rounded " - "corners that are not circles."; - return; - } - RRect shadow_rrect = GetShadowRect(*node); - SkRRect skia_clip_rrect = - RoundedRectToSkia(node->data().rect, *node->data().rounded_corners); - SkRRect skia_draw_rrect = - RoundedRectToSkia(shadow_rrect.rect, *shadow_rrect.rounded_corners); - - if (node->data().inset) { - std::swap(skia_clip_rrect, skia_draw_rrect); - } - canvas->save(); - canvas->clipRRect(skia_clip_rrect, SkRegion::kDifference_Op, true); + SkRRect skia_clip_rrect = + RoundedRectToSkia(node->data().rect, *node->data().rounded_corners); + SkRRect skia_shadow_rrect = + RoundedRectToSkia(shadow_rrect.rect, *shadow_rrect.rounded_corners); - SkPaint paint = GetPaintForBoxShadow(node->data().shadow); - paint.setAntiAlias(true); - canvas->drawRRect(skia_draw_rrect, paint); + if (node->data().inset) { + // Calculate the outer rect to be large enough such that blurring the outer + // unseen edge will not affect the visible inner region of the shadow. + math::RectF outer_rect = shadow_rrect.rect; + math::Vector2dF common_outer_rect_outset = + node->data().shadow.BlurExtent() + + math::Vector2dF(node->data().spread, node->data().spread); + math::InsetsF outer_rect_outset( + common_outer_rect_outset.x() + node->data().shadow.offset.x(), + common_outer_rect_outset.y() + node->data().shadow.offset.y(), + common_outer_rect_outset.x() - node->data().shadow.offset.x(), + common_outer_rect_outset.y() - node->data().shadow.offset.y()); + outer_rect_outset.set_left(std::max(0.0f, outer_rect_outset.left())); + outer_rect_outset.set_top(std::max(0.0f, outer_rect_outset.top())); + outer_rect_outset.set_right(std::max(0.0f, outer_rect_outset.right())); + outer_rect_outset.set_bottom(std::max(0.0f, outer_rect_outset.bottom())); + outer_rect.Outset(outer_rect_outset); + + SkRRect skia_outer_draw_rrect = + RoundedRectToSkia(outer_rect, *shadow_rrect.rounded_corners); + + canvas->clipRRect(skia_clip_rrect, SkRegion::kIntersect_Op, true); + + SkPaint paint = GetPaintForBoxShadow(node->data().shadow); + paint.setAntiAlias(true); + + // Draw a rounded rect "ring". We draw a ring whose outer rectangle is + // larger than the clip rectangle so that we can blur it without the outer + // edge's blur reaching the visible region. + canvas->drawDRRect(skia_outer_draw_rrect, skia_shadow_rrect, paint); + } else { + // Draw a rounded rectangle, possibly blurred, as the shadow rectangle, + // clipped by node->data().rect. + canvas->clipRRect(skia_clip_rrect, SkRegion::kDifference_Op, true); + + SkPaint paint = GetPaintForBoxShadow(node->data().shadow); + paint.setAntiAlias(true); + canvas->drawRRect(skia_shadow_rrect, paint); + } canvas->restore(); }
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi b/src/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi index 41bb8a1..71ac5a6 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi +++ b/src/cobalt/renderer/rasterizer/skia/skia/skia_cobalt.gypi
@@ -41,7 +41,7 @@ ], 'defines': [ - 'COBALT_SYSTEM_TYPEFACE_CACHE_CAPACITY_IN_BYTES=<(local_font_cache_size_in_bytes)', + 'COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES=<(local_font_cache_size_in_bytes)', ], 'include_dirs': [
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc index be914e6..206c6e3 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
@@ -19,6 +19,7 @@ #include <stack> #include <string> +#include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/string_util.h" #include "base/stringprintf.h" @@ -29,7 +30,7 @@ namespace { -const char* kSystemFontsFile = "fonts.xml"; +const char* kConfigFile = "fonts.xml"; ///////////////////////////////////////////////////////////////////////////// // Helpers @@ -59,7 +60,7 @@ int d = *s - '0'; // Check for overflow if (n > n_max || (n == n_max && d > d_max)) { - SkDebugf("---- ParseNonNegativeInteger error: overflow)"); + LOG(ERROR) << "---- ParseNonNegativeInteger error: overflow"; return false; } n = (n * 10) + d; @@ -68,6 +69,36 @@ return true; } +template <typename T> +bool ParseInteger(const char* s, T* value) { + SK_COMPILE_ASSERT(std::numeric_limits<T>::is_signed, T_must_be_signed); + T multiplier = 1; + if (*s && *s == '-') { + multiplier = -1; + ++s; + } + if (!ParseNonNegativeInteger(s, value)) { + return false; + } + *value *= multiplier; + return true; +} + +template <typename T> +bool ParseFontWeight(const char* s, T* value) { + T n = 0; + if (!ParseNonNegativeInteger(s, &n)) { + return false; + } + // Verify that the weight is a multiple of 100 between 100 and 900. + // https://www.w3.org/TR/css-fonts-3/#font-weight-prop + if (n < 100 || n > 900 || n % 100 != 0) { + return false; + } + *value = n; + return true; +} + // The page range list is a comma-delimited list of character page ranges. Each // page range can either consist of either a single integer value, or a pair of // values separated by a hyphen (representing the min and max value of the @@ -93,7 +124,8 @@ for (int i = 0; i <= 1; ++i) { if (!IsAsciiDigit(*s)) { - SkDebugf("---- ParsePageRangeList error: non-ascii digit page range"); + LOG(ERROR) + << "---- ParsePageRangeList error: non-ascii digit page range"; return false; } @@ -105,7 +137,7 @@ int d = *s - '0'; // Check for overflow if (n > n_max || (n == n_max && d > d_max)) { - SkDebugf("---- ParsePageRangeList error: page range overflow"); + LOG(ERROR) << "---- ParsePageRangeList error: page range overflow"; return false; } @@ -117,7 +149,7 @@ // max. Ranges must appear in order. If it isn't, then the parsing has // failed. if (last_max >= n) { - SkDebugf("---- ParsePageRangeList error: pages unordered"); + LOG(ERROR) << "---- ParsePageRangeList error: pages unordered"; return false; } @@ -138,7 +170,7 @@ range_value.second = n; ranges->push_back(range_value); } else { - SkDebugf("---- ParsePageRangeList error: page range flipped"); + LOG(ERROR) << "---- ParsePageRangeList error: page range flipped"; return false; } } @@ -156,7 +188,7 @@ if (*s == ',') { ++s; } else { - SkDebugf("---- ParsePageRangeList error: invalid character"); + LOG(ERROR) << "---- ParsePageRangeList error: invalid character"; return false; } } @@ -243,13 +275,16 @@ } // A <family> may have the following attributes: - // name (string), fallback (true, false), lang (string), pages (comma + // name (string), fallback_priority (int), lang (string), pages (comma // delimited int ranges) // A <family> tag must have a canonical name attribute or be a fallback // family in order to be usable, unless it is the default family. - // If the fallback attribute exists, then it alone determines whether the - // family is a fallback family. However, if it does not exist, then the - // lack of a name attribute makes it a fallback family. + // A family is a fallback family if one of two conditions are met: + // 1. It does not have a "name" attribute. + // 2. It has a "fallback_priority" attribute. + // If the fallback_priority attribute exists, then the family is given the + // fallback priority specified by the value. If it does not exist, then the + // fallback priority defaults to 0. // The lang and pages attributes are only used by fallback families. bool encountered_fallback_attribute = false; @@ -273,13 +308,20 @@ family->language = SkLanguage(value); } else if (name_len == 5 && strncmp("pages", name, name_len) == 0) { if (!ParsePageRangeList(value, &family->page_ranges)) { - SkDebugf("---- Page ranges %s (INVALID)", value); + LOG(ERROR) << "---- Invalid page ranges [" << value << "]"; + NOTREACHED(); family->page_ranges.reset(); } - } else if (name_len == 8 && strncmp("fallback", name, name_len) == 0) { + } else if (name_len == 17 && + strncmp("fallback_priority", name, name_len) == 0) { encountered_fallback_attribute = true; - family->is_fallback_family = - strcmp("true", value) == 0 || strcmp("1", value) == 0; + if (!ParseInteger(value, &family->fallback_priority)) { + LOG(ERROR) << "---- Invalid fallback priority [" << value << "]"; + NOTREACHED(); + } + } else { + LOG(ERROR) << "---- Unsupported family attribute [" << name << "]"; + NOTREACHED(); } } } @@ -301,7 +343,8 @@ case 5: if (strncmp("index", name, 5) == 0) { if (!ParseNonNegativeInteger(value, &file->index)) { - DLOG(WARNING) << "Invalid font index [" << value << "]"; + LOG(ERROR) << "---- Invalid font index [" << value << "]"; + NOTREACHED(); } continue; } else if (strncmp("style", name, 5) == 0) { @@ -312,14 +355,16 @@ file->style = FontFileInfo::kNormal_FontStyle; continue; } else { - NOTREACHED() << "Unsupported style [" << value << "]"; + LOG(ERROR) << "---- Unsupported style [" << value << "]"; + NOTREACHED(); } } break; case 6: if (strncmp("weight", name, 6) == 0) { - if (!ParseNonNegativeInteger(value, &file->weight)) { - DLOG(WARNING) << "Invalid font weight [" << value << "]"; + if (!ParseFontWeight(value, &file->weight)) { + LOG(ERROR) << "---- Invalid font weight [" << value << "]"; + NOTREACHED(); } continue; } @@ -349,7 +394,8 @@ break; } - NOTREACHED() << "Unsupported attribute [" << name << "]"; + LOG(ERROR) << "---- Unsupported font attribute [" << name << "]"; + NOTREACHED(); } } @@ -390,60 +436,19 @@ // Assumes that the named family is already declared FontFamily* target_family = FindFamily(family_data, to.c_str()); if (!target_family) { - SkDebugf("---- Font alias target %s (NOT FOUND)", to.c_str()); + LOG(ERROR) << "---- Invalid alias target [name: " << alias_name.c_str() + << ", to: " << to.c_str() << "]"; + NOTREACHED(); return; } else if (alias_name.size() == 0) { - SkDebugf("---- Font alias name for %s (NOT SET)", to.c_str()); + LOG(ERROR) << "---- Invalid alias name [to: " << to.c_str() << "]"; + NOTREACHED(); return; } target_family->names.push_back().set(alias_name); } -bool FindWeight400(FontFamily* family) { - for (int i = 0; i < family->fonts.count(); i++) { - if (family->fonts[i].weight == 400) { - return true; - } - } - return false; -} - -bool DesiredWeight(int weight) { return (weight == 400 || weight == 700); } - -int CountDesiredWeight(FontFamily* family) { - int count = 0; - for (int i = 0; i < family->fonts.count(); i++) { - if (DesiredWeight(family->fonts[i].weight)) { - count++; - } - } - return count; -} - -// To meet Skia's expectations, any family that contains weight=400 -// fonts should *only* contain {400,700} -void PurgeUndesiredWeights(FontFamily* family) { - int count = CountDesiredWeight(family); - for (int i = 1, j = 0; i < family->fonts.count(); i++) { - if (DesiredWeight(family->fonts[j].weight)) { - j++; - } - if ((i != j) && DesiredWeight(family->fonts[i].weight)) { - family->fonts[j] = family->fonts[i]; - } - } - family->fonts.resize_back(count); -} - -void FamilySetElementEndHandler(FamilyData* familyData) { - for (int i = 0; i < familyData->families->count(); i++) { - if (FindWeight400((*familyData->families)[i])) { - PurgeUndesiredWeights((*familyData->families)[i]); - } - } -} - void StartElement(void* data, const xmlChar* xml_tag, const xmlChar** xml_attribute_pairs) { FamilyData* family_data = reinterpret_cast<FamilyData*>(data); @@ -474,13 +479,12 @@ const char* tag = reinterpret_cast<const char*>(xml_tag); size_t tag_len = strlen(tag); - if (tag_len == 9 && strncmp("familyset", tag, tag_len) == 0) { - FamilySetElementEndHandler(family_data); - } else if (tag_len == 6 && strncmp("family", tag, tag_len) == 0) { + if (tag_len == 6 && strncmp("family", tag, tag_len) == 0) { if (family_data->current_family != NULL) { *family_data->families->append() = family_data->current_family.release(); } else { - SkDebugf("---- Encountered end family tag with no current family"); + LOG(ERROR) << "---- Encountered end family tag with no current family"; + NOTREACHED(); } } @@ -501,42 +505,43 @@ va_list arguments; va_start(arguments, message); - SkDebugf("---- Parsing warning: %s", - StringPrintVAndTrim(message, arguments).c_str()); + DLOG(WARNING) << "---- Parsing warning: " + << StringPrintVAndTrim(message, arguments).c_str(); } void ParserError(void* context, const char* message, ...) { va_list arguments; va_start(arguments, message); - SkDebugf("---- Parsing error: %s", - StringPrintVAndTrim(message, arguments).c_str()); + LOG(ERROR) << "---- Parsing error: " + << StringPrintVAndTrim(message, arguments).c_str(); + NOTREACHED(); } void ParserFatal(void* context, const char* message, ...) { va_list arguments; va_start(arguments, message); - SkDebugf("---- Parsing fatal error: %s", - StringPrintVAndTrim(message, arguments).c_str()); + LOG(ERROR) << "---- Parsing fatal error: " + << StringPrintVAndTrim(message, arguments).c_str(); + NOTREACHED(); } // This function parses the given filename and stores the results in the given // families array. -void ParseConfigFile(const char* directory, const char* filename, - SkTDArray<FontFamily*>* families) { - SkString file_path = SkOSPath::Join(directory, filename); +void ParseConfigFile(const char* directory, SkTDArray<FontFamily*>* families) { + SkString file_path = SkOSPath::Join(directory, kConfigFile); SkAutoTUnref<SkStream> file_stream(SkStream::NewFromFile(file_path.c_str())); if (file_stream == NULL) { - SkDebugf("---- Failed to open %s", file_path.c_str()); + LOG(ERROR) << "---- Failed to open %s", file_path.c_str(); return; } SkAutoDataUnref file_data( SkData::NewFromStream(file_stream, file_stream->getLength())); if (file_data == NULL) { - SkDebugf("---- Failed to read %s", file_path.c_str()); + LOG(ERROR) << "---- Failed to read %s", file_path.c_str(); return; } @@ -546,11 +551,6 @@ static_cast<int>(file_data->size())); } -void GetSystemFontFamilies(const char* directory, - SkTDArray<FontFamily*>* font_families) { - ParseConfigFile(directory, kSystemFontsFile, font_families); -} - } // namespace namespace SkFontConfigParser { @@ -559,7 +559,7 @@ // is returned in the given fontFamilies array. void GetFontFamilies(const char* directory, SkTDArray<FontFamily*>* font_families) { - GetSystemFontFamilies(directory, font_families); + ParseConfigFile(directory, font_families); } } // namespace SkFontConfigParser
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 d77460a..850a112 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
@@ -23,21 +23,39 @@ #include "SkTSearch.h" SkFontMgr_Cobalt::SkFontMgr_Cobalt( - const char* directory, const SkTArray<SkString, true>& default_families) - : system_typeface_stream_manager_( - "Font.SystemTypeface", - COBALT_SYSTEM_TYPEFACE_CACHE_CAPACITY_IN_BYTES), + const char* cobalt_font_config_directory, + const char* cobalt_font_files_directory, + const char* system_font_config_directory, + const char* system_font_files_directory, + const SkTArray<SkString, true>& default_families) + : local_typeface_stream_manager_("Font.LocalTypefaceCache", + COBALT_LOCAL_TYPEFACE_CACHE_SIZE_IN_BYTES), default_family_(NULL) { TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::SkFontMgr_Cobalt()"); - SkTDArray<FontFamily*> font_families; - { - TRACE_EVENT0("cobalt::renderer", "SkFontConfigParser::GetFontFamilies()"); - SkFontConfigParser::GetFontFamilies(directory, &font_families); - } - BuildNameToFamilyMap(directory, &font_families); - font_families.deleteAll(); + PriorityStyleSetArrayMap priority_fallback_families; + // Cobalt fonts are loaded first. + { + TRACE_EVENT0("cobalt::renderer", "LoadCobaltFontFamilies"); + ParseConfigAndBuildFamilies(cobalt_font_config_directory, + cobalt_font_files_directory, + &priority_fallback_families); + } + + // Only attempt to load the system font families if the system directories + // have been populated. + if (system_font_config_directory != NULL && + *system_font_config_directory != '\0' && + system_font_files_directory != NULL && + *system_font_files_directory != '\0') { + TRACE_EVENT0("cobalt::renderer", "LoadSystemFontFamilies"); + ParseConfigAndBuildFamilies(system_font_config_directory, + system_font_files_directory, + &priority_fallback_families); + } + + GeneratePriorityOrderedFallbackFamilies(priority_fallback_families); FindDefaultFamily(default_families); } @@ -232,26 +250,42 @@ return matchFamilyStyle(family_name, style); } -void SkFontMgr_Cobalt::BuildNameToFamilyMap(const char* base_path, - SkTDArray<FontFamily*>* families) { +void SkFontMgr_Cobalt::ParseConfigAndBuildFamilies( + const char* font_config_directory, const char* font_files_directory, + PriorityStyleSetArrayMap* priority_fallback_families) { + SkTDArray<FontFamily*> font_families; + { + TRACE_EVENT0("cobalt::renderer", "SkFontConfigParser::GetFontFamilies()"); + SkFontConfigParser::GetFontFamilies(font_config_directory, &font_families); + } + BuildNameToFamilyMap(font_files_directory, &font_families, + priority_fallback_families); + font_families.deleteAll(); +} + +void SkFontMgr_Cobalt::BuildNameToFamilyMap( + const char* font_files_directory, SkTDArray<FontFamily*>* families, + PriorityStyleSetArrayMap* priority_fallback_families) { TRACE_EVENT0("cobalt::renderer", "SkFontMgr_Cobalt::BuildNameToFamilyMap()"); for (int i = 0; i < families->count(); i++) { FontFamily& family = *(*families)[i]; bool named_family = family.names.count() > 0; - if (family.is_fallback_family) { - if (!named_family) { - SkString& fallback_name = family.names.push_back(); - fallback_name.printf("%.2x##fallback", i); - } + if (!named_family) { + // Unnamed families should always be fallback families. + DCHECK(family.is_fallback_family); + SkString& fallback_name = family.names.push_back(); + fallback_name.printf("%.2x##fallback", font_style_sets_.count()); } SkAutoTUnref<SkFontStyleSet_Cobalt> new_set( SkNEW_ARGS(SkFontStyleSet_Cobalt, - (family, base_path, &system_typeface_stream_manager_, - &style_sets_mutex_))); + (family, font_files_directory, + &local_typeface_stream_manager_, &style_sets_mutex_))); - // Verify that the set successfully added entries. + // Do not add the set if none of its fonts were available. This allows the + // config file to specify a superset of all fonts, and ones that are not + // included in the final package are stripped out. if (new_set->styles_.count() == 0) { continue; } @@ -260,14 +294,26 @@ if (named_family) { for (int j = 0; j < family.names.count(); j++) { - family_names_.push_back(family.names[j]); - name_to_family_map_.insert( - std::make_pair(family.names[j].c_str(), new_set.get())); + // Verify that the name was not previously added. + if (name_to_family_map_.find(family.names[j].c_str()) == + name_to_family_map_.end()) { + family_names_.push_back(family.names[j]); + name_to_family_map_.insert( + std::make_pair(family.names[j].c_str(), new_set.get())); + } else { + NOTREACHED() << "Duplicate Font name: \"" << family.names[j].c_str() + << "\""; + } } } + // If this is a fallback family, add it to the fallback family array + // that corresponds to its priority. This will be used to generate a + // priority-ordered fallback families list once the family map is fully + // built. if (family.is_fallback_family) { - fallback_families_.push_back(new_set.get()); + (*priority_fallback_families)[family.fallback_priority].push_back( + new_set.get()); } for (SkAutoTUnref<SkFontStyleSet_Cobalt::SkFontStyleSetEntry_Cobalt>* @@ -290,23 +336,43 @@ i == 0 ? full_font_name_to_style_set_map_ : font_postscript_name_to_style_set_map_; + // Verify that the font face name was not already added. if (font_face_name_style_set_map.find(font_face_name) == font_face_name_style_set_map.end()) { font_face_name_style_set_map[font_face_name] = new_set.get(); } else { - // Purposely, not overwriting the entry gives priority to the - // earlier entry. This is consistent with how fonts.xml gives - // priority to fonts that are specified earlier in the file. const std::string font_face_name_type = i == 0 ? "Full Font" : "Postscript"; - NOTREACHED() << font_face_name_type << " name [" << font_face_name - << "] already registered in BuildNameToFamilyMap."; + NOTREACHED() << "Duplicate " << font_face_name_type << " name: \"" + << font_face_name << "\""; } } } } } +void SkFontMgr_Cobalt::GeneratePriorityOrderedFallbackFamilies( + const PriorityStyleSetArrayMap& priority_fallback_families) { + // Reserve the combined size of the priority fallback families. + size_t reserve_size = 0; + for (PriorityStyleSetArrayMap::const_iterator iter = + priority_fallback_families.begin(); + iter != priority_fallback_families.end(); ++iter) { + reserve_size += iter->second.size(); + } + fallback_families_.reserve(reserve_size); + + // Add each of the priority fallback families to |fallback_families_| in + // reverse order, so that higher priorities are added first. This results in + // |fallback_families_| being ordered by priority. + for (PriorityStyleSetArrayMap::const_reverse_iterator iter = + priority_fallback_families.rbegin(); + iter != priority_fallback_families.rend(); ++iter) { + fallback_families_.insert(fallback_families_.end(), iter->second.begin(), + iter->second.end()); + } +} + void SkFontMgr_Cobalt::FindDefaultFamily( const SkTArray<SkString, true>& default_families) { CHECK(!font_style_sets_.empty());
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 081408e..5ea8eec 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
@@ -15,6 +15,7 @@ #ifndef COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_SKFONTMGR_COBALT_H_ #define COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_SKFONTMGR_COBALT_H_ +#include <map> #include <string> #include <vector> @@ -43,8 +44,12 @@ class SkFontMgr_Cobalt : public SkFontMgr { public: typedef std::vector<SkFontStyleSet_Cobalt*> StyleSetArray; + typedef std::map<int, StyleSetArray> PriorityStyleSetArrayMap; - SkFontMgr_Cobalt(const char* directory, + SkFontMgr_Cobalt(const char* cobalt_font_config_directory, + const char* cobalt_font_files_directory, + const char* system_font_config_directory, + const char* system_font_files_directory, const SkTArray<SkString, true>& default_fonts); // NOTE: This returns NULL if a match is not found. @@ -102,8 +107,14 @@ typedef base::SmallMap<base::hash_map<std::string, StyleSetArray*> > NameToStyleSetArrayMap; - void BuildNameToFamilyMap(const char* base_path, - SkTDArray<FontFamily*>* families); + void ParseConfigAndBuildFamilies( + const char* font_config_directory, const char* font_files_directory, + PriorityStyleSetArrayMap* priority_fallback_families); + void BuildNameToFamilyMap( + const char* font_files_directory, SkTDArray<FontFamily*>* families, + PriorityStyleSetArrayMap* priority_fallback_families); + void GeneratePriorityOrderedFallbackFamilies( + const PriorityStyleSetArrayMap& priority_fallback_families); void FindDefaultFamily(const SkTArray<SkString, true>& default_families); // Returns the first encountered fallback family that matches the language tag @@ -118,7 +129,7 @@ // NOTE: |style_sets_mutex_| should be locked prior to calling this function. StyleSetArray* GetMatchingFallbackFamilies(const SkString& language_tag); - SkFileMemoryChunkStreamManager system_typeface_stream_manager_; + SkFileMemoryChunkStreamManager local_typeface_stream_manager_; SkTArray<SkAutoTUnref<SkFontStyleSet_Cobalt>, true> font_style_sets_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc index 9722f21..c323ed8 100644 --- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc +++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt_factory.cc
@@ -14,17 +14,30 @@ #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontMgr_cobalt.h" +#include "base/base_paths_starboard.h" #include "base/file_path.h" #include "base/file_util.h" #include "base/path_service.h" SkFontMgr* SkFontMgr::Factory() { - FilePath font_directory; - CHECK(PathService::Get(base::DIR_EXE, &font_directory)); - font_directory = font_directory.Append(FILE_PATH_LITERAL("fonts")); + FilePath cobalt_font_directory; + CHECK(PathService::Get(base::DIR_EXE, &cobalt_font_directory)); + cobalt_font_directory = + cobalt_font_directory.Append(FILE_PATH_LITERAL("fonts")); + + FilePath system_font_config_directory; + PathService::Get(base::DIR_SYSTEM_FONTS_CONFIGURATION, + &system_font_config_directory); + + FilePath system_font_files_directory; + PathService::Get(base::DIR_SYSTEM_FONTS, &system_font_files_directory); SkTArray<SkString, true> default_families; default_families.push_back(SkString("sans-serif")); - return new SkFontMgr_Cobalt(font_directory.value().c_str(), default_families); + return new SkFontMgr_Cobalt(cobalt_font_directory.value().c_str(), + cobalt_font_directory.value().c_str(), + system_font_config_directory.value().c_str(), + system_font_files_directory.value().c_str(), + default_families); }
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 4a4f6c1..4774f00 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
@@ -14,9 +14,10 @@ #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h" -#include <cmath> #include <ft2build.h> #include FT_FREETYPE_H + +#include <cmath> #include <limits> #include "base/debug/trace_event.h" @@ -28,10 +29,42 @@ namespace { int MatchScore(const SkFontStyle& pattern, const SkFontStyle& candidate) { + // This logic is taken from Skia and is based upon the algorithm specified + // within the spec: + // https://www.w3.org/TR/css-fonts-3/#font-matching-algorithm + int score = 0; - score += std::abs((pattern.width() - candidate.width()) * 100); - score += (pattern.isItalic() == candidate.isItalic()) ? 0 : 1000; - score += std::abs(pattern.weight() - candidate.weight()); + + // CSS style (italic/oblique) + // Being italic trumps all valid weights which are not italic. + // Note that newer specs differentiate between italic and oblique. + if (pattern.isItalic() == candidate.isItalic()) { + score += 1001; + } + + // The 'closer' to the target weight, the higher the score. + // 1000 is the 'heaviest' recognized weight + if (pattern.weight() == candidate.weight()) { + score += 1000; + } else if (pattern.weight() <= 500) { + if (400 <= pattern.weight() && pattern.weight() < 450) { + if (450 <= candidate.weight() && candidate.weight() <= 500) { + score += 500; + } + } + if (candidate.weight() <= pattern.weight()) { + score += 1000 - pattern.weight() + candidate.weight(); + } else { + score += 1000 - candidate.weight(); + } + } else if (pattern.weight() > 500) { + if (candidate.weight() > pattern.weight()) { + score += 1000 + pattern.weight() - candidate.weight(); + } else { + score += candidate.weight(); + } + } + return score; } @@ -53,13 +86,11 @@ static void sk_cobalt_ft_stream_close(FT_Stream) {} } -// This class is used by SkFontMgr_Cobalt to hold SkTypeface_CobaltSystem -// families. SkFontStyleSet_Cobalt::SkFontStyleSet_Cobalt( const FontFamily& family, const char* base_path, - SkFileMemoryChunkStreamManager* const system_typeface_stream_manager, + SkFileMemoryChunkStreamManager* const local_typeface_stream_manager, SkMutex* const manager_owned_mutex) - : system_typeface_stream_manager_(system_typeface_stream_manager), + : local_typeface_stream_manager_(local_typeface_stream_manager), manager_owned_mutex_(manager_owned_mutex), is_fallback_family_(family.is_fallback_family), language_(family.language), @@ -80,9 +111,10 @@ SkString file_path(SkOSPath::Join(base_path, font_file.file_name.c_str())); - // Sanity check that something exists at this location. + // Validate that the file exists at this location. If it does not, then skip + // over it; it isn't being added to the set. if (!sk_exists(file_path.c_str(), kRead_SkFILE_Flag)) { - LOG(ERROR) << "Failed to find font file: " << file_path.c_str(); + DLOG(INFO) << "Failed to find font file: " << file_path.c_str(); continue; } @@ -170,7 +202,7 @@ SkFontStyleSetEntry_Cobalt* style = styles_[style_index]; // If the typeface doesn't already exist, then attempt to create it. if (style->typeface == NULL) { - CreateSystemTypeface(style); + CreateStreamProviderTypeface(style); // If the creation attempt failed and the typeface is still NULL, then // remove the entry from the set's styles. if (style->typeface == NULL) { @@ -236,7 +268,7 @@ SkFontStyleSetEntry_Cobalt* closest_style = styles_[style_index]; SkFileMemoryChunkStreamProvider* stream_provider = - system_typeface_stream_manager_->GetStreamProvider( + local_typeface_stream_manager_->GetStreamProvider( closest_style->font_file_path.c_str()); // Create a snapshot prior to loading any additional memory chunks. In the @@ -250,7 +282,7 @@ stream_provider->OpenStream()); if (GenerateStyleFaceInfo(closest_style, stream)) { if (CharacterMapContainsCharacter(character)) { - CreateSystemTypeface(closest_style, stream_provider); + CreateStreamProviderTypeface(closest_style, stream_provider); return true; } else { // If a typeface was not created, destroy the stream and purge any @@ -359,25 +391,25 @@ int SkFontStyleSet_Cobalt::GetClosestStyleIndex(const SkFontStyle& pattern) { int closest_index = 0; - int min_score = std::numeric_limits<int>::max(); + int max_score = std::numeric_limits<int>::min(); for (int i = 0; i < styles_.count(); ++i) { int score = MatchScore(pattern, styles_[i]->font_style); - if (score < min_score) { + if (score > max_score) { closest_index = i; - min_score = score; + max_score = score; } } return closest_index; } -void SkFontStyleSet_Cobalt::CreateSystemTypeface( +void SkFontStyleSet_Cobalt::CreateStreamProviderTypeface( SkFontStyleSetEntry_Cobalt* style_entry, SkFileMemoryChunkStreamProvider* stream_provider /*=NULL*/) { TRACE_EVENT0("cobalt::renderer", - "SkFontStyleSet_Cobalt::CreateSystemTypeface()"); + "SkFontStyleSet_Cobalt::CreateStreamProviderTypeface()"); if (!stream_provider) { - stream_provider = system_typeface_stream_manager_->GetStreamProvider( + stream_provider = local_typeface_stream_manager_->GetStreamProvider( style_entry->font_file_path.c_str()); } @@ -386,7 +418,7 @@ LOG(ERROR) << "Scanned font from file: " << style_entry->face_name.c_str() << "(" << style_entry->face_style << ")"; style_entry->typeface.reset( - SkNEW_ARGS(SkTypeface_CobaltSystem, + SkNEW_ARGS(SkTypeface_CobaltStreamProvider, (stream_provider, style_entry->face_index, style_entry->face_style, style_entry->face_is_fixed_pitch, family_name_, style_entry->disable_synthetic_bolding)));
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 da1b701..3d1f7c7 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
@@ -25,15 +25,12 @@ #include "SkTArray.h" #include "SkTypeface.h" -// This class is used by SkFontMgr_Cobalt to hold SkTypeface_Cobalt families. +// This class is used by SkFontMgr_Cobalt to store families of +// SkTypeface_Cobalt objects. // -// To avoid the memory hit from keeping all fonts around, both the full -// character map for fonts and the font faces for fonts are lazily loaded -// when needed. After this, they are retained in memory. -// -// The style sets contain an array of page ranges, providing information on -// characters that are potentially contained. To determine whether or not a -// character is actually contained, the full character map is generated. +// Both the full character map of the style set and the typeface of each +// individual entry are lazily loaded the first time that they are needed. After +// this, they are retained in memory. class SkFontStyleSet_Cobalt : public SkFontStyleSet { public: struct SkFontStyleSetEntry_Cobalt : public SkRefCnt { @@ -76,7 +73,7 @@ SkFontStyleSet_Cobalt( const FontFamily& family, const char* base_path, - SkFileMemoryChunkStreamManager* const system_typeface_stream_manager, + SkFileMemoryChunkStreamManager* const local_typeface_stream_manager, SkMutex* const manager_owned_mutex); // From SkFontStyleSet @@ -110,12 +107,12 @@ SkStreamAsset* stream); int GetClosestStyleIndex(const SkFontStyle& pattern); - void CreateSystemTypeface( + void CreateStreamProviderTypeface( SkFontStyleSetEntry_Cobalt* style, SkFileMemoryChunkStreamProvider* stream_provider = NULL); // NOTE: The following variables can safely be accessed outside of the mutex. - SkFileMemoryChunkStreamManager* const system_typeface_stream_manager_; + SkFileMemoryChunkStreamManager* const local_typeface_stream_manager_; SkMutex* const manager_owned_mutex_; SkString family_name_;
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 ef1af47..5aeb2c8 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
@@ -126,12 +126,13 @@ // cannot possible contain a character, without needing to load the font file // and generate a full mapping of the font's characters. struct FontFamily { - FontFamily() : is_fallback_family(true) {} + FontFamily() : is_fallback_family(true), fallback_priority(0) {} SkTArray<SkString> names; SkTArray<FontFileInfo> fonts; SkLanguage language; bool is_fallback_family; + int fallback_priority; font_character_map::PageRanges page_ranges; };
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 9d9f0de..4bec9d0 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
@@ -35,7 +35,7 @@ const SkString family_name) : INHERITED(face_index, style, is_fixed_pitch, family_name), stream_(SkRef(stream)) { - LOG(INFO) << "Created SkTypeface_CobaltMemory: " << family_name.c_str() << "(" + LOG(INFO) << "Created SkTypeface_CobaltStream: " << family_name.c_str() << "(" << style << "); Size: " << stream_->getLength() << " bytes"; } @@ -54,7 +54,7 @@ return stream_->duplicate(); } -SkTypeface_CobaltSystem::SkTypeface_CobaltSystem( +SkTypeface_CobaltStreamProvider::SkTypeface_CobaltStreamProvider( SkFileMemoryChunkStreamProvider* stream_provider, int face_index, Style style, bool is_fixed_pitch, const SkString family_name, bool disable_synthetic_bolding) @@ -63,10 +63,13 @@ if (disable_synthetic_bolding) { synthesizes_bold_ = false; } + LOG(INFO) << "Created SkTypeface_CobaltStreamProvider: " + << family_name.c_str() << "(" << style << "); File: \"" + << stream_provider->file_path() << "\""; } -void SkTypeface_CobaltSystem::onGetFontDescriptor(SkFontDescriptor* descriptor, - bool* serialize) const { +void SkTypeface_CobaltStreamProvider::onGetFontDescriptor( + SkFontDescriptor* descriptor, bool* serialize) const { SkASSERT(descriptor); SkASSERT(serialize); descriptor->setFamilyName(family_name_.c_str()); @@ -75,7 +78,8 @@ *serialize = false; } -SkStreamAsset* SkTypeface_CobaltSystem::onOpenStream(int* face_index) const { +SkStreamAsset* SkTypeface_CobaltStreamProvider::onOpenStream( + int* face_index) const { *face_index = face_index_; return stream_provider_->OpenStream(); }
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 0299cf2..4fcbda5 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
@@ -57,12 +57,12 @@ SkAutoTUnref<SkStreamAsset> stream_; }; -class SkTypeface_CobaltSystem : public SkTypeface_Cobalt { +class SkTypeface_CobaltStreamProvider : public SkTypeface_Cobalt { public: - SkTypeface_CobaltSystem(SkFileMemoryChunkStreamProvider* stream_provider, - int face_index, Style style, bool is_fixed_pitch, - const SkString family_name, - bool disable_synthetic_bolding); + SkTypeface_CobaltStreamProvider( + SkFileMemoryChunkStreamProvider* stream_provider, int face_index, + Style style, bool is_fixed_pitch, const SkString family_name, + bool disable_synthetic_bolding); virtual void onGetFontDescriptor(SkFontDescriptor* descriptor, bool* serialize) const SK_OVERRIDE;
diff --git a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc index 05e9723..e4db0c1 100644 --- a/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc +++ b/src/cobalt/renderer/rasterizer/skia/software_resource_provider.cc
@@ -156,7 +156,7 @@ SkAutoTUnref<SkTypeface_Cobalt> typeface( base::polymorphic_downcast<SkTypeface_Cobalt*>( font_manager->matchFamilyStyleCharacter( - 0, CobaltFontStyleToSkFontStyle(font_style), language.c_str(), + NULL, CobaltFontStyleToSkFontStyle(font_style), language.c_str(), character))); return scoped_refptr<render_tree::Typeface>(new SkiaTypeface(typeface)); }
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..ea5b4e4 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..3703a08 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowBigEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..6fa5660 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurRoundedCornersAndNoOffset-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurRoundedCornersAndNoOffset-expected.png new file mode 100644 index 0000000..f0f7ced --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread1pxBlurRoundedCornersAndNoOffset-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..972251c --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..1ce7f87 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..fdb1ab5 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithInset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..c8a5658 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..cd1622d --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..6f29c1b --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..4414735 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowCircleWithOutset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..c326226 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..e4edc94 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..1135b9e --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..eb92cb0 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithInset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..b48173a --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..5f0d31b --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..9858145 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..feb36f8 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowEllipseWithOutset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..3ed1914 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..3e9dcec --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..f52bd50 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..231ea75 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..6abbaea --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..8aede5c --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndBlur-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndBlur-expected.png new file mode 100644 index 0000000..d56f9e7 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndBlur-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..97a82a7 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..40d0cb8 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..fe6139d --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset25pxSpreadAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png new file mode 100644 index 0000000..4bae443 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..bc32f8b --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread25pxBlurAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread5pxBlurAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread5pxBlurAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..4a22bfe --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpread5pxBlurAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndDifferentRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndDifferentRoundedCorners-expected.png new file mode 100644 index 0000000..2a2bad9 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndDifferentRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..62e395b --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInset5pxSpreadAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..c0e1add --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..a96d677 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetSpreadAndBlur-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetSpreadAndBlur-expected.png deleted file mode 100644 index 717f915..0000000 --- a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithInsetSpreadAndBlur-expected.png +++ /dev/null Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..debca65 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..9e0f04e --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread1pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..3c9930d --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..f1ffda8 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread50pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..24b1a05 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..92e9577 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpread8pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndIsometricRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndIsometricRoundedCorners-expected.png new file mode 100644 index 0000000..9501789 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndIsometricRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndRoundedCorners-expected.png new file mode 100644 index 0000000..d989a78 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..d567767 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset25pxSpreadAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png new file mode 100644 index 0000000..a8b1437 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndDifferentRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..a06eaf1 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread25pxBlurAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread5pxBlurAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread5pxBlurAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..4a22bfe --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpread5pxBlurAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndDifferentRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndDifferentRoundedCorners-expected.png new file mode 100644 index 0000000..c77b7f7 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndDifferentRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndSameRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndSameRoundedCorners-expected.png new file mode 100644 index 0000000..4db2929 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutset5pxSpreadAndSameRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..300b031 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd10pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png new file mode 100644 index 0000000..00b6797 --- /dev/null +++ b/src/cobalt/renderer/rasterizer/testdata/BoxShadowWithOutsetNeg10pxSpreadAnd2pxBlurAndRoundedCorners-expected.png Binary files differ
diff --git a/src/cobalt/renderer/renderer_module.cc b/src/cobalt/renderer/renderer_module.cc index 04d18b9..28cbe93 100644 --- a/src/cobalt/renderer/renderer_module.cc +++ b/src/cobalt/renderer/renderer_module.cc
@@ -24,7 +24,7 @@ namespace renderer { RendererModule::Options::Options() - : skia_texture_atlas_dimensions(2048, 2048) { + : skia_glyph_texture_atlas_dimensions(2048, 2048) { // Call into platform-specific code for setting up render module options. SetPerPlatformDefaultOptions(); }
diff --git a/src/cobalt/renderer/renderer_module.h b/src/cobalt/renderer/renderer_module.h index 8446117..0e92c82 100644 --- a/src/cobalt/renderer/renderer_module.h +++ b/src/cobalt/renderer/renderer_module.h
@@ -15,6 +15,7 @@ #ifndef COBALT_RENDERER_RENDERER_MODULE_H_ #define COBALT_RENDERER_RENDERER_MODULE_H_ +#include "cobalt/base/camera_transform.h" #include "cobalt/render_tree/node.h" #include "cobalt/renderer/backend/display.h" #include "cobalt/renderer/backend/graphics_context.h" @@ -35,6 +36,8 @@ backend::GraphicsContext*, const Options& options)> CreateRasterizerCallback; + typedef base::Callback<base::CameraTransform()> GetCameraTransformCallback; + // The rasterizer must be created, accessed, and destroyed within the same // thread, and so to facilitate that a rasterizer factory function must // be provided here instead of the rasterizer itself. @@ -48,7 +51,7 @@ // Represents the dimensions of the skia texture atlas which holds all of // the glyph textures used during rendering. - math::Size skia_texture_atlas_dimensions; + math::Size skia_glyph_texture_atlas_dimensions; // Determines the capacity of the skia cache. The Skia cache is maintained // within Skia and is used to cache the results of complicated effects such @@ -74,6 +77,10 @@ // buffer will not be frequently swapped. bool submit_even_if_render_tree_is_unchanged; + // On modes with a 3D camera controllable by user input, fetch the affine + // transforms needed to render the scene from the camera's view. + GetCameraTransformCallback get_camera_transform; + private: // Implemented per-platform, and allows each platform to customize // the renderer options.
diff --git a/src/cobalt/renderer/renderer_module_default_options_starboard.cc b/src/cobalt/renderer/renderer_module_default_options_starboard.cc index 443c212..fc3f3e0 100644 --- a/src/cobalt/renderer/renderer_module_default_options_starboard.cc +++ b/src/cobalt/renderer/renderer_module_default_options_starboard.cc
@@ -42,16 +42,16 @@ #elif defined(COBALT_FORCE_DIRECT_GLES_RASTERIZER) return scoped_ptr<rasterizer::Rasterizer>( new rasterizer::egl::HardwareRasterizer( - graphics_context, options.skia_texture_atlas_dimensions.width(), - options.skia_texture_atlas_dimensions.height(), + graphics_context, options.skia_glyph_texture_atlas_dimensions.width(), + options.skia_glyph_texture_atlas_dimensions.height(), options.skia_cache_size_in_bytes, options.scratch_surface_cache_size_in_bytes, options.surface_cache_size_in_bytes)); #else return scoped_ptr<rasterizer::Rasterizer>( new rasterizer::skia::HardwareRasterizer( - graphics_context, options.skia_texture_atlas_dimensions.width(), - options.skia_texture_atlas_dimensions.height(), + graphics_context, options.skia_glyph_texture_atlas_dimensions.width(), + options.skia_glyph_texture_atlas_dimensions.height(), options.skia_cache_size_in_bytes, options.scratch_surface_cache_size_in_bytes, options.surface_cache_size_in_bytes)); @@ -64,8 +64,8 @@ #else return scoped_ptr<rasterizer::Rasterizer>( new rasterizer::blitter::HardwareRasterizer( - graphics_context, options.skia_texture_atlas_dimensions.width(), - options.skia_texture_atlas_dimensions.height(), + graphics_context, options.skia_glyph_texture_atlas_dimensions.width(), + options.skia_glyph_texture_atlas_dimensions.height(), options.scratch_surface_cache_size_in_bytes, options.surface_cache_size_in_bytes, options.software_surface_cache_size_in_bytes));
diff --git a/src/cobalt/script/mozjs/util/algorithm_helpers.cc b/src/cobalt/script/mozjs/util/algorithm_helpers.cc index 30ae90a..5d08029 100644 --- a/src/cobalt/script/mozjs/util/algorithm_helpers.cc +++ b/src/cobalt/script/mozjs/util/algorithm_helpers.cc
@@ -134,7 +134,7 @@ bool Call0(JSContext* context, JS::HandleFunction function, JS::HandleObject value, JS::MutableHandleValue out_result) { const size_t kNumArguments = 0; - JS::Value args[kNumArguments]; + JS::Value *args = NULL; js::SetValueRangeToNull(args, kNumArguments); js::AutoValueArray auto_array_rooter(context, args, kNumArguments);
diff --git a/src/cobalt/speech/speech_synthesis.cc b/src/cobalt/speech/speech_synthesis.cc index 3fd8db6..5e3e1bb 100644 --- a/src/cobalt/speech/speech_synthesis.cc +++ b/src/cobalt/speech/speech_synthesis.cc
@@ -50,6 +50,9 @@ (*utterance_iterator)->DispatchErrorCancelledEvent(); } utterances_.clear(); +#if SB_HAS(SPEECH_SYNTHESIS) + SbSpeechSynthesisCancel(); +#endif } void SpeechSynthesis::Resume() {
diff --git a/src/cobalt/xhr/xml_http_request.cc b/src/cobalt/xhr/xml_http_request.cc index 84bb0d3..806c7c5 100644 --- a/src/cobalt/xhr/xml_http_request.cc +++ b/src/cobalt/xhr/xml_http_request.cc
@@ -345,6 +345,13 @@ request_body_text.assign(start + view->byte_offset(), view->byte_length()); } + } else if (request_body->IsType<scoped_refptr<dom::ArrayBuffer> >()) { + scoped_refptr<dom::ArrayBuffer> array_buffer = + request_body->AsType<scoped_refptr<dom::ArrayBuffer> >(); + if (array_buffer->byte_length()) { + const char* start = reinterpret_cast<const char*>(array_buffer->data()); + request_body_text.assign(start, array_buffer->byte_length()); + } } } else { upload_complete_ = true;
diff --git a/src/cobalt/xhr/xml_http_request.h b/src/cobalt/xhr/xml_http_request.h index 8d5843c..5e10595 100644 --- a/src/cobalt/xhr/xml_http_request.h +++ b/src/cobalt/xhr/xml_http_request.h
@@ -59,8 +59,8 @@ typedef script::UnionType2<std::string, scoped_refptr<dom::ArrayBuffer> > ResponseType; - typedef script::UnionType2<std::string, scoped_refptr<dom::ArrayBufferView> > - RequestBodyType; + typedef script::UnionType3<std::string, scoped_refptr<dom::ArrayBufferView>, + scoped_refptr<dom::ArrayBuffer> > RequestBodyType; enum State { kUnsent = 0,
diff --git a/src/cobalt/xhr/xml_http_request.idl b/src/cobalt/xhr/xml_http_request.idl index 7c1b0df..3b164d6 100644 --- a/src/cobalt/xhr/xml_http_request.idl +++ b/src/cobalt/xhr/xml_http_request.idl
@@ -40,8 +40,10 @@ attribute unsigned long timeout; [RaisesException=Setter] attribute boolean withCredentials; readonly attribute XMLHttpRequestUpload upload; - [RaisesException] void send(optional (DOMString or ArrayBufferView)? request_body); - // void send(optional (ArrayBufferView or Blob or Document or DOMString or FormData)? data); + // TODO: Upgrade to void send(optional (Document or BodyInit)? body = null); + // See https://xhr.spec.whatwg.org/#interface-xmlhttprequest. + [RaisesException] void send( + optional (DOMString or ArrayBufferView or ArrayBuffer)? request_body); void abort(); // response
diff --git a/src/crypto/ghash.cc b/src/crypto/ghash.cc index 939dd0b..99eae03 100644 --- a/src/crypto/ghash.cc +++ b/src/crypto/ghash.cc
@@ -4,6 +4,8 @@ #include "crypto/ghash.h" +#include <algorithm> + #include "base/logging.h" #include "base/sys_byteorder.h"
diff --git a/src/nb/reuse_allocator_benchmark.cc b/src/nb/reuse_allocator_benchmark.cc index 299b7f7..7fe94d4 100644 --- a/src/nb/reuse_allocator_benchmark.cc +++ b/src/nb/reuse_allocator_benchmark.cc
@@ -14,6 +14,7 @@ * limitations under the License. */ +#include <algorithm> #include <map> #include <sstream> #include <string>
diff --git a/src/nb/simple_thread.cc b/src/nb/simple_thread.cc index 7bfea39..b8c50d2 100644 --- a/src/nb/simple_thread.cc +++ b/src/nb/simple_thread.cc
@@ -18,6 +18,7 @@ #include "starboard/mutex.h" #include "starboard/thread.h" +#include "starboard/time.h" #include "starboard/types.h" #include "starboard/log.h" @@ -45,6 +46,14 @@ return; } +void SimpleThread::Sleep(SbTime microseconds) { + SbThreadSleep(microseconds); +} + +void SimpleThread::SleepMilliseconds(int value) { + return Sleep(value * kSbTimeMillisecond); +} + void* SimpleThread::ThreadEntryPoint(void* context) { SimpleThread* this_ptr = static_cast<SimpleThread*>(context); this_ptr->Run();
diff --git a/src/nb/simple_thread.h b/src/nb/simple_thread.h index ce3bbfe..6bc2d97 100644 --- a/src/nb/simple_thread.h +++ b/src/nb/simple_thread.h
@@ -21,6 +21,7 @@ #include "nb/atomic.h" #include "starboard/thread.h" +#include "starboard/time.h" #include "starboard/types.h" namespace nb { @@ -42,6 +43,12 @@ // Destroys the threads resources. void Join(); + bool join_called() const { return join_called_.load(); } + + protected: + static void Sleep(SbTime microseconds); + static void SleepMilliseconds(int value); + private: static void* ThreadEntryPoint(void* context);
diff --git a/src/starboard/creator/shared/configuration_public.h b/src/starboard/creator/shared/configuration_public.h index 1a587d9..f8b220e 100644 --- a/src/starboard/creator/shared/configuration_public.h +++ b/src/starboard/creator/shared/configuration_public.h
@@ -119,6 +119,9 @@ // Whether the current platform provides the standard header float.h. #define SB_HAS_FLOAT_H 1 +// Whether the current platform provides ssize_t. +#define SB_HAS_SSIZE_T 1 + // Whether the current platform has microphone supported. #define SB_HAS_MICROPHONE 0
diff --git a/src/starboard/linux/shared/configuration_public.h b/src/starboard/linux/shared/configuration_public.h index b4bed14..b7c9e2f 100644 --- a/src/starboard/linux/shared/configuration_public.h +++ b/src/starboard/linux/shared/configuration_public.h
@@ -56,6 +56,9 @@ // Whether the current platform provides the standard header float.h. #define SB_HAS_FLOAT_H 1 +// Whether the current platform provides ssize_t. +#define SB_HAS_SSIZE_T 1 + // Whether the current platform has microphone supported. #define SB_HAS_MICROPHONE 0
diff --git a/src/starboard/linux/shared/starboard_platform.gypi b/src/starboard/linux/shared/starboard_platform.gypi index 3750233..9ac2033 100644 --- a/src/starboard/linux/shared/starboard_platform.gypi +++ b/src/starboard/linux/shared/starboard_platform.gypi
@@ -291,6 +291,7 @@ '<(DEPTH)/starboard/shared/stub/image_decode.cc', '<(DEPTH)/starboard/shared/stub/image_is_decode_supported.cc', '<(DEPTH)/starboard/shared/stub/media_is_supported.cc', + '<(DEPTH)/starboard/shared/stub/media_is_transfer_characteristics_supported.cc', '<(DEPTH)/starboard/shared/stub/microphone_close.cc', '<(DEPTH)/starboard/shared/stub/microphone_create.cc', '<(DEPTH)/starboard/shared/stub/microphone_destroy.cc',
diff --git a/src/starboard/linux/x64x11/cpp11/compiler_flags.gypi b/src/starboard/linux/x64x11/cpp11/compiler_flags.gypi index 1210a68..3bd32d7 100644 --- a/src/starboard/linux/x64x11/cpp11/compiler_flags.gypi +++ b/src/starboard/linux/x64x11/cpp11/compiler_flags.gypi
@@ -128,6 +128,7 @@ '-Wno-shift-negative-value', # Width of bit-field exceeds width of its type- value will be truncated '-Wno-bitfield-width', + '-Wno-undefined-var-template', ], }], ['use_asan==1', {
diff --git a/src/starboard/nplb/once_test.cc b/src/starboard/nplb/once_test.cc index c94993d..79853fa 100644 --- a/src/starboard/nplb/once_test.cc +++ b/src/starboard/nplb/once_test.cc
@@ -106,8 +106,8 @@ RunSbOnceContext context; s_global_value = 0; - for (int i = 0; i < kMany; ++i) { - threads[i] = + for (int j = 0; j < kMany; ++j) { + threads[j] = SbThreadCreate(0, kSbThreadNoPriority, kSbThreadNoAffinity, true, kThreadName, RunSbOnceEntryPoint, &context); } @@ -115,7 +115,7 @@ // Wait for all threads to finish initializing and become ready, then // broadcast the signal to begin. We do this to increase the chances that // threads will call SbOnce() at the same time as each other. - for (int i = 0; i < kMany; ++i) { + for (int j = 0; j < kMany; ++j) { context.semaphore.Take(); } {
diff --git a/src/starboard/raspi/shared/starboard_platform.gypi b/src/starboard/raspi/shared/starboard_platform.gypi index 65951fd..dd195e1 100644 --- a/src/starboard/raspi/shared/starboard_platform.gypi +++ b/src/starboard/raspi/shared/starboard_platform.gypi
@@ -334,6 +334,7 @@ '<(DEPTH)/starboard/shared/stub/drm_system_internal.h', '<(DEPTH)/starboard/shared/stub/drm_update_session.cc', '<(DEPTH)/starboard/shared/stub/media_is_supported.cc', + '<(DEPTH)/starboard/shared/stub/media_is_transfer_characteristics_supported.cc', '<(DEPTH)/starboard/shared/stub/system_clear_platform_error.cc', '<(DEPTH)/starboard/shared/stub/system_get_total_gpu_memory.cc', '<(DEPTH)/starboard/shared/stub/system_get_used_gpu_memory.cc',
diff --git a/src/starboard/shared/starboard/application.h b/src/starboard/shared/starboard/application.h index 2469a6e..1137712 100644 --- a/src/starboard/shared/starboard/application.h +++ b/src/starboard/shared/starboard/application.h
@@ -292,6 +292,12 @@ // kSbTimeMax if there are no queued TimedEvents. virtual SbTimeMonotonic GetNextTimedEventTargetTime() = 0; + // Sets the command-line parameters for the application. Used to support + // system message pump-based implementations, which don't call |Run()|. + void SetCommandLine(int argc, const char** argv) { + command_line_.reset(new CommandLine(argc, argv)); + } + // Sets the launch deep link string, if any, which is passed in the start // event that initializes and starts Cobalt. void SetStartLink(const char* start_link); @@ -304,6 +310,10 @@ // Returns the current application state. State state() const { return state_; } + // Returns the error level that the application has been stopped with. |0| + // means "success" or at least "no error." + int error_level() const { return error_level_; } + // Returns true if the Start event should be sent in |Run| before entering the // event loop. Derived classes that return false must call |DispatchStart|. virtual bool IsStartImmediate() { return true; } @@ -317,9 +327,11 @@ // i.e. false means to abort the event queue. bool DispatchAndDelete(Application::Event* event); - private: + // Calls registered Starboard teardown callbacks. This is called only by + // |Run()| or directly by system message pump implementations at teardown. void CallTeardownCallbacks(); + private: // The single application instance. static Application* g_instance;
diff --git a/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc b/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc index 390abe4..0a96110 100644 --- a/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc +++ b/src/starboard/shared/starboard/media/media_can_play_mime_and_key_system.cc
@@ -96,6 +96,7 @@ #include "starboard/shared/starboard/media/media_util.h" using starboard::shared::starboard::media::GetAudioCodecFromString; +using starboard::shared::starboard::media::GetTransferIdFromString; using starboard::shared::starboard::media::GetVideoCodecFromString; using starboard::shared::starboard::media::IsAudioOutputSupported; using starboard::shared::starboard::media::MimeType; @@ -248,6 +249,14 @@ } } + std::string eotf = mime_type.GetParamStringValue("eotf", ""); + if (!eotf.empty()) { + SbMediaTransferId transfer_id = GetTransferIdFromString(eotf); + if (!SbMediaIsTransferCharacteristicsSupported(transfer_id)) { + return kSbMediaSupportTypeNotSupported; + } + } + int width = 0; int height = 0; int fps = 0;
diff --git a/src/starboard/shared/starboard/media/media_support_internal.h b/src/starboard/shared/starboard/media/media_support_internal.h index 8ad5b21..ff42fd6 100644 --- a/src/starboard/shared/starboard/media/media_support_internal.h +++ b/src/starboard/shared/starboard/media/media_support_internal.h
@@ -54,6 +54,14 @@ SB_EXPORT bool SbMediaIsAudioSupported(SbMediaAudioCodec audio_codec, int64_t bitrate); +// Indicates whether this platform supports |transfer_id| as a transfer +// characteristics. If |transfer_id| is not supported under any condition, this +// function returns |false|. +// +// |transfer_id|: The id of transfer charateristics listed in SbMediaTransferId. +SB_EXPORT bool SbMediaIsTransferCharacteristicsSupported( + SbMediaTransferId transfer_id); + #ifdef __cplusplus } // extern "C" #endif
diff --git a/src/starboard/shared/starboard/media/media_util.cc b/src/starboard/shared/starboard/media/media_util.cc index b6fd9d7..bac646d 100644 --- a/src/starboard/shared/starboard/media/media_util.cc +++ b/src/starboard/shared/starboard/media/media_util.cc
@@ -37,6 +37,17 @@ return false; } +SbMediaTransferId GetTransferIdFromString(const std::string& eotf) { + if (eotf == "bt709") { + return kSbMediaTransferIdBt709; + } else if (eotf == "smpte2084") { + return kSbMediaTransferIdSmpteSt2084; + } else if (eotf == "arib-std-b67") { + return kSbMediaTransferIdAribStdB67; + } + return kSbMediaTransferIdUnknown; +} + } // namespace media } // namespace starboard } // namespace shared
diff --git a/src/starboard/shared/starboard/media/media_util.h b/src/starboard/shared/starboard/media/media_util.h index 293a34e..51c793c 100644 --- a/src/starboard/shared/starboard/media/media_util.h +++ b/src/starboard/shared/starboard/media/media_util.h
@@ -15,6 +15,8 @@ #ifndef STARBOARD_SHARED_STARBOARD_MEDIA_MEDIA_UTIL_H_ #define STARBOARD_SHARED_STARBOARD_MEDIA_MEDIA_UTIL_H_ +#include <string> + #include "starboard/media.h" #include "starboard/shared/internal_only.h" @@ -25,6 +27,12 @@ bool IsAudioOutputSupported(SbMediaAudioCodingType coding_type, int channels); +// Turns |eotf| into value of SbMediaTransferId. If |eotf| isn't recognized the +// function returns kSbMediaTransferIdReserved0. +// This function supports all eotfs required by YouTube TV HTML5 Technical +// Requirements (2018). +SbMediaTransferId GetTransferIdFromString(const std::string& eotf); + } // namespace media } // namespace starboard } // namespace shared
diff --git a/src/starboard/shared/starboard/microphone/microphone_internal.h b/src/starboard/shared/starboard/microphone/microphone_internal.h index d34215a..f14e734 100644 --- a/src/starboard/shared/starboard/microphone/microphone_internal.h +++ b/src/starboard/shared/starboard/microphone/microphone_internal.h
@@ -18,6 +18,8 @@ #include "starboard/microphone.h" #include "starboard/shared/internal_only.h" +#if SB_HAS(MICROPHONE) && SB_VERSION(2) + struct SbMicrophonePrivate { virtual ~SbMicrophonePrivate() {} virtual bool Open() = 0; @@ -34,4 +36,6 @@ static void DestroyMicrophone(SbMicrophone microphone); }; +#endif // SB_HAS(MICROPHONE) && SB_VERSION(2) + #endif // STARBOARD_SHARED_STARBOARD_MICROPHONE_MICROPHONE_INTERNAL_H_
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc new file mode 100644 index 0000000..aa77349 --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_cancel.cc
@@ -0,0 +1,29 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION + +#include "starboard/log.h" +#include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h" + +void SbSpeechRecognizerCancel(SbSpeechRecognizer recognizer) { + SB_DCHECK(SbSpeechRecognizerIsValid(recognizer)); + recognizer->Cancel(); +} + +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc new file mode 100644 index 0000000..875726f --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_create.cc
@@ -0,0 +1,28 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION + +#include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h" + +SbSpeechRecognizer SbSpeechRecognizerCreate( + const SbSpeechRecognizerHandler* handler) { + return SbSpeechRecognizerPrivate::CreateSpeechRecognizer(handler); +} + +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc new file mode 100644 index 0000000..b7b052b --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_destroy.cc
@@ -0,0 +1,27 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION + +#include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h" + +void SbSpeechRecognizerDestroy(SbSpeechRecognizer recognizer) { + SbSpeechRecognizerPrivate::DestroySpeechRecognizer(recognizer); +} + +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h new file mode 100644 index 0000000..a69a05c --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h
@@ -0,0 +1,35 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef STARBOARD_SHARED_STARBOARD_SPEECH_RECOGNIZER_SPEECH_RECOGNIZER_INTERNAL_H_ +#define STARBOARD_SHARED_STARBOARD_SPEECH_RECOGNIZER_SPEECH_RECOGNIZER_INTERNAL_H_ + +#include "starboard/shared/internal_only.h" +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION +struct SbSpeechRecognizerPrivate { + virtual ~SbSpeechRecognizerPrivate() {} + virtual bool Start(const SbSpeechConfiguration* configuration) = 0; + virtual void Stop() = 0; + virtual void Cancel() = 0; + static SbSpeechRecognizer CreateSpeechRecognizer( + const SbSpeechRecognizerHandler* handler); + static void DestroySpeechRecognizer(SbSpeechRecognizer speech_recognizer); +}; +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION + +#endif // STARBOARD_SHARED_STARBOARD_SPEECH_RECOGNIZER_SPEECH_RECOGNIZER_INTERNAL_H_
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc new file mode 100644 index 0000000..2fd1002 --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_start.cc
@@ -0,0 +1,30 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION + +#include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h" + +bool SbSpeechRecognizerStart(SbSpeechRecognizer recognizer, + const SbSpeechConfiguration* configuration) { + return SbSpeechRecognizerIsValid(recognizer) + ? recognizer->Start(configuration) + : false; +} + +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION
diff --git a/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc new file mode 100644 index 0000000..e8cadfd --- /dev/null +++ b/src/starboard/shared/starboard/speech_recognizer/speech_recognizer_stop.cc
@@ -0,0 +1,29 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/speech_recognizer.h" + +#if SB_HAS(SPEECH_RECOGNIZER) && \ + SB_API_VERSION >= SB_SPEECH_RECOGNIZER_API_VERSION + +#include "starboard/log.h" +#include "starboard/shared/starboard/speech_recognizer/speech_recognizer_internal.h" + +void SbSpeechRecognizerStop(SbSpeechRecognizer recognizer) { + SB_DCHECK(SbSpeechRecognizerIsValid(recognizer)); + recognizer->Stop(); +} + +#endif // SB_HAS(SPEECH_RECOGNIZER) && SB_API_VERSION >= + // SB_SPEECH_RECOGNIZER_API_VERSION
diff --git a/src/starboard/shared/stub/media_is_transfer_characteristics_supported.cc b/src/starboard/shared/stub/media_is_transfer_characteristics_supported.cc new file mode 100644 index 0000000..e0ed7eb --- /dev/null +++ b/src/starboard/shared/stub/media_is_transfer_characteristics_supported.cc
@@ -0,0 +1,22 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "starboard/shared/starboard/media/media_support_internal.h" + +#include "starboard/media.h" + +SB_EXPORT bool SbMediaIsTransferCharacteristicsSupported( + SbMediaTransferId /*transfer_id*/) { + return false; +}
diff --git a/src/starboard/shared/stub/system_break_into_debugger.cc b/src/starboard/shared/stub/system_break_into_debugger.cc index 59d081e..2fa0f6a 100644 --- a/src/starboard/shared/stub/system_break_into_debugger.cc +++ b/src/starboard/shared/stub/system_break_into_debugger.cc
@@ -15,5 +15,7 @@ #include "starboard/system.h" void SbSystemBreakIntoDebugger() { +#if SB_IS(COMPILER_GCC) __builtin_unreachable(); +#endif }
diff --git a/src/starboard/stub/configuration_public.h b/src/starboard/stub/configuration_public.h index edf093a..5786638 100644 --- a/src/starboard/stub/configuration_public.h +++ b/src/starboard/stub/configuration_public.h
@@ -131,6 +131,9 @@ // Whether the current platform provides the standard header float.h. #define SB_HAS_FLOAT_H 1 +// Whether the current platform provides ssize_t. +#define SB_HAS_SSIZE_T 1 + // Whether the current platform has microphone supported. #define SB_HAS_MICROPHONE 1
diff --git a/src/starboard/stub/starboard_platform.gyp b/src/starboard/stub/starboard_platform.gyp index e2ab6dc..7dfd774 100644 --- a/src/starboard/stub/starboard_platform.gyp +++ b/src/starboard/stub/starboard_platform.gyp
@@ -96,6 +96,7 @@ '<(DEPTH)/starboard/shared/stub/media_is_audio_supported.cc', '<(DEPTH)/starboard/shared/stub/media_is_output_protected.cc', '<(DEPTH)/starboard/shared/stub/media_is_supported.cc', + '<(DEPTH)/starboard/shared/stub/media_is_transfer_characteristics_supported.cc', '<(DEPTH)/starboard/shared/stub/media_is_video_supported.cc', '<(DEPTH)/starboard/shared/stub/media_set_output_protection.cc', '<(DEPTH)/starboard/shared/stub/memory_allocate_aligned_unchecked.cc',
diff --git a/src/starboard/tizen/shared/configuration_public.h b/src/starboard/tizen/shared/configuration_public.h index 16c4066..ff7d28d 100644 --- a/src/starboard/tizen/shared/configuration_public.h +++ b/src/starboard/tizen/shared/configuration_public.h
@@ -49,6 +49,9 @@ // Whether the current platform provides the standard header float.h. #define SB_HAS_FLOAT_H 1 +// Whether the current platform provides ssize_t. +#define SB_HAS_SSIZE_T 1 + // Type detection for wchar_t. #if defined(__WCHAR_MAX__) && \ (__WCHAR_MAX__ == 0x7fffffff || __WCHAR_MAX__ == 0xffffffff)
diff --git a/src/starboard/types.h b/src/starboard/types.h index 64a27c0..37d9e3a 100644 --- a/src/starboard/types.h +++ b/src/starboard/types.h
@@ -83,6 +83,14 @@ typedef SB_UINTPTR uintptr_t; #endif // !SB_HAS(STDINT_H) && !SB_HAS(INTTYPES_H) +#if !SB_HAS(SSIZE_T) +#if SB_IS(32_BIT) +typedef int32_t ssize_t; +#elif SB_IS(64_BIT) +typedef int64_t ssize_t; +#endif +#endif // !SB_HAS(SSIZE_T) + // Simulate stdbool.h for platforms that don't provide it. #if !SB_HAS(STDBOOL_H) && !defined(__cplusplus) #if __STDC_VERSION__ >= 199901L
diff --git a/src/third_party/icu/icu.gyp b/src/third_party/icu/icu.gyp index 7162895..bad1c71 100644 --- a/src/third_party/icu/icu.gyp +++ b/src/third_party/icu/icu.gyp
@@ -154,8 +154,10 @@ 'type': 'static_library', 'defines': [ 'U_HIDE_DATA_SYMBOL', + 'U_ICUDATAENTRY_IN_COMMON', ], 'sources': [ + 'source/stubdata/stubdata.c', ], 'conditions': [ [ 'use_system_icu==1 and want_separate_host_toolset==1', { @@ -304,9 +306,6 @@ 'U_HAVE_NL_LANGINFO_CODESET=0', 'U_HAVE_NL_LANGINFO=0' ], - 'sources': [ - 'source/stubdata/stubdata.c', - ], }], ['OS=="lb_shell"', { 'dependencies': [
diff --git a/src/third_party/libwebp/dec/alpha.c b/src/third_party/libwebp/dec/alpha.c index b5e6891..c81c481 100644 --- a/src/third_party/libwebp/dec/alpha.c +++ b/src/third_party/libwebp/dec/alpha.c
@@ -11,7 +11,12 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> +#endif #include "./vp8i.h" #include "./vp8li.h" #include "../utils/filters.h" @@ -42,8 +47,8 @@ const uint8_t* const alpha_data = data + ALPHA_HEADER_LEN; const size_t alpha_data_size = data_size - ALPHA_HEADER_LEN; - assert(width > 0 && height > 0); - assert(data != NULL && output != NULL); + SB_DCHECK(width > 0 && height > 0); + SB_DCHECK(data != NULL && output != NULL); if (data_size <= ALPHA_HEADER_LEN) { return 0; @@ -64,7 +69,7 @@ if (method == ALPHA_NO_COMPRESSION) { const size_t alpha_decoded_size = height * width; ok = (alpha_data_size >= alpha_decoded_size); - if (ok) memcpy(output, alpha_data, alpha_decoded_size); + if (ok) SbMemoryCopy(output, alpha_data, alpha_decoded_size); } else { ok = VP8LDecodeAlphaImageStream(width, height, alpha_data, alpha_data_size, output); @@ -98,7 +103,7 @@ if (row == 0) { // Decode everything during the first call. - assert(!dec->is_alpha_decoded_); + SB_DCHECK(!dec->is_alpha_decoded_); if (!DecodeAlpha(dec->alpha_data_, (size_t)dec->alpha_data_size_, width, height, dec->alpha_plane_)) { return NULL; // Error.
diff --git a/src/third_party/libwebp/dec/buffer.c b/src/third_party/libwebp/dec/buffer.c index 3855715..24e8abb 100644 --- a/src/third_party/libwebp/dec/buffer.c +++ b/src/third_party/libwebp/dec/buffer.c
@@ -17,6 +17,10 @@ #include "./webpi.h" #include "../utils/utils.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -176,14 +180,14 @@ return 0; // version mismatch } if (buffer == NULL) return 0; - memset(buffer, 0, sizeof(*buffer)); + SbMemorySet(buffer, 0, sizeof(*buffer)); return 1; } void WebPFreeDecBuffer(WebPDecBuffer* buffer) { if (buffer != NULL) { if (!buffer->is_external_memory) - free(buffer->private_memory); + SbMemoryDeallocate(buffer->private_memory); buffer->private_memory = NULL; } }
diff --git a/src/third_party/libwebp/dec/frame.c b/src/third_party/libwebp/dec/frame.c index 5f6a7d9..d73528a 100644 --- a/src/third_party/libwebp/dec/frame.c +++ b/src/third_party/libwebp/dec/frame.c
@@ -11,7 +11,12 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> +#endif #include "./vp8i.h" #include "../utils/utils.h" @@ -92,7 +97,7 @@ static void FilterRow(const VP8Decoder* const dec) { int mb_x; const int mb_y = dec->thread_ctx_.mb_y_; - assert(dec->thread_ctx_.filter_row_); + SB_DCHECK(dec->thread_ctx_.filter_row_); for (mb_x = dec->tl_mb_x_; mb_x < dec->br_mb_x_; ++mb_x) { DoFilter(dec, mb_x, mb_y); } @@ -215,7 +220,7 @@ if (y_start < io->crop_top) { const int delta_y = io->crop_top - y_start; y_start = io->crop_top; - assert(!(delta_y & 1)); + SB_DCHECK(!(delta_y & 1)); io->y += dec->cache_y_stride_ * delta_y; io->u += dec->cache_uv_stride_ * (delta_y >> 1); io->v += dec->cache_uv_stride_ * (delta_y >> 1); @@ -239,9 +244,9 @@ // rotate top samples if needed if (ctx->id_ + 1 == dec->num_caches_) { if (!last_row) { - memcpy(dec->cache_y_ - ysize, ydst + 16 * dec->cache_y_stride_, ysize); - memcpy(dec->cache_u_ - uvsize, udst + 8 * dec->cache_uv_stride_, uvsize); - memcpy(dec->cache_v_ - uvsize, vdst + 8 * dec->cache_uv_stride_, uvsize); + SbMemoryCopy(dec->cache_y_ - ysize, ydst + 16 * dec->cache_y_stride_, ysize); + SbMemoryCopy(dec->cache_u_ - uvsize, udst + 8 * dec->cache_uv_stride_, uvsize); + SbMemoryCopy(dec->cache_v_ - uvsize, vdst + 8 * dec->cache_uv_stride_, uvsize); } } @@ -264,7 +269,7 @@ WebPWorker* const worker = &dec->worker_; // Finish previous job *before* updating context ok &= WebPWorkerSync(worker); - assert(worker->status_ == OK); + SB_DCHECK(worker->status_ == OK); if (ok) { // spawn a new deblocking/output job ctx->io_ = *io; ctx->id_ = dec->cache_id_; @@ -434,7 +439,7 @@ if (needed != (size_t)needed) return 0; // check for overflow if (needed > dec->mem_size_) { - free(dec->mem_); + SbMemoryDeallocate(dec->mem_); dec->mem_size_ = 0; dec->mem_ = WebPSafeMalloc(needed, sizeof(uint8_t)); if (dec->mem_ == NULL) { @@ -471,7 +476,7 @@ } mem = (uint8_t*)((uintptr_t)(mem + ALIGN_MASK) & ~ALIGN_MASK); - assert((yuv_size & ALIGN_MASK) == 0); + SB_DCHECK((yuv_size & ALIGN_MASK) == 0); dec->yuv_b_ = (uint8_t*)mem; mem += yuv_size; @@ -496,13 +501,13 @@ // alpha plane dec->alpha_plane_ = alpha_size ? (uint8_t*)mem : NULL; mem += alpha_size; - assert(mem <= (uint8_t*)dec->mem_ + dec->mem_size_); + SB_DCHECK(mem <= (uint8_t*)dec->mem_ + dec->mem_size_); // note: left-info is initialized once for all. - memset(dec->mb_info_ - 1, 0, mb_info_size); + SbMemorySet(dec->mb_info_ - 1, 0, mb_info_size); // initialize top - memset(dec->intra_t_, B_DC_PRED, intra_pred_mode_size); + SbMemorySet(dec->intra_t_, B_DC_PRED, intra_pred_mode_size); return 1; } @@ -589,15 +594,15 @@ int n; if (dec->mb_y_ > 0) { - memcpy(y_dst - BPS, top_y, 16); - memcpy(u_dst - BPS, top_u, 8); - memcpy(v_dst - BPS, top_v, 8); + SbMemoryCopy(y_dst - BPS, top_y, 16); + SbMemoryCopy(u_dst - BPS, top_u, 8); + SbMemoryCopy(v_dst - BPS, top_v, 8); } else if (dec->mb_x_ == 0) { // we only need to do this init once at block (0,0). // Afterward, it remains valid for the whole topmost row. - memset(y_dst - BPS - 1, 127, 16 + 4 + 1); - memset(u_dst - BPS - 1, 127, 8 + 1); - memset(v_dst - BPS - 1, 127, 8 + 1); + SbMemorySet(y_dst - BPS - 1, 127, 16 + 4 + 1); + SbMemorySet(u_dst - BPS - 1, 127, 8 + 1); + SbMemorySet(v_dst - BPS - 1, 127, 8 + 1); } // predict and add residuals @@ -609,7 +614,7 @@ if (dec->mb_x_ >= dec->mb_w_ - 1) { // on rightmost border top_right[0] = top_y[15] * 0x01010101u; } else { - memcpy(top_right, top_y + 16, sizeof(*top_right)); + SbMemoryCopy(top_right, top_y + 16, sizeof(*top_right)); } } // replicate the top-right pixels below @@ -664,9 +669,9 @@ // stash away top samples for next block if (dec->mb_y_ < dec->mb_h_ - 1) { - memcpy(top_y, y_dst + 15 * BPS, 16); - memcpy(top_u, u_dst + 7 * BPS, 8); - memcpy(top_v, v_dst + 7 * BPS, 8); + SbMemoryCopy(top_y, y_dst + 15 * BPS, 16); + SbMemoryCopy(top_u, u_dst + 7 * BPS, 8); + SbMemoryCopy(top_v, v_dst + 7 * BPS, 8); } } } @@ -678,11 +683,11 @@ uint8_t* const u_out = dec->cache_u_ + dec->mb_x_ * 8 + uv_offset; uint8_t* const v_out = dec->cache_v_ + dec->mb_x_ * 8 + uv_offset; for (j = 0; j < 16; ++j) { - memcpy(y_out + j * dec->cache_y_stride_, y_dst + j * BPS, 16); + SbMemoryCopy(y_out + j * dec->cache_y_stride_, y_dst + j * BPS, 16); } for (j = 0; j < 8; ++j) { - memcpy(u_out + j * dec->cache_uv_stride_, u_dst + j * BPS, 8); - memcpy(v_out + j * dec->cache_uv_stride_, v_dst + j * BPS, 8); + SbMemoryCopy(u_out + j * dec->cache_uv_stride_, u_dst + j * BPS, 8); + SbMemoryCopy(v_out + j * dec->cache_uv_stride_, v_dst + j * BPS, 8); } } }
diff --git a/src/third_party/libwebp/dec/idec.c b/src/third_party/libwebp/dec/idec.c index 5bf79d3..4c01ba2 100644 --- a/src/third_party/libwebp/dec/idec.c +++ b/src/third_party/libwebp/dec/idec.c
@@ -12,7 +12,8 @@ // Author: somnath@google.com (Somnath Banerjee) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <string.h> @@ -115,7 +116,7 @@ return 0; // ALPH chunk is not present for lossless images. } else { const VP8Decoder* const dec = (VP8Decoder*)idec->dec_; - assert(dec != NULL); // Must be true as idec->state_ != STATE_PRE_VP8. + SB_DCHECK(dec != NULL); // Must be true as idec->state_ != STATE_PRE_VP8. return (dec->alpha_data_ != NULL) && !dec->is_alpha_decoded_; } } @@ -143,7 +144,7 @@ RemapBitReader(&dec->br_, offset); } } - assert(last_part >= 0); + SB_DCHECK(last_part >= 0); dec->parts_[last_part].buf_end_ = mem->buf_ + mem->end_; if (NeedCompressedAlpha(idec)) dec->alpha_data_ += offset; } else { // Resize lossless bitreader @@ -163,7 +164,7 @@ const uint8_t* const old_start = mem->buf_ + mem->start_; const uint8_t* const old_base = need_compressed_alpha ? dec->alpha_data_ : old_start; - assert(mem->mode_ == MEM_MODE_APPEND); + SB_DCHECK(mem->mode_ == MEM_MODE_APPEND); if (data_size > MAX_CHUNK_PAYLOAD) { // security safeguard: trying to allocate more than what the format // allows for a chunk should be considered a smoke smell. @@ -178,17 +179,17 @@ uint8_t* const new_buf = (uint8_t*)WebPSafeMalloc(extra_size, sizeof(*new_buf)); if (new_buf == NULL) return 0; - memcpy(new_buf, old_base, current_size); - free(mem->buf_); + SbMemoryCopy(new_buf, old_base, current_size); + SbMemoryDeallocate(mem->buf_); mem->buf_ = new_buf; mem->buf_size_ = (size_t)extra_size; mem->start_ = new_mem_start; mem->end_ = current_size; } - memcpy(mem->buf_ + mem->end_, data, data_size); + SbMemoryCopy(mem->buf_ + mem->end_, data, data_size); mem->end_ += data_size; - assert(mem->end_ <= mem->buf_size_); + SB_DCHECK(mem->end_ <= mem->buf_size_); DoRemap(idec, mem->buf_ + mem->start_ - old_start); return 1; @@ -199,7 +200,7 @@ MemBuffer* const mem = &idec->mem_; const uint8_t* const old_buf = mem->buf_; const uint8_t* const old_start = old_buf + mem->start_; - assert(mem->mode_ == MEM_MODE_MAP); + SB_DCHECK(mem->mode_ == MEM_MODE_MAP); if (data_size < mem->buf_size_) return 0; // can't remap to a shorter buffer! @@ -219,10 +220,10 @@ } static void ClearMemBuffer(MemBuffer* const mem) { - assert(mem); + SB_DCHECK(mem); if (mem->mode_ == MEM_MODE_APPEND) { - free(mem->buf_); - free((void*)mem->part0_buf_); + SbMemoryDeallocate(mem->buf_); + SbMemoryDeallocate((void*)mem->part0_buf_); } } @@ -232,7 +233,7 @@ } else if (mem->mode_ != expected) { return 0; // we mixed the modes => error } - assert(mem->mode_ == expected); // mode is ok + SB_DCHECK(mem->mode_ == expected); // mode is ok return 1; } @@ -249,8 +250,8 @@ context->info_ = *info; context->br_ = *br; context->token_br_ = *token_br; - memcpy(context->intra_t_, dec->intra_t_ + 4 * dec->mb_x_, 4); - memcpy(context->intra_l_, dec->intra_l_, 4); + SbMemoryCopy(context->intra_t_, dec->intra_t_ + 4 * dec->mb_x_, 4); + SbMemoryCopy(context->intra_l_, dec->intra_l_, 4); } static void RestoreContext(const MBContext* context, VP8Decoder* const dec, @@ -263,8 +264,8 @@ *info = context->info_; *br = context->br_; *token_br = context->token_br_; - memcpy(dec->intra_t_ + 4 * dec->mb_x_, context->intra_t_, 4); - memcpy(dec->intra_l_, context->intra_l_, 4); + SbMemoryCopy(dec->intra_t_ + 4 * dec->mb_x_, context->intra_t_, 4); + SbMemoryCopy(dec->intra_l_, context->intra_l_, 4); } //------------------------------------------------------------------------------ @@ -285,7 +286,7 @@ MemBuffer* const mem = &idec->mem_; idec->state_ = new_state; mem->start_ += consumed_bytes; - assert(mem->start_ <= mem->end_); + SB_DCHECK(mem->start_ <= mem->end_); idec->io_.data = mem->buf_ + mem->start_; idec->io_.data_size = MemDataSize(mem); } @@ -363,17 +364,17 @@ VP8BitReader* const br = &dec->br_; const size_t psize = br->buf_end_ - br->buf_; MemBuffer* const mem = &idec->mem_; - assert(!idec->is_lossless_); - assert(mem->part0_buf_ == NULL); - assert(psize > 0); - assert(psize <= mem->part0_size_); // Format limit: no need for runtime check + SB_DCHECK(!idec->is_lossless_); + SB_DCHECK(mem->part0_buf_ == NULL); + SB_DCHECK(psize > 0); + SB_DCHECK(psize <= mem->part0_size_); // Format limit: no need for runtime check if (mem->mode_ == MEM_MODE_APPEND) { // We copy and grab ownership of the partition #0 data. - uint8_t* const part0_buf = (uint8_t*)malloc(psize); + uint8_t* const part0_buf = (uint8_t*)SbMemoryAllocate(psize); if (part0_buf == NULL) { return 0; } - memcpy(part0_buf, br->buf_, psize); + SbMemoryCopy(part0_buf, br->buf_, psize); mem->part0_buf_ = part0_buf; br->buf_ = part0_buf; br->buf_end_ = part0_buf + psize; @@ -436,7 +437,7 @@ VP8Decoder* const dec = (VP8Decoder*)idec->dec_; VP8Io* const io = &idec->io_; - assert(dec->ready_); + SB_DCHECK(dec->ready_); for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) { VP8BitReader* token_br = &dec->parts_[dec->mb_y_ & (dec->num_parts_ - 1)]; @@ -461,7 +462,7 @@ // Release buffer only if there is only one partition if (dec->num_parts_ == 1) { idec->mem_.start_ = token_br->buf_ - idec->mem_.buf_; - assert(idec->mem_.start_ <= idec->mem_.end_); + SB_DCHECK(idec->mem_.start_ <= idec->mem_.end_); } } if (!VP8ProcessRow(dec, io)) { @@ -492,7 +493,7 @@ const WebPDecParams* const params = &idec->params_; WebPDecBuffer* const output = params->output; size_t curr_size = MemDataSize(&idec->mem_); - assert(idec->is_lossless_); + SB_DCHECK(idec->is_lossless_); // Wait until there's enough data for decoding header. if (curr_size < (idec->chunk_size_ >> 3)) { @@ -515,7 +516,7 @@ static VP8StatusCode DecodeVP8LData(WebPIDecoder* const idec) { VP8LDecoder* const dec = (VP8LDecoder*)idec->dec_; const size_t curr_size = MemDataSize(&idec->mem_); - assert(idec->is_lossless_); + SB_DCHECK(idec->is_lossless_); // At present Lossless decoder can't decode image incrementally. So wait till // all the image data is aggregated before image can be decoded. @@ -565,7 +566,7 @@ // Public functions WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer) { - WebPIDecoder* idec = (WebPIDecoder*)calloc(1, sizeof(*idec)); + WebPIDecoder* idec = (WebPIDecoder*)SbMemoryCalloc(1, sizeof(*idec)); if (idec == NULL) { return NULL; } @@ -617,7 +618,7 @@ } ClearMemBuffer(&idec->mem_); WebPFreeDecBuffer(&idec->output_); - free(idec); + SbMemoryDeallocate(idec); } //------------------------------------------------------------------------------ @@ -702,7 +703,7 @@ //------------------------------------------------------------------------------ static VP8StatusCode IDecCheckStatus(const WebPIDecoder* const idec) { - assert(idec); + SB_DCHECK(idec); if (idec->state_ == STATE_ERROR) { return VP8_STATUS_BITSTREAM_ERROR; }
diff --git a/src/third_party/libwebp/dec/io.c b/src/third_party/libwebp/dec/io.c index dea517e..60a6865 100644 --- a/src/third_party/libwebp/dec/io.c +++ b/src/third_party/libwebp/dec/io.c
@@ -12,7 +12,8 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -42,11 +43,11 @@ const int uv_h = (mb_h + 1) / 2; int j; for (j = 0; j < mb_h; ++j) { - memcpy(y_dst + j * buf->y_stride, io->y + j * io->y_stride, mb_w); + SbMemoryCopy(y_dst + j * buf->y_stride, io->y + j * io->y_stride, mb_w); } for (j = 0; j < uv_h; ++j) { - memcpy(u_dst + j * buf->u_stride, io->u + j * io->uv_stride, uv_w); - memcpy(v_dst + j * buf->v_stride, io->v + j * io->uv_stride, uv_w); + SbMemoryCopy(u_dst + j * buf->u_stride, io->u + j * io->uv_stride, uv_w); + SbMemoryCopy(v_dst + j * buf->v_stride, io->v + j * io->uv_stride, uv_w); } return io->mb_h; } @@ -147,9 +148,9 @@ cur_y += io->y_stride; if (io->crop_top + y_end < io->crop_bottom) { // Save the unfinished samples for next call (as we're not done yet). - memcpy(p->tmp_y, cur_y, mb_w * sizeof(*p->tmp_y)); - memcpy(p->tmp_u, cur_u, uv_w * sizeof(*p->tmp_u)); - memcpy(p->tmp_v, cur_v, uv_w * sizeof(*p->tmp_v)); + SbMemoryCopy(p->tmp_y, cur_y, mb_w * sizeof(*p->tmp_y)); + SbMemoryCopy(p->tmp_u, cur_u, uv_w * sizeof(*p->tmp_u)); + SbMemoryCopy(p->tmp_v, cur_v, uv_w * sizeof(*p->tmp_v)); // The fancy upsampler leaves a row unfinished behind // (except for the very last row) num_lines_out--; @@ -177,14 +178,14 @@ if (alpha != NULL) { for (j = 0; j < mb_h; ++j) { - memcpy(dst, alpha, mb_w * sizeof(*dst)); + SbMemoryCopy(dst, alpha, mb_w * sizeof(*dst)); alpha += io->width; dst += buf->a_stride; } } else if (buf->a != NULL) { // the user requested alpha, but there is none, set it to opaque. for (j = 0; j < mb_h; ++j) { - memset(dst, 0xff, mb_w * sizeof(*dst)); + SbMemorySet(dst, 0xff, mb_w * sizeof(*dst)); dst += buf->a_stride; } } @@ -329,7 +330,7 @@ if (has_alpha) { tmp_size += work_size; } - p->memory = calloc(1, tmp_size * sizeof(*work)); + p->memory = SbMemoryCalloc(1, tmp_size * sizeof(*work)); if (p->memory == NULL) { return 0; // memory error } @@ -373,8 +374,8 @@ // U/V can be +1/-1 line from the Y one. Hence the double test. while (WebPRescalerHasPendingOutput(&p->scaler_y) && WebPRescalerHasPendingOutput(&p->scaler_u)) { - assert(p->last_y + y_pos + num_lines_out < p->output->height); - assert(p->scaler_u.y_accum == p->scaler_v.y_accum); + SB_DCHECK(p->last_y + y_pos + num_lines_out < p->output->height); + SB_DCHECK(p->scaler_u.y_accum == p->scaler_v.y_accum); WebPRescalerExportRow(&p->scaler_y); WebPRescalerExportRow(&p->scaler_u); WebPRescalerExportRow(&p->scaler_v); @@ -402,7 +403,7 @@ WebPRescalerImport(&p->scaler_v, uv_mb_h - uv_j, io->v + uv_j * io->uv_stride, io->uv_stride); (void)v_lines_in; // remove a gcc warning - assert(u_lines_in == v_lines_in); + SB_DCHECK(u_lines_in == v_lines_in); j += y_lines_in; uv_j += u_lines_in; num_lines_out += ExportRGB(p, num_lines_out); @@ -424,7 +425,7 @@ while (WebPRescalerHasPendingOutput(&p->scaler_a)) { int i; - assert(p->last_y + y_pos + num_lines_out < p->output->height); + SB_DCHECK(p->last_y + y_pos + num_lines_out < p->output->height); WebPRescalerExportRow(&p->scaler_a); for (i = 0; i < width; ++i) { const uint32_t alpha_value = p->scaler_a.dst[i]; @@ -453,7 +454,7 @@ while (WebPRescalerHasPendingOutput(&p->scaler_a)) { int i; - assert(p->last_y + y_pos + num_lines_out < p->output->height); + SB_DCHECK(p->last_y + y_pos + num_lines_out < p->output->height); WebPRescalerExportRow(&p->scaler_a); for (i = 0; i < width; ++i) { // Fill in the alpha value (converted to 4 bits). @@ -501,7 +502,7 @@ tmp_size1 += work_size; tmp_size2 += out_width; } - p->memory = calloc(1, tmp_size1 * sizeof(*work) + tmp_size2 * sizeof(*tmp)); + p->memory = SbMemoryCalloc(1, tmp_size1 * sizeof(*work) + tmp_size2 * sizeof(*tmp)); if (p->memory == NULL) { return 0; // memory error } @@ -565,7 +566,7 @@ #ifdef FANCY_UPSAMPLING if (io->fancy_upsampling) { const int uv_width = (io->mb_w + 1) >> 1; - p->memory = malloc(io->mb_w + 2 * uv_width); + p->memory = SbMemoryAllocate(io->mb_w + 2 * uv_width); if (p->memory == NULL) { return 0; // memory error. } @@ -602,7 +603,7 @@ const int mb_w = io->mb_w; const int mb_h = io->mb_h; int num_lines_out; - assert(!(io->mb_y & 1)); + SB_DCHECK(!(io->mb_y & 1)); if (mb_w <= 0 || mb_h <= 0) { return 0; @@ -619,7 +620,7 @@ static void CustomTeardown(const VP8Io* io) { WebPDecParams* const p = (WebPDecParams*)io->opaque; - free(p->memory); + SbMemoryDeallocate(p->memory); p->memory = NULL; }
diff --git a/src/third_party/libwebp/dec/layer.c b/src/third_party/libwebp/dec/layer.c index ccb036a..3a7042f 100644 --- a/src/third_party/libwebp/dec/layer.c +++ b/src/third_party/libwebp/dec/layer.c
@@ -12,7 +12,7 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" #else #include <assert.h> #include <stdlib.h> @@ -27,8 +27,8 @@ //------------------------------------------------------------------------------ int VP8DecodeLayer(VP8Decoder* const dec) { - assert(dec); - assert(dec->layer_data_size_ > 0); + SB_DCHECK(dec); + SB_DCHECK(dec->layer_data_size_ > 0); (void)dec; // TODO: handle enhancement layer here.
diff --git a/src/third_party/libwebp/dec/tree.c b/src/third_party/libwebp/dec/tree.c index 3f02efe..dcb32fc 100644 --- a/src/third_party/libwebp/dec/tree.c +++ b/src/third_party/libwebp/dec/tree.c
@@ -15,6 +15,10 @@ #define USE_GENERIC_TREE +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -327,12 +331,12 @@ }; void VP8ResetProba(VP8Proba* const proba) { - memset(proba->segments_, 255u, sizeof(proba->segments_)); - memcpy(proba->coeffs_, CoeffsProba0, sizeof(CoeffsProba0)); + SbMemorySet(proba->segments_, 255u, sizeof(proba->segments_)); + SbMemoryCopy(proba->coeffs_, CoeffsProba0, sizeof(CoeffsProba0)); #ifndef ONLY_KEYFRAME_CODE - memcpy(proba->mv_, kMVProba0, sizeof(kMVProba0)); - memcpy(proba->ymode_, kYModeProbaInter0, sizeof(kYModeProbaInter0)); - memcpy(proba->uvmode_, kUVModeProbaInter0, sizeof(kUVModeProbaInter0)); + SbMemoryCopy(proba->mv_, kMVProba0, sizeof(kMVProba0)); + SbMemoryCopy(proba->ymode_, kYModeProbaInter0, sizeof(kYModeProbaInter0)); + SbMemoryCopy(proba->uvmode_, kUVModeProbaInter0, sizeof(kUVModeProbaInter0)); #endif } @@ -346,8 +350,8 @@ VP8GetBit(br, 156) ? (VP8GetBit(br, 128) ? TM_PRED : H_PRED) : (VP8GetBit(br, 163) ? V_PRED : DC_PRED); dec->imodes_[0] = ymode; - memset(top, ymode, 4 * sizeof(top[0])); - memset(left, ymode, 4 * sizeof(left[0])); + SbMemorySet(top, ymode, 4 * sizeof(top[0])); + SbMemorySet(left, ymode, 4 * sizeof(left[0])); } else { uint8_t* modes = dec->imodes_; int y;
diff --git a/src/third_party/libwebp/dec/vp8.c b/src/third_party/libwebp/dec/vp8.c index 8632e48..ad3ae29 100644 --- a/src/third_party/libwebp/dec/vp8.c +++ b/src/third_party/libwebp/dec/vp8.c
@@ -11,7 +11,12 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> +#endif #include "./vp8i.h" #include "./vp8li.h" @@ -41,13 +46,13 @@ return 0; // mismatch error } if (io != NULL) { - memset(io, 0, sizeof(*io)); + SbMemorySet(io, 0, sizeof(*io)); } return 1; } VP8Decoder* VP8New(void) { - VP8Decoder* const dec = (VP8Decoder*)calloc(1, sizeof(*dec)); + VP8Decoder* const dec = (VP8Decoder*)SbMemoryCalloc(1, sizeof(*dec)); if (dec != NULL) { SetOk(dec); WebPWorkerInit(&dec->worker_); @@ -71,7 +76,7 @@ void VP8Delete(VP8Decoder* const dec) { if (dec != NULL) { VP8Clear(dec); - free(dec); + SbMemoryDeallocate(dec); } } @@ -139,19 +144,19 @@ // Header parsing static void ResetSegmentHeader(VP8SegmentHeader* const hdr) { - assert(hdr != NULL); + SB_DCHECK(hdr != NULL); hdr->use_segment_ = 0; hdr->update_map_ = 0; hdr->absolute_delta_ = 1; - memset(hdr->quantizer_, 0, sizeof(hdr->quantizer_)); - memset(hdr->filter_strength_, 0, sizeof(hdr->filter_strength_)); + SbMemorySet(hdr->quantizer_, 0, sizeof(hdr->quantizer_)); + SbMemorySet(hdr->filter_strength_, 0, sizeof(hdr->filter_strength_)); } // Paragraph 9.3 static int ParseSegmentHeader(VP8BitReader* br, VP8SegmentHeader* hdr, VP8Proba* proba) { - assert(br != NULL); - assert(hdr != NULL); + SB_DCHECK(br != NULL); + SB_DCHECK(hdr != NULL); hdr->use_segment_ = VP8Get(br); if (hdr->use_segment_) { hdr->update_map_ = VP8Get(br); @@ -273,7 +278,7 @@ } if (dec->alpha_data_ == NULL) { - assert(dec->alpha_data_size_ == 0); + SB_DCHECK(dec->alpha_data_size_ == 0); // We have NOT set alpha data yet. Set it now. // (This is to ensure that dec->alpha_data_ is NOT reset to NULL if // WebPParseHeaders() is called more than once, as in incremental decoding @@ -285,7 +290,7 @@ // Process the VP8 frame header. buf = headers.data + headers.offset; buf_size = headers.data_size - headers.offset; - assert(headers.data_size >= headers.offset); // WebPParseHeaders' guarantee + SB_DCHECK(headers.data_size >= headers.offset); // WebPParseHeaders' guarantee if (buf_size < 4) { return VP8SetError(dec, VP8_STATUS_NOT_ENOUGH_DATA, "Truncated header."); @@ -563,7 +568,7 @@ int x, y, ch; nz_dc.i32 = nz_ac.i32 = 0; - memset(dst, 0, 384 * sizeof(*dst)); + SbMemorySet(dst, 0, 384 * sizeof(*dst)); if (!dec->is_i4x4_) { // parse DC int16_t dc[16] = { 0 }; const int ctx = mb->dc_nz_ + left_mb->dc_nz_; @@ -676,7 +681,7 @@ VP8MB* const left = dec->mb_info_ - 1; left->nz_ = 0; left->dc_nz_ = 0; - memset(dec->intra_l_, B_DC_PRED, sizeof(dec->intra_l_)); + SbMemorySet(dec->intra_l_, B_DC_PRED, sizeof(dec->intra_l_)); dec->filter_row_ = (dec->filter_type_ > 0) && (dec->mb_y_ >= dec->tl_mb_y_) && (dec->mb_y_ <= dec->br_mb_y_); @@ -737,7 +742,7 @@ return 0; } } - assert(dec->ready_); + SB_DCHECK(dec->ready_); // Finish setting up the decoding parameter. Will call io->setup(). ok = (VP8EnterCritical(dec, io) == VP8_STATUS_OK); @@ -769,11 +774,11 @@ WebPWorkerEnd(&dec->worker_); } if (dec->mem_) { - free(dec->mem_); + SbMemoryDeallocate(dec->mem_); } dec->mem_ = NULL; dec->mem_size_ = 0; - memset(&dec->br_, 0, sizeof(dec->br_)); + SbMemorySet(&dec->br_, 0, sizeof(dec->br_)); dec->ready_ = 0; }
diff --git a/src/third_party/libwebp/dec/vp8i.h b/src/third_party/libwebp/dec/vp8i.h index 1d0d407..91d27f1 100644 --- a/src/third_party/libwebp/dec/vp8i.h +++ b/src/third_party/libwebp/dec/vp8i.h
@@ -14,7 +14,12 @@ #ifndef WEBP_DEC_VP8I_H_ #define WEBP_DEC_VP8I_H_ +#if defined(STARBOARD) +#include "starboard/memory.h" +#else #include <string.h> // for memcpy() +#endif + #include "./vp8li.h" #include "../utils/bit_reader.h" #include "../utils/thread.h"
diff --git a/src/third_party/libwebp/dec/vp8l.c b/src/third_party/libwebp/dec/vp8l.c index 89b5b4b..83ea9e2 100644 --- a/src/third_party/libwebp/dec/vp8l.c +++ b/src/third_party/libwebp/dec/vp8l.c
@@ -12,8 +12,14 @@ // Authors: Vikas Arora (vikaas.arora@gmail.com) // Jyrki Alakuijala (jyrki@google.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdio.h> #include <stdlib.h> +#endif + #include "./vp8li.h" #include "../dsp/lossless.h" #include "../dsp/yuv.h" @@ -157,7 +163,7 @@ const HuffmanTreeNode* node = tree->root_; int num_bits = 0; uint32_t bits = VP8LPrefetchBits(br); - assert(node != NULL); + SB_DCHECK(node != NULL); while (!HuffmanTreeNodeIsLeaf(node)) { node = HuffmanTreeNextNode(node, bits & 1); bits >>= 1; @@ -274,7 +280,7 @@ if (ok) { ok = HuffmanTreeBuildImplicit(tree, code_lengths, alphabet_size); } - free(code_lengths); + SbMemoryDeallocate(code_lengths); } ok = ok && !br->error_; if (!ok) { @@ -293,7 +299,7 @@ HuffmanTreeRelease(&htrees[j]); } } - free(htree_groups); + SbMemoryDeallocate(htree_groups); } } @@ -330,7 +336,7 @@ if (br->error_) goto Error; - assert(num_htree_groups <= 0x10000); + SB_DCHECK(num_htree_groups <= 0x10000); htree_groups = (HTreeGroup*)WebPSafeCalloc((uint64_t)num_htree_groups, sizeof(*htree_groups)); @@ -357,7 +363,7 @@ return 1; Error: - free(huffman_image); + SbMemoryDeallocate(huffman_image); DeleteHtreeGroups(htree_groups, num_htree_groups); return 0; } @@ -383,7 +389,7 @@ dec->status_ = VP8_STATUS_OUT_OF_MEMORY; return 0; } - assert(dec->rescaler_memory == NULL); + SB_DCHECK(dec->rescaler_memory == NULL); dec->rescaler_memory = memory; dec->rescaler = (WebPRescaler*)memory; @@ -567,8 +573,8 @@ // Returns true if the crop window is not empty. static int SetCropWindow(VP8Io* const io, int y_start, int y_end, const uint32_t** const in_data, int pixel_stride) { - assert(y_start < y_end); - assert(io->crop_left < io->crop_right); + SB_DCHECK(y_start < y_end); + SB_DCHECK(io->crop_left < io->crop_right); if (y_end > io->crop_bottom) { y_end = io->crop_bottom; // make sure we don't overflow on last row. } @@ -599,7 +605,7 @@ int x, int y) { const int meta_index = GetMetaIndex(hdr->huffman_image_, hdr->huffman_xsize_, hdr->huffman_subsample_bits_, x, y); - assert(meta_index < hdr->num_htree_groups_); + SB_DCHECK(meta_index < hdr->num_htree_groups_); return hdr->htree_groups_ + meta_index; } @@ -619,7 +625,7 @@ // Inverse transforms. // TODO: most transforms only need to operate on the cropped region only. - memcpy(rows_out, rows_in, cache_pixs * sizeof(*rows_out)); + SbMemoryCopy(rows_out, rows_in, cache_pixs * sizeof(*rows_out)); while (n-- > 0) { VP8LTransform* const transform = &dec->transforms_[n]; VP8LInverseTransform(transform, start_row, end_row, rows_in, rows_out); @@ -635,8 +641,8 @@ const uint8_t* rows_in = rows; uint8_t* rows_out = (uint8_t*)dec->io_->opaque + dec->io_->width * start_row; VP8LTransform* const transform = &dec->transforms_[0]; - assert(dec->next_transform_ == 1); - assert(transform->type_ == COLOR_INDEXING_TRANSFORM); + SB_DCHECK(dec->next_transform_ == 1); + SB_DCHECK(transform->type_ == COLOR_INDEXING_TRANSFORM); VP8LColorIndexInverseTransformAlpha(transform, start_row, end_row, rows_in, rows_out); } @@ -674,13 +680,13 @@ EmitRescaledRowsYUVA(dec, rows_data, in_stride, io->mb_h) : EmitRowsYUVA(dec, rows_data, in_stride, io->mb_w, io->mb_h); } - assert(dec->last_out_row_ <= output->height); + SB_DCHECK(dec->last_out_row_ <= output->height); } } // Update 'last_row_'. dec->last_row_ = row; - assert(dec->last_row_ <= dec->height_); + SB_DCHECK(dec->last_row_ <= dec->height_); } #define DECODE_DATA_FUNC(FUNC_NAME, TYPE, STORE_PIXEL) \ @@ -699,7 +705,7 @@ VP8LColorCache* const color_cache = \ (hdr->color_cache_size_ > 0) ? &hdr->color_cache_ : NULL; \ const int mask = hdr->huffman_mask_; \ - assert(htree_group != NULL); \ + SB_DCHECK(htree_group != NULL); \ while (!br->eos_ && src < src_end) { \ int code; \ /* Only update when changing tile. Note we could use this test: */ \ @@ -768,7 +774,7 @@ } \ } else if (code < color_cache_limit) { /* Color cache */ \ const int key = code - len_code_limit; \ - assert(color_cache != NULL); \ + SB_DCHECK(color_cache != NULL); \ while (last_cached < src) { \ VP8LColorCacheInsert(color_cache, *last_cached++); \ } \ @@ -816,7 +822,7 @@ // VP8LTransform static void ClearTransform(VP8LTransform* const transform) { - free(transform->data_); + SbMemoryDeallocate(transform->data_); transform->data_ = NULL; } @@ -840,7 +846,7 @@ } for (; i < 4 * final_num_colors; ++i) new_data[i] = 0; // black tail. - free(transform->data_); + SbMemoryDeallocate(transform->data_); transform->data_ = new_color_map; } return 1; @@ -865,7 +871,7 @@ transform->ysize_ = *ysize; transform->data_ = NULL; ++dec->next_transform_; - assert(dec->next_transform_ <= NUM_TRANSFORMS); + SB_DCHECK(dec->next_transform_ <= NUM_TRANSFORMS); switch (type) { case PREDICTOR_TRANSFORM: @@ -892,7 +898,7 @@ case SUBTRACT_GREEN: break; default: - assert(0); // can't happen + SB_DCHECK(0); // can't happen break; } @@ -903,14 +909,14 @@ // VP8LMetadata static void InitMetadata(VP8LMetadata* const hdr) { - assert(hdr); - memset(hdr, 0, sizeof(*hdr)); + SB_DCHECK(hdr); + SbMemorySet(hdr, 0, sizeof(*hdr)); } static void ClearMetadata(VP8LMetadata* const hdr) { - assert(hdr); + SB_DCHECK(hdr); - free(hdr->huffman_image_); + SbMemoryDeallocate(hdr->huffman_image_); DeleteHtreeGroups(hdr->htree_groups_, hdr->num_htree_groups_); VP8LColorCacheClear(&hdr->color_cache_); InitMetadata(hdr); @@ -920,7 +926,7 @@ // VP8LDecoder VP8LDecoder* VP8LNew(void) { - VP8LDecoder* const dec = (VP8LDecoder*)calloc(1, sizeof(*dec)); + VP8LDecoder* const dec = (VP8LDecoder*)SbMemoryCalloc(1, sizeof(*dec)); if (dec == NULL) return NULL; dec->status_ = VP8_STATUS_OK; dec->action_ = READ_DIM; @@ -933,7 +939,7 @@ if (dec == NULL) return; ClearMetadata(&dec->hdr_); - free(dec->pixels_); + SbMemoryDeallocate(dec->pixels_); dec->pixels_ = NULL; for (i = 0; i < dec->next_transform_; ++i) { ClearTransform(&dec->transforms_[i]); @@ -941,7 +947,7 @@ dec->next_transform_ = 0; dec->transforms_seen_ = 0; - free(dec->rescaler_memory); + SbMemoryDeallocate(dec->rescaler_memory); dec->rescaler_memory = NULL; dec->output_ = NULL; // leave no trace behind @@ -950,7 +956,7 @@ void VP8LDelete(VP8LDecoder* const dec) { if (dec != NULL) { VP8LClear(dec); - free(dec); + SbMemoryDeallocate(dec); } } @@ -1036,7 +1042,7 @@ End: if (!ok) { - free(data); + SbMemoryDeallocate(data); ClearMetadata(hdr); // If not enough data (br.eos_) resulted in BIT_STREAM_ERROR, update the // status appropriately. @@ -1049,8 +1055,8 @@ } else { // We allocate image data in this function only for transforms. At level 0 // (that is: not the transforms), we shouldn't have allocated anything. - assert(data == NULL); - assert(is_level0); + SB_DCHECK(data == NULL); + SB_DCHECK(is_level0); } if (!is_level0) ClearMetadata(hdr); // Clean up temporary data behind. } @@ -1073,7 +1079,7 @@ const uint64_t total_num_pixels = num_pixels + cache_top_pixels + cache_pixels; - assert(dec->width_ <= final_width); + SB_DCHECK(dec->width_ <= final_width); dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, bytes_per_pixel); if (dec->pixels_ == NULL) { dec->argb_cache_ = NULL; // for sanity check @@ -1195,7 +1201,7 @@ Error: VP8LClear(dec); - assert(dec->status_ != VP8_STATUS_OK); + SB_DCHECK(dec->status_ != VP8_STATUS_OK); return 0; } @@ -1208,11 +1214,11 @@ if (dec == NULL) return 0; io = dec->io_; - assert(io != NULL); + SB_DCHECK(io != NULL); params = (WebPDecParams*)io->opaque; - assert(params != NULL); + SB_DCHECK(params != NULL); dec->output_ = params->output; - assert(dec->output_ != NULL); + SB_DCHECK(dec->output_ != NULL); // Initialization. if (!WebPIoInitFromOptions(params->options, io, MODE_BGRA)) { @@ -1238,7 +1244,7 @@ Err: VP8LClear(dec); - assert(dec->status_ != VP8_STATUS_OK); + SB_DCHECK(dec->status_ != VP8_STATUS_OK); return 0; }
diff --git a/src/third_party/libwebp/dec/vp8li.h b/src/third_party/libwebp/dec/vp8li.h index 543a767..dbdd9c1 100644 --- a/src/third_party/libwebp/dec/vp8li.h +++ b/src/third_party/libwebp/dec/vp8li.h
@@ -15,7 +15,12 @@ #ifndef WEBP_DEC_VP8LI_H_ #define WEBP_DEC_VP8LI_H_ +#if defined(STARBOARD) +#include "starboard/memory.h" +#else #include <string.h> // for memcpy() +#endif + #include "./webpi.h" #include "../utils/bit_reader.h" #include "../utils/color_cache.h"
diff --git a/src/third_party/libwebp/dec/webp.c b/src/third_party/libwebp/dec/webp.c index 97e79b6..3364ab8 100644 --- a/src/third_party/libwebp/dec/webp.c +++ b/src/third_party/libwebp/dec/webp.c
@@ -11,7 +11,12 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> +#endif #include "./vp8i.h" #include "./vp8li.h" @@ -64,13 +69,13 @@ static VP8StatusCode ParseRIFF(const uint8_t** const data, size_t* const data_size, size_t* const riff_size) { - assert(data != NULL); - assert(data_size != NULL); - assert(riff_size != NULL); + SB_DCHECK(data != NULL); + SB_DCHECK(data_size != NULL); + SB_DCHECK(riff_size != NULL); *riff_size = 0; // Default: no RIFF present. - if (*data_size >= RIFF_HEADER_SIZE && !memcmp(*data, "RIFF", TAG_SIZE)) { - if (memcmp(*data + 8, "WEBP", TAG_SIZE)) { + if (*data_size >= RIFF_HEADER_SIZE && !SbMemoryCompare(*data, "RIFF", TAG_SIZE)) { + if (SbMemoryCompare(*data + 8, "WEBP", TAG_SIZE)) { return VP8_STATUS_BITSTREAM_ERROR; // Wrong image file signature. } else { const uint32_t size = get_le32(*data + TAG_SIZE); @@ -103,9 +108,9 @@ int* const width_ptr, int* const height_ptr, uint32_t* const flags_ptr) { const uint32_t vp8x_size = CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE; - assert(data != NULL); - assert(data_size != NULL); - assert(found_vp8x != NULL); + SB_DCHECK(data != NULL); + SB_DCHECK(data_size != NULL); + SB_DCHECK(found_vp8x != NULL); *found_vp8x = 0; @@ -113,7 +118,7 @@ return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. } - if (!memcmp(*data, "VP8X", TAG_SIZE)) { + if (!SbMemoryCompare(*data, "VP8X", TAG_SIZE)) { int width, height; uint32_t flags; const uint32_t chunk_size = get_le32(*data + TAG_SIZE); @@ -160,13 +165,13 @@ uint32_t total_size = TAG_SIZE + // "WEBP". CHUNK_HEADER_SIZE + // "VP8Xnnnn". VP8X_CHUNK_SIZE; // data. - assert(data != NULL); - assert(data_size != NULL); + SB_DCHECK(data != NULL); + SB_DCHECK(data_size != NULL); buf = *data; buf_size = *data_size; - assert(alpha_data != NULL); - assert(alpha_size != NULL); + SB_DCHECK(alpha_data != NULL); + SB_DCHECK(alpha_size != NULL); *alpha_data = NULL; *alpha_size = 0; @@ -198,8 +203,8 @@ // parsed all the optional chunks. // Note: This check must occur before the check 'buf_size < disk_chunk_size' // below to allow incomplete VP8/VP8L chunks. - if (!memcmp(buf, "VP8 ", TAG_SIZE) || - !memcmp(buf, "VP8L", TAG_SIZE)) { + if (!SbMemoryCompare(buf, "VP8 ", TAG_SIZE) || + !SbMemoryCompare(buf, "VP8L", TAG_SIZE)) { return VP8_STATUS_OK; } @@ -207,7 +212,7 @@ return VP8_STATUS_NOT_ENOUGH_DATA; } - if (!memcmp(buf, "ALPH", TAG_SIZE)) { // A valid ALPH header. + if (!SbMemoryCompare(buf, "ALPH", TAG_SIZE)) { // A valid ALPH header. *alpha_data = buf + CHUNK_HEADER_SIZE; *alpha_size = chunk_size; } @@ -232,15 +237,15 @@ size_t* const chunk_size, int* const is_lossless) { const uint8_t* const data = *data_ptr; - const int is_vp8 = !memcmp(data, "VP8 ", TAG_SIZE); - const int is_vp8l = !memcmp(data, "VP8L", TAG_SIZE); + const int is_vp8 = !SbMemoryCompare(data, "VP8 ", TAG_SIZE); + const int is_vp8l = !SbMemoryCompare(data, "VP8L", TAG_SIZE); const uint32_t minimal_size = TAG_SIZE + CHUNK_HEADER_SIZE; // "WEBP" + "VP8 nnnn" OR // "WEBP" + "VP8Lnnnn" - assert(data != NULL); - assert(data_size != NULL); - assert(chunk_size != NULL); - assert(is_lossless != NULL); + SB_DCHECK(data != NULL); + SB_DCHECK(data_size != NULL); + SB_DCHECK(chunk_size != NULL); + SB_DCHECK(is_lossless != NULL); if (*data_size < CHUNK_HEADER_SIZE) { return VP8_STATUS_NOT_ENOUGH_DATA; // Insufficient data. @@ -294,7 +299,7 @@ if (data == NULL || data_size < RIFF_HEADER_SIZE) { return VP8_STATUS_NOT_ENOUGH_DATA; } - memset(&hdrs, 0, sizeof(hdrs)); + SbMemorySet(&hdrs, 0, sizeof(hdrs)); hdrs.data = data; hdrs.data_size = data_size; @@ -328,7 +333,7 @@ // Skip over optional chunks if data started with "RIFF + VP8X" or "ALPH". if ((found_riff && found_vp8x) || - (!found_riff && !found_vp8x && !memcmp(data, "ALPH", TAG_SIZE))) { + (!found_riff && !found_vp8x && !SbMemoryCompare(data, "ALPH", TAG_SIZE))) { status = ParseOptionalChunks(&data, &data_size, hdrs.riff_size, &hdrs.alpha_data, &hdrs.alpha_data_size); if (status != VP8_STATUS_OK) { @@ -373,8 +378,8 @@ if (headers != NULL) { *headers = hdrs; headers->offset = data - headers->data; - assert((uint64_t)(data - headers->data) < MAX_CHUNK_PAYLOAD); - assert(headers->offset == headers->data_size - data_size); + SB_DCHECK((uint64_t)(data - headers->data) < MAX_CHUNK_PAYLOAD); + SB_DCHECK(headers->offset == headers->data_size - data_size); } return VP8_STATUS_OK; // Return features from VP8 header. } @@ -382,7 +387,7 @@ VP8StatusCode WebPParseHeaders(WebPHeaderStructure* const headers) { VP8StatusCode status; int has_animation = 0; - assert(headers != NULL); + SB_DCHECK(headers != NULL); // fill out headers, ignore width/height/has_alpha. status = ParseHeadersInternal(headers->data, headers->data_size, NULL, NULL, NULL, &has_animation, headers); @@ -400,7 +405,7 @@ void WebPResetDecParams(WebPDecParams* const params) { if (params) { - memset(params, 0, sizeof(*params)); + SbMemorySet(params, 0, sizeof(*params)); } } @@ -421,7 +426,7 @@ return status; } - assert(params != NULL); + SB_DCHECK(params != NULL); VP8InitIo(&io); io.data = headers.data + headers.offset; io.data_size = headers.data_size - headers.offset; @@ -626,14 +631,14 @@ *v = buf->v; *stride = buf->y_stride; *uv_stride = buf->u_stride; - assert(buf->u_stride == buf->v_stride); + SB_DCHECK(buf->u_stride == buf->v_stride); } return out; } static void DefaultFeatures(WebPBitstreamFeatures* const features) { - assert(features != NULL); - memset(features, 0, sizeof(*features)); + SB_DCHECK(features != NULL); + SbMemorySet(features, 0, sizeof(*features)); features->bitstream_version = 0; } @@ -683,7 +688,7 @@ if (config == NULL) { return 0; } - memset(config, 0, sizeof(*config)); + SbMemorySet(config, 0, sizeof(*config)); DefaultFeatures(&config->input); WebPInitDecBuffer(&config->output); return 1;
diff --git a/src/third_party/libwebp/demux/demux.c b/src/third_party/libwebp/demux/demux.c index d825d9b..8bca6c6 100644 --- a/src/third_party/libwebp/demux/demux.c +++ b/src/third_party/libwebp/demux/demux.c
@@ -15,7 +15,8 @@ #endif #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -123,7 +124,7 @@ static int InitMemBuffer(MemBuffer* const mem, const uint8_t* data, size_t size) { - memset(mem, 0, sizeof(*mem)); + SbMemorySet(mem, 0, sizeof(*mem)); return RemapMemBuffer(mem, data, size); } @@ -299,7 +300,7 @@ if (actual_size < min_size) return PARSE_ERROR; if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; - *frame = (Frame*)calloc(1, sizeof(**frame)); + *frame = (Frame*)SbMemoryCalloc(1, sizeof(**frame)); return (*frame == NULL) ? PARSE_ERROR : PARSE_OK; } @@ -323,7 +324,7 @@ frame->duration_ = ReadLE24s(mem); frame->dispose_method_ = (WebPMuxAnimDispose)(ReadByte(mem) & 1); if (frame->width_ * (uint64_t)frame->height_ >= MAX_IMAGE_AREA) { - free(frame); + SbMemoryDeallocate(frame); return PARSE_ERROR; } @@ -340,7 +341,7 @@ } } - if (!added_frame) free(frame); + if (!added_frame) SbMemoryDeallocate(frame); return status; } @@ -375,7 +376,7 @@ } } - if (!added_fragment) free(frame); + if (!added_fragment) SbMemoryDeallocate(frame); return status; } #endif // WEBP_EXPERIMENTAL_FEATURES @@ -386,7 +387,7 @@ // Returns true on success, false otherwise. static int StoreChunk(WebPDemuxer* const dmux, size_t start_offset, uint32_t size) { - Chunk* const chunk = (Chunk*)calloc(1, sizeof(*chunk)); + Chunk* const chunk = (Chunk*)SbMemoryCalloc(1, sizeof(*chunk)); if (chunk == NULL) return 0; chunk->data_.offset_ = start_offset; @@ -404,8 +405,8 @@ // Basic file level validation. if (MemDataSize(mem) < min_size) return 0; - if (memcmp(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) || - memcmp(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) { + if (SbMemoryCompare(GetBuffer(mem), "RIFF", CHUNK_SIZE_BYTES) || + SbMemoryCompare(GetBuffer(mem) + CHUNK_HEADER_SIZE, "WEBP", CHUNK_SIZE_BYTES)) { return 0; } @@ -434,7 +435,7 @@ if (SizeIsInvalid(mem, min_size)) return PARSE_ERROR; if (MemDataSize(mem) < min_size) return PARSE_NEED_MORE_DATA; - frame = (Frame*)calloc(1, sizeof(*frame)); + frame = (Frame*)SbMemoryCalloc(1, sizeof(*frame)); if (frame == NULL) return PARSE_ERROR; // For the single image case we allow parsing of a partial frame, but we need @@ -460,7 +461,7 @@ AddFrame(dmux, frame); dmux->num_frames_ = 1; } else { - free(frame); + SbMemoryDeallocate(frame); } return status; @@ -686,12 +687,12 @@ partial = (mem.buf_size_ < mem.riff_end_); if (!allow_partial && partial) return NULL; - dmux = (WebPDemuxer*)calloc(1, sizeof(*dmux)); + dmux = (WebPDemuxer*)SbMemoryCalloc(1, sizeof(*dmux)); if (dmux == NULL) return NULL; InitDemux(dmux, &mem); for (parser = kMasterChunks; parser->parse != NULL; ++parser) { - if (!memcmp(parser->id, GetBuffer(&dmux->mem_), TAG_SIZE)) { + if (!SbMemoryCompare(parser->id, GetBuffer(&dmux->mem_), TAG_SIZE)) { status = parser->parse(dmux); if (status == PARSE_OK) dmux->state_ = WEBP_DEMUX_DONE; if (status == PARSE_NEED_MORE_DATA && !partial) status = PARSE_ERROR; @@ -716,14 +717,14 @@ for (f = dmux->frames_; f != NULL;) { Frame* const cur_frame = f; f = f->next_; - free(cur_frame); + SbMemoryDeallocate(cur_frame); } for (c = dmux->chunks_; c != NULL;) { Chunk* const cur_chunk = c; c = c->next_; - free(cur_chunk); + SbMemoryDeallocate(cur_chunk); } - free(dmux); + SbMemoryDeallocate(dmux); } // ----------------------------------------------------------------------------- @@ -806,7 +807,7 @@ const uint8_t* const payload = GetFramePayload(mem_buf, fragment, &payload_size); if (payload == NULL) return 0; - assert(first_frame != NULL); + SB_DCHECK(first_frame != NULL); iter->frame_num = first_frame->frame_num_; iter->num_frames = dmux->num_frames_; @@ -841,7 +842,7 @@ int WebPDemuxGetFrame(const WebPDemuxer* dmux, int frame, WebPIterator* iter) { if (iter == NULL) return 0; - memset(iter, 0, sizeof(*iter)); + SbMemorySet(iter, 0, sizeof(*iter)); iter->private_ = (void*)dmux; return SetFrame(frame, iter); } @@ -881,7 +882,7 @@ int count = 0; for (c = dmux->chunks_; c != NULL; c = c->next_) { const uint8_t* const header = mem_buf + c->data_.offset_; - if (!memcmp(header, fourcc, TAG_SIZE)) ++count; + if (!SbMemoryCompare(header, fourcc, TAG_SIZE)) ++count; } return count; } @@ -893,7 +894,7 @@ int count = 0; for (c = dmux->chunks_; c != NULL; c = c->next_) { const uint8_t* const header = mem_buf + c->data_.offset_; - if (!memcmp(header, fourcc, TAG_SIZE)) ++count; + if (!SbMemoryCompare(header, fourcc, TAG_SIZE)) ++count; if (count == chunk_num) break; } return c; @@ -926,7 +927,7 @@ WebPChunkIterator* iter) { if (iter == NULL) return 0; - memset(iter, 0, sizeof(*iter)); + SbMemorySet(iter, 0, sizeof(*iter)); iter->private_ = (void*)dmux; return SetChunk(fourcc, chunk_num, iter); }
diff --git a/src/third_party/libwebp/dsp/dec.c b/src/third_party/libwebp/dsp/dec.c index 2fbd6b1..ce32ee3 100644 --- a/src/third_party/libwebp/dsp/dec.c +++ b/src/third_party/libwebp/dsp/dec.c
@@ -14,6 +14,10 @@ #include "./dsp.h" #include "../dec/vp8i.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -196,14 +200,14 @@ static void VE16(uint8_t *dst) { // vertical int j; for (j = 0; j < 16; ++j) { - memcpy(dst + j * BPS, dst - BPS, 16); + SbMemoryCopy(dst + j * BPS, dst - BPS, 16); } } static void HE16(uint8_t *dst) { // horizontal int j; for (j = 16; j > 0; --j) { - memset(dst, dst[-1], 16); + SbMemorySet(dst, dst[-1], 16); dst += BPS; } } @@ -211,7 +215,7 @@ static WEBP_INLINE void Put16(int v, uint8_t* dst) { int j; for (j = 0; j < 16; ++j) { - memset(dst + j * BPS, v, 16); + SbMemorySet(dst + j * BPS, v, 16); } } @@ -262,7 +266,7 @@ }; int i; for (i = 0; i < 4; ++i) { - memcpy(dst + i * BPS, vals, sizeof(vals)); + SbMemoryCopy(dst + i * BPS, vals, sizeof(vals)); } } @@ -283,7 +287,7 @@ int i; for (i = 0; i < 4; ++i) dc += dst[i - BPS] + dst[-1 + i * BPS]; dc >>= 3; - for (i = 0; i < 4; ++i) memset(dst + i * BPS, dc, 4); + for (i = 0; i < 4; ++i) SbMemorySet(dst + i * BPS, dc, 4); } static void RD4(uint8_t *dst) { // Down-right @@ -415,14 +419,14 @@ static void VE8uv(uint8_t *dst) { // vertical int j; for (j = 0; j < 8; ++j) { - memcpy(dst + j * BPS, dst - BPS, 8); + SbMemoryCopy(dst + j * BPS, dst - BPS, 8); } } static void HE8uv(uint8_t *dst) { // horizontal int j; for (j = 0; j < 8; ++j) { - memset(dst, dst[-1], 8); + SbMemorySet(dst, dst[-1], 8); dst += BPS; } } @@ -436,7 +440,7 @@ *(uint64_t*)(dst + j * BPS) = v; } #else - for (j = 0; j < 8; ++j) memset(dst + j * BPS, value, 8); + for (j = 0; j < 8; ++j) SbMemorySet(dst + j * BPS, value, 8); #endif }
diff --git a/src/third_party/libwebp/dsp/enc.c b/src/third_party/libwebp/dsp/enc.c index 552807a..fae8d93 100644 --- a/src/third_party/libwebp/dsp/enc.c +++ b/src/third_party/libwebp/dsp/enc.c
@@ -11,7 +11,13 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/client_porting/poem/stdlib_poem.h" +#include "starboard/memory.h" +#else #include <stdlib.h> // for abs() +#endif + #include "./dsp.h" #include "../enc/vp8enci.h" @@ -229,7 +235,7 @@ static WEBP_INLINE void Fill(uint8_t* dst, int value, int size) { int j; for (j = 0; j < size; ++j) { - memset(dst + j * BPS, value, size); + SbMemorySet(dst + j * BPS, value, size); } } @@ -237,7 +243,7 @@ const uint8_t* top, int size) { int j; if (top) { - for (j = 0; j < size; ++j) memcpy(dst + j * BPS, top, size); + for (j = 0; j < size; ++j) SbMemoryCopy(dst + j * BPS, top, size); } else { Fill(dst, 127, size); } @@ -248,7 +254,7 @@ if (left) { int j; for (j = 0; j < size; ++j) { - memset(dst + j * BPS, left[j], size); + SbMemorySet(dst + j * BPS, left[j], size); } } else { Fill(dst, 129, size); @@ -354,7 +360,7 @@ }; int i; for (i = 0; i < 4; ++i) { - memcpy(dst + i * BPS, vals, 4); + SbMemoryCopy(dst + i * BPS, vals, 4); } } @@ -658,7 +664,7 @@ static WEBP_INLINE void Copy(const uint8_t* src, uint8_t* dst, int size) { int y; for (y = 0; y < size; ++y) { - memcpy(dst, src, size); + SbMemoryCopy(dst, src, size); src += BPS; dst += BPS; }
diff --git a/src/third_party/libwebp/dsp/lossless.c b/src/third_party/libwebp/dsp/lossless.c index e445924..97f6a26 100644 --- a/src/third_party/libwebp/dsp/lossless.c +++ b/src/third_party/libwebp/dsp/lossless.c
@@ -26,8 +26,14 @@ #include <emmintrin.h> #endif -#include <math.h> +#if defined(STARBOARD) +#include "starboard/client_porting/poem/stdlib_poem.h" +#include "starboard/memory.h" +#include "starboard/log.h" +#else #include <stdlib.h> +#endif +#include <math.h> #include "./lossless.h" #include "../dec/vp8li.h" #include "./yuv.h" @@ -236,7 +242,7 @@ }; float VP8LFastSLog2Slow(int v) { - assert(v >= LOG_LOOKUP_IDX_MAX); + SB_DCHECK(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_MAX) { int log_cnt = 0; const float v_f = (float)v; @@ -251,7 +257,7 @@ } float VP8LFastLog2Slow(int v) { - assert(v >= LOG_LOOKUP_IDX_MAX); + SB_DCHECK(v >= LOG_LOOKUP_IDX_MAX); if (v < APPROX_LOG_MAX) { int log_cnt = 0; while (v >= LOG_LOOKUP_IDX_MAX) { @@ -540,7 +546,7 @@ const PredictorFunc pred_func = kPredictors[mode]; float cur_diff; int y; - memset(&histo[0][0], 0, sizeof(histo)); + SbMemorySet(&histo[0][0], 0, sizeof(histo)); for (y = 0; y < ymax; ++y) { int x; const int row = row_start + y; @@ -620,17 +626,17 @@ uint32_t* const current_tile_rows = argb_scratch + width; int tile_y; int histo[4][256]; - memset(histo, 0, sizeof(histo)); + SbMemorySet(histo, 0, sizeof(histo)); for (tile_y = 0; tile_y < tiles_per_col; ++tile_y) { const int tile_y_offset = tile_y * max_tile_size; const int this_tile_height = (tile_y < tiles_per_col - 1) ? max_tile_size : height - tile_y_offset; int tile_x; if (tile_y > 0) { - memcpy(upper_row, current_tile_rows + (max_tile_size - 1) * width, + SbMemoryCopy(upper_row, current_tile_rows + (max_tile_size - 1) * width, width * sizeof(*upper_row)); } - memcpy(current_tile_rows, &argb[tile_y_offset * width], + SbMemoryCopy(current_tile_rows, &argb[tile_y_offset * width], this_tile_height * width * sizeof(*current_tile_rows)); for (tile_x = 0; tile_x < tiles_per_row; ++tile_x) { int pred; @@ -1156,8 +1162,8 @@ void VP8LInverseTransform(const VP8LTransform* const transform, int row_start, int row_end, const uint32_t* const in, uint32_t* const out) { - assert(row_start < row_end); - assert(row_end <= transform->ysize_); + SB_DCHECK(row_start < row_end); + SB_DCHECK(row_end <= transform->ysize_); switch (transform->type_) { case SUBTRACT_GREEN: AddGreenToBlueAndRed(transform, row_start, row_end, out); @@ -1168,7 +1174,7 @@ // The last predicted row in this iteration will be the top-pred row // for the first row in next iteration. const int width = transform->xsize_; - memcpy(out - width, out + (row_end - row_start - 1) * width, + SbMemoryCopy(out - width, out + (row_end - row_start - 1) * width, width * sizeof(*out)); } break; @@ -1186,7 +1192,7 @@ const int in_stride = (row_end - row_start) * VP8LSubSampleSize(transform->xsize_, transform->bits_); uint32_t* const src = out + out_stride - in_stride; - memmove(src, out, in_stride * sizeof(*src)); + SbMemoryMove(src, out, in_stride * sizeof(*src)); ColorIndexInverseTransform(transform, row_start, row_end, src, out); } else { ColorIndexInverseTransform(transform, row_start, row_end, in, out); @@ -1310,7 +1316,7 @@ dst += sizeof(argb); } } else { - memcpy(dst, src, num_pixels * sizeof(*src)); + SbMemoryCopy(dst, src, num_pixels * sizeof(*src)); } } @@ -1355,7 +1361,7 @@ ConvertBGRAToRGB565(in_data, num_pixels, rgba); break; default: - assert(0); // Code flow should not reach here. + SB_DCHECK(0); // Code flow should not reach here. } }
diff --git a/src/third_party/libwebp/dsp/upsampling_neon.c b/src/third_party/libwebp/dsp/upsampling_neon.c index d118895..2e6a8e5 100644 --- a/src/third_party/libwebp/dsp/upsampling_neon.c +++ b/src/third_party/libwebp/dsp/upsampling_neon.c
@@ -20,9 +20,14 @@ #if defined(WEBP_USE_NEON) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> -#include <arm_neon.h> #include <string.h> +#endif +#include <arm_neon.h> #include "./yuv.h" #ifdef FANCY_UPSAMPLING @@ -77,11 +82,11 @@ #define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) { \ uint8_t r1[9], r2[9]; \ - memcpy(r1, (tb), (num_pixels)); \ - memcpy(r2, (bb), (num_pixels)); \ + SbMemoryCopy(r1, (tb), (num_pixels)); \ + SbMemoryCopy(r2, (bb), (num_pixels)); \ /* replicate last byte */ \ - memset(r1 + (num_pixels), r1[(num_pixels) - 1], 9 - (num_pixels)); \ - memset(r2 + (num_pixels), r2[(num_pixels) - 1], 9 - (num_pixels)); \ + SbMemorySet(r1 + (num_pixels), r1[(num_pixels) - 1], 9 - (num_pixels)); \ + SbMemorySet(r2 + (num_pixels), r2[(num_pixels) - 1], 9 - (num_pixels)); \ Upsample16Pixels(r1, r2, out); \ }
diff --git a/src/third_party/libwebp/dsp/upsampling_sse2.c b/src/third_party/libwebp/dsp/upsampling_sse2.c index f31d048..491160c 100644 --- a/src/third_party/libwebp/dsp/upsampling_sse2.c +++ b/src/third_party/libwebp/dsp/upsampling_sse2.c
@@ -19,9 +19,14 @@ #if defined(WEBP_USE_SSE2) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> -#include <emmintrin.h> #include <string.h> +#endif +#include <emmintrin.h> #include "./yuv.h" #ifdef FANCY_UPSAMPLING @@ -99,11 +104,11 @@ #define UPSAMPLE_LAST_BLOCK(tb, bb, num_pixels, out) { \ uint8_t r1[17], r2[17]; \ - memcpy(r1, (tb), (num_pixels)); \ - memcpy(r2, (bb), (num_pixels)); \ + SbMemoryCopy(r1, (tb), (num_pixels)); \ + SbMemoryCopy(r2, (bb), (num_pixels)); \ /* replicate last byte */ \ - memset(r1 + (num_pixels), r1[(num_pixels) - 1], 17 - (num_pixels)); \ - memset(r2 + (num_pixels), r2[(num_pixels) - 1], 17 - (num_pixels)); \ + SbMemorySet(r1 + (num_pixels), r1[(num_pixels) - 1], 17 - (num_pixels)); \ + SbMemorySet(r2 + (num_pixels), r2[(num_pixels) - 1], 17 - (num_pixels)); \ /* using the shared function instead of the macro saves ~3k code size */ \ Upsample32Pixels(r1, r2, out); \ } @@ -143,7 +148,7 @@ const int u_diag = ((top_u[0] + cur_u[0]) >> 1) + 1; \ const int v_diag = ((top_v[0] + cur_v[0]) >> 1) + 1; \ \ - assert(len > 0); \ + SB_DCHECK(len > 0); \ /* Treat the first pixel in regular way */ \ if (top_y) { \ const int u0 = (top_u[0] + u_diag) >> 1; \
diff --git a/src/third_party/libwebp/enc/alpha.c b/src/third_party/libwebp/enc/alpha.c index 131e2fc..9b6c7e8 100644 --- a/src/third_party/libwebp/enc/alpha.c +++ b/src/third_party/libwebp/enc/alpha.c
@@ -12,7 +12,8 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -42,7 +43,7 @@ // // 'output' corresponds to the buffer containing compressed alpha data. // This buffer is allocated by this method and caller should call -// free(*output) when done. +// SbMemoryDeallocate(*output) when done. // 'output_size' corresponds to size of this compressed alpha buffer. // // Returns 1 on successfully encoding the alpha and @@ -87,7 +88,7 @@ config.method = effort_level; // impact is very small // Set a moderate default quality setting for alpha. config.quality = 10.f * effort_level; - assert(config.quality >= 0 && config.quality <= 100.f); + SB_DCHECK(config.quality >= 0 && config.quality <= 100.f); ok = VP8LBitWriterInit(&tmp_bw, (width * height) >> 3); ok = ok && (VP8LEncodeStream(&config, &picture, &tmp_bw) == VP8_ENC_OK); @@ -116,11 +117,11 @@ size_t expected_size; const size_t data_size = width * height; - assert((uint64_t)data_size == (uint64_t)width * height); // as per spec - assert(filter >= 0 && filter < WEBP_FILTER_LAST); - assert(method >= ALPHA_NO_COMPRESSION); - assert(method <= ALPHA_LOSSLESS_COMPRESSION); - assert(sizeof(header) == ALPHA_HEADER_LEN); + SB_DCHECK((uint64_t)data_size == (uint64_t)width * height); // as per spec + SB_DCHECK(filter >= 0 && filter < WEBP_FILTER_LAST); + SB_DCHECK(method >= ALPHA_NO_COMPRESSION); + SB_DCHECK(method <= ALPHA_LOSSLESS_COMPRESSION); + SB_DCHECK(sizeof(header) == ALPHA_HEADER_LEN); // TODO(skal): have a common function and #define's to validate alpha params. expected_size = @@ -156,7 +157,7 @@ static void CopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height) { while (height-- > 0) { - memcpy(dst, src, width); + SbMemoryCopy(dst, src, width); src += src_stride; dst += dst_stride; } @@ -196,12 +197,12 @@ const int reduce_levels = (quality < 100); // quick sanity checks - assert((uint64_t)data_size == (uint64_t)width * height); // as per spec - assert(enc != NULL && pic != NULL && pic->a != NULL); - assert(output != NULL && output_size != NULL); - assert(width > 0 && height > 0); - assert(pic->a_stride >= width); - assert(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST); + SB_DCHECK((uint64_t)data_size == (uint64_t)width * height); // as per spec + SB_DCHECK(enc != NULL && pic != NULL && pic->a != NULL); + SB_DCHECK(output != NULL && output_size != NULL); + SB_DCHECK(width > 0 && height > 0); + SB_DCHECK(pic->a_stride >= width); + SB_DCHECK(filter >= WEBP_FILTER_NONE && filter <= WEBP_FILTER_FAST); if (quality < 0 || quality > 100) { return 0; @@ -211,7 +212,7 @@ return 0; } - quant_alpha = (uint8_t*)malloc(data_size); + quant_alpha = (uint8_t*)SbMemoryAllocate(data_size); if (quant_alpha == NULL) { return 0; } @@ -264,7 +265,7 @@ goto Ok; } - filtered_alpha = (uint8_t*)malloc(data_size); + filtered_alpha = (uint8_t*)SbMemoryAllocate(data_size); ok = (filtered_alpha != NULL); if (!ok) { goto End; @@ -277,7 +278,7 @@ VP8BitWriterSize(&bw) : (size_t)~0U; int wipe_tmp_bw = try_filter_none; - memset(&best_stats, 0, sizeof(best_stats)); // prevent spurious warning + SbMemorySet(&best_stats, 0, sizeof(best_stats)); // prevent spurious warning if (pic->stats != NULL) best_stats = *pic->stats; for (test_filter = try_filter_none ? WEBP_FILTER_HORIZONTAL : WEBP_FILTER_NONE; @@ -320,10 +321,10 @@ enc->sse_[3] = sse; } } - free(filtered_alpha); + SbMemoryDeallocate(filtered_alpha); } End: - free(quant_alpha); + SbMemoryDeallocate(quant_alpha); return ok; } @@ -345,7 +346,7 @@ return 0; } if (alpha_size != (uint32_t)alpha_size) { // Sanity check. - free(alpha_data); + SbMemoryDeallocate(alpha_data); return 0; } enc->alpha_data_size_ = (uint32_t)alpha_size; @@ -400,7 +401,7 @@ ok = WebPWorkerSync(worker); // finish anything left in flight WebPWorkerEnd(worker); // still need to end the worker, even if !ok } - free(enc->alpha_data_); + SbMemoryDeallocate(enc->alpha_data_); enc->alpha_data_ = NULL; enc->alpha_data_size_ = 0; enc->has_alpha_ = 0;
diff --git a/src/third_party/libwebp/enc/analysis.c b/src/third_party/libwebp/enc/analysis.c index 4ff3edd..f435807 100644 --- a/src/third_party/libwebp/enc/analysis.c +++ b/src/third_party/libwebp/enc/analysis.c
@@ -11,9 +11,14 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> #include <string.h> #include <assert.h> +#endif #include "./vp8enci.h" #include "./cost.h" @@ -35,7 +40,7 @@ const int h = enc->mb_h_; const int majority_cnt_3_x_3_grid = 5; uint8_t* const tmp = (uint8_t*)WebPSafeMalloc((uint64_t)w * h, sizeof(*tmp)); - assert((uint64_t)(w * h) == (uint64_t)w * h); // no overflow, as per spec + SB_DCHECK((uint64_t)(w * h) == (uint64_t)w * h); // no overflow, as per spec if (tmp == NULL) return; for (y = 1; y < h - 1; ++y) { @@ -66,7 +71,7 @@ mb->segment_ = tmp[x + y * w]; } } - free(tmp); + SbMemoryDeallocate(tmp); } //------------------------------------------------------------------------------ @@ -90,7 +95,7 @@ } } if (max == min) max = min + 1; - assert(mid <= max && mid >= min); + SB_DCHECK(mid <= max && mid >= min); for (n = 0; n < nb; ++n) { const int alpha = 255 * (centers[n] - mid) / (max - min); const int beta = 255 * (centers[n] - min) / (max - min); @@ -280,7 +285,7 @@ for (mode = 0; mode < max_mode; ++mode) { int alpha; - memset(&histos[cur_histo], 0, sizeof(histos[cur_histo])); + SbMemorySet(&histos[cur_histo], 0, sizeof(histos[cur_histo])); VP8CollectHistogram(src, it->yuv_p_ + VP8I4ModeOffsets[mode], 0, 1, &histos[cur_histo]); alpha = GetAlpha(&histos[cur_histo]);
diff --git a/src/third_party/libwebp/enc/backward_references.c b/src/third_party/libwebp/enc/backward_references.c index db4f430..3004f9d 100644 --- a/src/third_party/libwebp/enc/backward_references.c +++ b/src/third_party/libwebp/enc/backward_references.c
@@ -10,9 +10,14 @@ // Author: Jyrki Alakuijala (jyrki@google.com) // +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <math.h> #include <stdio.h> +#endif #include "./backward_references.h" #include "./histogram.h" @@ -88,13 +93,13 @@ void VP8LClearBackwardRefs(VP8LBackwardRefs* const refs) { if (refs != NULL) { - free(refs->refs); + SbMemoryDeallocate(refs->refs); VP8LInitBackwardRefs(refs); } } int VP8LBackwardRefsAlloc(VP8LBackwardRefs* const refs, int max_size) { - assert(refs != NULL); + SB_DCHECK(refs != NULL); refs->size = 0; refs->max_size = 0; refs->refs = (PixOrCopy*)WebPSafeMalloc((uint64_t)max_size, @@ -130,8 +135,8 @@ static void HashChainDelete(HashChain* const p) { if (p != NULL) { - free(p->chain_); - free(p); + SbMemoryDeallocate(p->chain_); + SbMemoryDeallocate(p); } } @@ -152,7 +157,7 @@ const int max_window_size = (quality > 50) ? WINDOW_SIZE : (quality > 25) ? (xsize << 8) : (xsize << 4); - assert(xsize > 0); + SB_DCHECK(xsize > 0); *window_size = (max_window_size > WINDOW_SIZE) ? WINDOW_SIZE : max_window_size; *iter_pos = 8 + (quality >> 3); @@ -175,7 +180,7 @@ const int min_pos = (base_position > window_size) ? base_position - window_size : 0; int pos; - assert(xsize > 0); + SB_DCHECK(xsize > 0); for (pos = p->hash_to_first_index_[GetPixPairHash64(argb_start)]; pos >= min_pos; pos = p->chain_[pos]) { @@ -269,7 +274,7 @@ int cc_init = 0; const int use_color_cache = (cache_bits > 0); const int pix_count = xsize * ysize; - HashChain* const hash_chain = (HashChain*)malloc(sizeof(*hash_chain)); + HashChain* const hash_chain = (HashChain*)SbMemoryAllocate(sizeof(*hash_chain)); VP8LColorCache hashers; int window_size = WINDOW_SIZE; int iter_pos = 1; @@ -398,7 +403,7 @@ } } if (nonzeros <= 1) { - memset(output, 0, num_symbols * sizeof(*output)); + SbMemorySet(output, 0, num_symbols * sizeof(*output)); } else { const double logsum = VP8LFastLog2(sum); for (i = 0; i < num_symbols; ++i) { @@ -481,8 +486,8 @@ const int use_color_cache = (cache_bits > 0); float* const cost = (float*)WebPSafeMalloc((uint64_t)pix_count, sizeof(*cost)); - CostModel* cost_model = (CostModel*)malloc(sizeof(*cost_model)); - HashChain* hash_chain = (HashChain*)malloc(sizeof(*hash_chain)); + CostModel* cost_model = (CostModel*)SbMemoryAllocate(sizeof(*cost_model)); + HashChain* hash_chain = (HashChain*)SbMemoryAllocate(sizeof(*hash_chain)); VP8LColorCache hashers; const double mul0 = (recursive_cost_model != 0) ? 1.0 : 0.68; const double mul1 = (recursive_cost_model != 0) ? 1.0 : 0.82; @@ -593,8 +598,8 @@ Error: if (cc_init) VP8LColorCacheClear(&hashers); HashChainDelete(hash_chain); - free(cost_model); - free(cost); + SbMemoryDeallocate(cost_model); + SbMemoryDeallocate(cost); return ok; } @@ -633,7 +638,7 @@ int window_size = WINDOW_SIZE; int iter_pos = 1; int iter_limit = -1; - HashChain* hash_chain = (HashChain*)malloc(sizeof(*hash_chain)); + HashChain* hash_chain = (HashChain*)SbMemoryAllocate(sizeof(*hash_chain)); VP8LColorCache hashers; if (hash_chain == NULL || !HashChainInit(hash_chain, pix_count)) { @@ -655,7 +660,7 @@ HashChainFindCopy(hash_chain, i, xsize, argb, maxlen, window_size, iter_pos, iter_limit, &offset, &len); - assert(len == maxlen); + SB_DCHECK(len == maxlen); refs->refs[size] = PixOrCopyCreateCopy(offset, len); if (use_color_cache) { for (k = 0; k < len; ++k) { @@ -684,7 +689,7 @@ ++i; } } - assert(size <= refs->max_size); + SB_DCHECK(size <= refs->max_size); refs->size = size; ok = 1; Error: @@ -721,7 +726,7 @@ } ok = 1; Error: - free(dist_array); + SbMemoryDeallocate(dist_array); return ok; } @@ -765,7 +770,7 @@ { double bit_cost_lz77, bit_cost_rle; - VP8LHistogram* const histo = (VP8LHistogram*)malloc(sizeof(*histo)); + VP8LHistogram* const histo = (VP8LHistogram*)SbMemoryAllocate(sizeof(*histo)); if (histo == NULL) goto Error1; // Evaluate lz77 coding VP8LHistogramCreate(histo, &refs_lz77, cache_bits); @@ -775,7 +780,7 @@ bit_cost_rle = VP8LHistogramEstimateBits(histo); // Decide if LZ77 is useful. lz77_is_useful = (bit_cost_lz77 < bit_cost_rle); - free(histo); + SbMemoryDeallocate(histo); } // Choose appropriate backward reference. @@ -854,7 +859,7 @@ } pixel_index += PixOrCopyLength(v); } - assert(pixel_index == xsize * ysize); + SB_DCHECK(pixel_index == xsize * ysize); (void)xsize; // xsize is not used in non-debug compilations otherwise. (void)ysize; // ysize is not used in non-debug compilations otherwise. if (cc_init) VP8LColorCacheClear(&hashers);
diff --git a/src/third_party/libwebp/enc/backward_references.h b/src/third_party/libwebp/enc/backward_references.h index b0d1813..e13441c 100644 --- a/src/third_party/libwebp/enc/backward_references.h +++ b/src/third_party/libwebp/enc/backward_references.h
@@ -13,8 +13,12 @@ #ifndef WEBP_ENC_BACKWARD_REFERENCES_H_ #define WEBP_ENC_BACKWARD_REFERENCES_H_ +#if defined(STARBOARD) +#include "starboard/log.h" +#else #include <assert.h> #include <stdlib.h> +#endif #include "../webp/types.h" #include "../webp/format_constants.h" @@ -37,7 +41,7 @@ #if defined(__GNUC__) && \ ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4) static WEBP_INLINE int BitsLog2Floor(uint32_t n) { - assert(n != 0); + SB_DCHECK(n != 0); return 31 ^ __builtin_clz(n); } #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) @@ -46,7 +50,7 @@ static WEBP_INLINE int BitsLog2Floor(uint32_t n) { unsigned long first_set_bit; - assert(n != 0); + SB_DCHECK(n != 0); _BitScanReverse(&first_set_bit, n); return first_set_bit; } @@ -57,7 +61,7 @@ uint32_t value = n; int i; - assert(n != 0); + SB_DCHECK(n != 0); for (i = 4; i >= 0; --i) { const int shift = (1 << i); const uint32_t x = value >> shift; @@ -125,8 +129,8 @@ static WEBP_INLINE PixOrCopy PixOrCopyCreateCacheIdx(int idx) { PixOrCopy retval; - assert(idx >= 0); - assert(idx < (1 << MAX_COLOR_CACHE_BITS)); + SB_DCHECK(idx >= 0); + SB_DCHECK(idx < (1 << MAX_COLOR_CACHE_BITS)); retval.mode = kCacheIdx; retval.argb_or_distance = idx; retval.len = 1; @@ -155,7 +159,7 @@ static WEBP_INLINE uint32_t PixOrCopyLiteral(const PixOrCopy* const p, int component) { - assert(p->mode == kLiteral); + SB_DCHECK(p->mode == kLiteral); return (p->argb_or_distance >> (component * 8)) & 0xff; } @@ -164,18 +168,18 @@ } static WEBP_INLINE uint32_t PixOrCopyArgb(const PixOrCopy* const p) { - assert(p->mode == kLiteral); + SB_DCHECK(p->mode == kLiteral); return p->argb_or_distance; } static WEBP_INLINE uint32_t PixOrCopyCacheIdx(const PixOrCopy* const p) { - assert(p->mode == kCacheIdx); - assert(p->argb_or_distance < (1U << MAX_COLOR_CACHE_BITS)); + SB_DCHECK(p->mode == kCacheIdx); + SB_DCHECK(p->argb_or_distance < (1U << MAX_COLOR_CACHE_BITS)); return p->argb_or_distance; } static WEBP_INLINE uint32_t PixOrCopyDistance(const PixOrCopy* const p) { - assert(p->mode == kCopy); + SB_DCHECK(p->mode == kCopy); return p->argb_or_distance; }
diff --git a/src/third_party/libwebp/enc/filter.c b/src/third_party/libwebp/enc/filter.c index aae2723..237727c 100644 --- a/src/third_party/libwebp/enc/filter.c +++ b/src/third_party/libwebp/enc/filter.c
@@ -13,6 +13,10 @@ #include "./vp8enci.h" +#if definend(STARBOARD) +#include "starboard/memory.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -218,7 +222,7 @@ uint8_t* const v_dst = it->yuv_out2_ + V_OFF; // copy current block to yuv_out2_ - memcpy(y_dst, it->yuv_out_, YUV_SIZE * sizeof(uint8_t)); + SbMemoryCopy(y_dst, it->yuv_out_, YUV_SIZE * sizeof(uint8_t)); if (enc->filter_hdr_.simple_ == 1) { // simple VP8EncSimpleHFilter16i(y_dst, BPS, limit);
diff --git a/src/third_party/libwebp/enc/frame.c b/src/third_party/libwebp/enc/frame.c index c56abed..3cbd14f 100644 --- a/src/third_party/libwebp/enc/frame.c +++ b/src/third_party/libwebp/enc/frame.c
@@ -11,10 +11,15 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h." +#include "starboard/memory.h" +#else #include <assert.h> #include <stdlib.h> #include <string.h> #include <math.h> +#endif #include "./vp8enci.h" #include "./cost.h" @@ -93,7 +98,7 @@ static void ResetTokenStats(VP8Encoder* const enc) { VP8Proba* const proba = &enc->proba_; - memset(proba->stats_, 0, sizeof(proba->stats_)); + SbMemorySet(proba->stats_, 0, sizeof(proba->stats_)); } // Record proba context used @@ -168,7 +173,7 @@ // Collect statistics and deduce probabilities for next coding pass. // Return the total bit-cost for coding the probability updates. static int CalcTokenProba(int nb, int total) { - assert(nb <= total); + SB_DCHECK(nb <= total); return nb ? (255 - nb * 255 / total) : 255; } @@ -315,7 +320,7 @@ // Last coefficient is always non-zero { const int v = abs(res->coeffs[n]); - assert(v != 0); + SB_DCHECK(v != 0); cost += VP8BitCost(1, p0); cost += VP8LevelCost(t, v); if (n < 15) { @@ -625,7 +630,7 @@ static void SetBlock(uint8_t* p, int value, int size) { int y; for (y = 0; y < size; ++y) { - memset(p, value, size); + SbMemorySet(p, value, size); p += BPS; } } @@ -918,11 +923,11 @@ if (max_count < MIN_COUNT) max_count = MIN_COUNT; cnt = max_count; - assert(enc->num_parts_ == 1); - assert(enc->use_tokens_); - assert(proba->use_skip_proba_ == 0); - assert(rd_opt >= RD_OPT_BASIC); // otherwise, token-buffer won't be useful - assert(!enc->do_search_); // TODO(skal): handle pass and dichotomy + SB_DCHECK(enc->num_parts_ == 1); + SB_DCHECK(enc->use_tokens_); + SB_DCHECK(proba->use_skip_proba_ == 0); + SB_DCHECK(rd_opt >= RD_OPT_BASIC); // otherwise, token-buffer won't be useful + SB_DCHECK(!enc->do_search_); // TODO(skal): handle pass and dichotomy SetLoopParams(enc, enc->config_->quality);
diff --git a/src/third_party/libwebp/enc/histogram.c b/src/third_party/libwebp/enc/histogram.c index 787ea5d..474c377 100644 --- a/src/third_party/libwebp/enc/histogram.c +++ b/src/third_party/libwebp/enc/histogram.c
@@ -13,8 +13,13 @@ #include "config.h" #endif +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <math.h> #include <stdio.h> +#endif #include "./backward_references.h" #include "./histogram.h" @@ -22,11 +27,11 @@ #include "../utils/utils.h" static void HistogramClear(VP8LHistogram* const p) { - memset(p->literal_, 0, sizeof(p->literal_)); - memset(p->red_, 0, sizeof(p->red_)); - memset(p->blue_, 0, sizeof(p->blue_)); - memset(p->alpha_, 0, sizeof(p->alpha_)); - memset(p->distance_, 0, sizeof(p->distance_)); + SbMemorySet(p->literal_, 0, sizeof(p->literal_)); + SbMemorySet(p->red_, 0, sizeof(p->red_)); + SbMemorySet(p->blue_, 0, sizeof(p->blue_)); + SbMemorySet(p->alpha_, 0, sizeof(p->alpha_)); + SbMemorySet(p->distance_, 0, sizeof(p->distance_)); p->bit_cost_ = 0; } @@ -339,7 +344,7 @@ int x = 0, y = 0; const int histo_xsize = VP8LSubSampleSize(xsize, histo_bits); VP8LHistogram** const histograms = image->histograms; - assert(histo_bits > 0); + SB_DCHECK(histo_bits > 0); for (i = 0; i < backward_refs->size; ++i) { const PixOrCopy* const v = &backward_refs->refs[i]; const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits); @@ -370,13 +375,13 @@ int out_size = in->size; const int outer_iters = in->size * iter_mult; const int min_cluster_size = 2; - VP8LHistogram* const histos = (VP8LHistogram*)malloc(2 * sizeof(*histos)); + VP8LHistogram* const histos = (VP8LHistogram*)SbMemoryAllocate(2 * sizeof(*histos)); VP8LHistogram* cur_combo = histos + 0; // trial merged histogram VP8LHistogram* best_combo = histos + 1; // best merged histogram so far if (histos == NULL) goto End; // Copy histograms from in[] to out[]. - assert(in->size <= out->size); + SB_DCHECK(in->size <= out->size); for (i = 0; i < in->size; ++i) { in->histograms[i]->bit_cost_ = VP8LHistogramEstimateBits(in->histograms[i]); *out->histograms[i] = *in->histograms[i]; @@ -433,7 +438,7 @@ ok = 1; End: - free(histos); + SbMemoryDeallocate(histos); return ok; } @@ -509,6 +514,6 @@ ok = 1; Error: - free(image_out); + SbMemoryDeallocate(image_out); return ok; }
diff --git a/src/third_party/libwebp/enc/histogram.h b/src/third_party/libwebp/enc/histogram.h index 583b5a4..70831a4 100644 --- a/src/third_party/libwebp/enc/histogram.h +++ b/src/third_party/libwebp/enc/histogram.h
@@ -14,11 +14,16 @@ #ifndef WEBP_ENC_HISTOGRAM_H_ #define WEBP_ENC_HISTOGRAM_H_ +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <stddef.h> #include <stdlib.h> #include <stdio.h> #include <string.h> +#endif #include "./backward_references.h" #include "../webp/format_constants.h" @@ -43,7 +48,7 @@ } VP8LHistogram; // Collection of histograms with fixed capacity, allocated as one -// big memory chunk. Can be destroyed by simply calling 'free()'. +// big memory chunk. Can be destroyed by simply calling 'SbMemoryDeallocate()'. typedef struct { int size; // number of slots currently in use int max_size; // maximum capacity
diff --git a/src/third_party/libwebp/enc/iterator.c b/src/third_party/libwebp/enc/iterator.c index 0746659..2cd1bc0 100644 --- a/src/third_party/libwebp/enc/iterator.c +++ b/src/third_party/libwebp/enc/iterator.c
@@ -15,6 +15,10 @@ #include "./vp8enci.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -27,17 +31,17 @@ const VP8Encoder* const enc = it->enc_; enc->y_left_[-1] = enc->u_left_[-1] = enc->v_left_[-1] = (it->y_ > 0) ? 129 : 127; - memset(enc->y_left_, 129, 16); - memset(enc->u_left_, 129, 8); - memset(enc->v_left_, 129, 8); + SbMemorySet(enc->y_left_, 129, 16); + SbMemorySet(enc->u_left_, 129, 8); + SbMemorySet(enc->v_left_, 129, 8); it->left_nz_[8] = 0; } static void InitTop(VP8EncIterator* const it) { const VP8Encoder* const enc = it->enc_; const size_t top_size = enc->mb_w_ * 16; - memset(enc->y_top_, 127, 2 * top_size); - memset(enc->nz_, 0, enc->mb_w_ * sizeof(*enc->nz_)); + SbMemorySet(enc->y_top_, 127, 2 * top_size); + SbMemorySet(enc->nz_, 0, enc->mb_w_ * sizeof(*enc->nz_)); } void VP8IteratorReset(VP8EncIterator* const it) { @@ -53,7 +57,7 @@ it->done_ = enc->mb_w_* enc->mb_h_; InitTop(it); InitLeft(it); - memset(it->bit_count_, 0, sizeof(it->bit_count_)); + SbMemorySet(it->bit_count_, 0, sizeof(it->bit_count_)); it->do_trellis_ = 0; } @@ -90,15 +94,15 @@ uint8_t* dst, int w, int h, int size) { int i; for (i = 0; i < h; ++i) { - memcpy(dst, src, w); + SbMemoryCopy(dst, src, w); if (w < size) { - memset(dst + w, dst[w - 1], size - w); + SbMemorySet(dst + w, dst[w - 1], size - w); } dst += BPS; src += src_stride; } for (i = h; i < size; ++i) { - memcpy(dst, dst - BPS, size); + SbMemoryCopy(dst, dst - BPS, size); dst += BPS; } } @@ -136,7 +140,7 @@ static void ExportBlock(const uint8_t* src, uint8_t* dst, int dst_stride, int w, int h) { while (h-- > 0) { - memcpy(dst, src, w); + SbMemoryCopy(dst, src, w); dst += dst_stride; src += BPS; } @@ -266,8 +270,8 @@ enc->v_left_[-1] = enc->uv_top_[x * 16 + 8 + 7]; } if (y < enc->mb_h_ - 1) { // top - memcpy(enc->y_top_ + x * 16, ysrc + 15 * BPS, 16); - memcpy(enc->uv_top_ + x * 16, usrc + 7 * BPS, 8 + 8); + SbMemoryCopy(enc->y_top_ + x * 16, ysrc + 15 * BPS, 16); + SbMemoryCopy(enc->uv_top_ + x * 16, usrc + 7 * BPS, 8 + 8); } } @@ -293,7 +297,7 @@ uint8_t* preds = it->preds_; int y; for (y = 0; y < 4; ++y) { - memset(preds, mode, 4); + SbMemorySet(preds, mode, 4); preds += it->enc_->preds_w_; } it->mb_->type_ = 1; @@ -303,7 +307,7 @@ uint8_t* preds = it->preds_; int y; for (y = 4; y > 0; --y) { - memcpy(preds, modes, 4 * sizeof(*modes)); + SbMemoryCopy(preds, modes, 4 * sizeof(*modes)); preds += it->enc_->preds_w_; modes += 4; }
diff --git a/src/third_party/libwebp/enc/layer.c b/src/third_party/libwebp/enc/layer.c index fa89660..c6194c8 100644 --- a/src/third_party/libwebp/enc/layer.c +++ b/src/third_party/libwebp/enc/layer.c
@@ -11,7 +11,11 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/memory.h" +#else #include <stdlib.h> +#endif #include "./vp8enci.h" @@ -43,7 +47,7 @@ } void VP8EncDeleteLayer(VP8Encoder* enc) { - free(enc->layer_data_); + SbMemoryDeallocate(enc->layer_data_); } #if defined(__cplusplus) || defined(c_plusplus)
diff --git a/src/third_party/libwebp/enc/picture.c b/src/third_party/libwebp/enc/picture.c index 5aaa385..f94bf7c 100644 --- a/src/third_party/libwebp/enc/picture.c +++ b/src/third_party/libwebp/enc/picture.c
@@ -11,9 +11,14 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <stdlib.h> #include <math.h> +#endif #include "./vp8enci.h" #include "../utils/rescaler.h" @@ -159,7 +164,7 @@ // into 'dst'. Mark 'dst' as not owning any memory. static void WebPPictureGrabSpecs(const WebPPicture* const src, WebPPicture* const dst) { - assert(src != NULL && dst != NULL); + SB_DCHECK(src != NULL && dst != NULL); *dst = *src; PictureResetYUVA(dst); PictureResetARGB(dst); @@ -169,7 +174,7 @@ // the other YUV(A) buffer. static int PictureAllocARGB(WebPPicture* const picture) { WebPPicture tmp; - free(picture->memory_argb_); + SbMemoryDeallocate(picture->memory_argb_); PictureResetARGB(picture); picture->use_argb = 1; WebPPictureGrabSpecs(picture, &tmp); @@ -185,8 +190,8 @@ // Release memory owned by 'picture' (both YUV and ARGB buffers). void WebPPictureFree(WebPPicture* picture) { if (picture != NULL) { - free(picture->memory_); - free(picture->memory_argb_); + SbMemoryDeallocate(picture->memory_); + SbMemoryDeallocate(picture->memory_argb_); PictureResetYUVA(picture); PictureResetARGB(picture); } @@ -199,7 +204,7 @@ static void CopyPlane(const uint8_t* src, int src_stride, uint8_t* dst, int dst_stride, int width, int height) { while (height-- > 0) { - memcpy(dst, src, width); + SbMemoryCopy(dst, src, width); src += src_stride; dst += dst_stride; } @@ -387,7 +392,7 @@ src_width, dst_width, src_height, dst_height, work); - memset(work, 0, 2 * dst_width * num_channels * sizeof(*work)); + SbMemorySet(work, 0, 2 * dst_width * num_channels * sizeof(*work)); while (y < src_height) { y += WebPRescalerImport(&rescaler, src_height - y, src + y * src_stride, src_stride); @@ -466,7 +471,7 @@ work, 4); } WebPPictureFree(pic); - free(work); + SbMemoryDeallocate(work); *pic = tmp; return 1; } @@ -498,15 +503,15 @@ return 0; } if (w->size > 0) { - memcpy(new_mem, w->mem, w->size); + SbMemoryCopy(new_mem, w->mem, w->size); } - free(w->mem); + SbMemoryDeallocate(w->mem); w->mem = new_mem; // down-cast is ok, thanks to WebPSafeMalloc w->max_size = (size_t)next_max_size; } if (data_size > 0) { - memcpy(w->mem + w->size, data, data_size); + SbMemoryCopy(w->mem + w->size, data, data_size); w->size += data_size; } return 1; @@ -583,8 +588,8 @@ const int uv_width = HALVE(picture->width); const int uv_height = HALVE(picture->height); for (y = 0; y < uv_height; ++y) { - memset(picture->u + y * picture->uv_stride, 128, uv_width); - memset(picture->v + y * picture->uv_stride, 128, uv_width); + SbMemorySet(picture->u + y * picture->uv_stride, 128, uv_width); + SbMemorySet(picture->v + y * picture->uv_stride, 128, uv_width); } } @@ -660,7 +665,7 @@ } if (has_alpha) { - assert(step >= 4); + SB_DCHECK(step >= 4); for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { picture->a[x + y * picture->a_stride] = @@ -707,7 +712,7 @@ } } else { int x, y; - assert(step >= 4); + SB_DCHECK(step >= 4); for (y = 0; y < height; ++y) { for (x = 0; x < width; ++x) { const int offset = step * x + y * rgb_stride; @@ -832,7 +837,7 @@ // We work on a tmp copy of 'picture', because ImportYUVAFromRGBA() // would be calling WebPPictureFree(picture) otherwise. WebPPicture tmp = *picture; - PictureResetARGB(&tmp); // reset ARGB buffer so that it's not free()'d. + PictureResetARGB(&tmp); // reset ARGB buffer so that it's not SbMemoryDeallocate()'d. tmp.use_argb = 0; tmp.colorspace = colorspace & WEBP_CSP_UV_MASK; if (!ImportYUVAFromRGBA(r, g, b, a, 4, 4 * picture->argb_stride, &tmp)) { @@ -868,7 +873,7 @@ static WEBP_INLINE void flatten(uint8_t* ptr, int v, int stride, int size) { int y; for (y = 0; y < size; ++y) { - memset(ptr, v, size); + SbMemorySet(ptr, v, size); ptr += stride; } } @@ -984,7 +989,7 @@ return 0; } - memset(stats, 0, sizeof(stats)); + SbMemorySet(stats, 0, sizeof(stats)); uv_w = HALVE(src->width); uv_h = HALVE(src->height); @@ -1074,7 +1079,7 @@ ok = import(&pic, rgba, stride) && WebPEncode(&config, &pic); WebPPictureFree(&pic); if (!ok) { - free(wrt.mem); + SbMemoryDeallocate(wrt.mem); *output = NULL; return 0; }
diff --git a/src/third_party/libwebp/enc/quant.c b/src/third_party/libwebp/enc/quant.c index 462d4e9..f6ab0b6 100644 --- a/src/third_party/libwebp/enc/quant.c +++ b/src/third_party/libwebp/enc/quant.c
@@ -11,8 +11,13 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <math.h> +#endif #include "./vp8enci.h" #include "./cost.h" @@ -314,7 +319,7 @@ const double expn = 1. - amp * enc->dqm_[i].alpha_; const double c = pow(c_base, expn); const int q = (int)(127. * (1. - c)); - assert(expn > 0.); + SB_DCHECK(expn > 0.); enc->dqm_[i].quant_ = clip(q, 0, 127); } @@ -612,8 +617,8 @@ } // Fresh start - memset(in + first, 0, (16 - first) * sizeof(*in)); - memset(out + first, 0, (16 - first) * sizeof(*out)); + SbMemorySet(in + first, 0, (16 - first) * sizeof(*in)); + SbMemorySet(out + first, 0, (16 - first) * sizeof(*out)); if (best_path[0] == -1) { return 0; // skip! } @@ -797,8 +802,8 @@ CopyScore(rd, &rd16); rd->mode_i16 = mode; rd->nz = nz; - memcpy(rd->y_ac_levels, rd16.y_ac_levels, sizeof(rd16.y_ac_levels)); - memcpy(rd->y_dc_levels, rd16.y_dc_levels, sizeof(rd16.y_dc_levels)); + SbMemoryCopy(rd->y_ac_levels, rd16.y_ac_levels, sizeof(rd16.y_ac_levels)); + SbMemoryCopy(rd->y_dc_levels, rd16.y_dc_levels, sizeof(rd16.y_dc_levels)); SwapOut(it); } } @@ -867,7 +872,7 @@ CopyScore(&rd_i4, &rd_tmp); best_mode = mode; SwapPtr(&tmp_dst, &best_block); - memcpy(rd_best.y_ac_levels[it->i4_], tmp_levels, sizeof(tmp_levels)); + SbMemoryCopy(rd_best.y_ac_levels[it->i4_], tmp_levels, sizeof(tmp_levels)); } } SetRDScore(dqm->lambda_mode_, &rd_i4); @@ -888,7 +893,7 @@ CopyScore(rd, &rd_best); VP8SetIntra4Mode(it, rd->modes_i4); SwapOut(it); - memcpy(rd->y_ac_levels, rd_best.y_ac_levels, sizeof(rd->y_ac_levels)); + SbMemoryCopy(rd->y_ac_levels, rd_best.y_ac_levels, sizeof(rd->y_ac_levels)); return 1; // select intra4x4 over intra16x16 } @@ -922,8 +927,8 @@ if (mode == 0 || rd_uv.score < rd_best.score) { CopyScore(&rd_best, &rd_uv); rd->mode_uv = mode; - memcpy(rd->uv_levels, rd_uv.uv_levels, sizeof(rd->uv_levels)); - memcpy(dst0, tmp_dst, UV_SIZE); // TODO: SwapUVOut() ? + SbMemoryCopy(rd->uv_levels, rd_uv.uv_levels, sizeof(rd->uv_levels)); + SbMemoryCopy(dst0, tmp_dst, UV_SIZE); // TODO: SwapUVOut() ? } } VP8SetIntraUVMode(it, rd->mode_uv);
diff --git a/src/third_party/libwebp/enc/syntax.c b/src/third_party/libwebp/enc/syntax.c index b0f7676..a4e94e5 100644 --- a/src/third_party/libwebp/enc/syntax.c +++ b/src/third_party/libwebp/enc/syntax.c
@@ -11,7 +11,11 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#else #include <assert.h> +#endif #include "../utils/utils.h" #include "../webp/format_constants.h" // RIFF constants @@ -44,7 +48,7 @@ uint8_t riff[RIFF_HEADER_SIZE] = { 'R', 'I', 'F', 'F', 0, 0, 0, 0, 'W', 'E', 'B', 'P' }; - assert(riff_size == (uint32_t)riff_size); + SB_DCHECK(riff_size == (uint32_t)riff_size); PutLE32(riff + TAG_SIZE, (uint32_t)riff_size); if (!pic->writer(riff, sizeof(riff), pic)) { return VP8_ENC_ERROR_BAD_WRITE; @@ -59,9 +63,9 @@ }; uint32_t flags = 0; - assert(IsVP8XNeeded(enc)); - assert(pic->width >= 1 && pic->height >= 1); - assert(pic->width <= MAX_CANVAS_SIZE && pic->height <= MAX_CANVAS_SIZE); + SB_DCHECK(IsVP8XNeeded(enc)); + SB_DCHECK(pic->width >= 1 && pic->height >= 1); + SB_DCHECK(pic->width <= MAX_CANVAS_SIZE && pic->height <= MAX_CANVAS_SIZE); if (enc->has_alpha_) { flags |= ALPHA_FLAG; @@ -83,7 +87,7 @@ 'A', 'L', 'P', 'H' }; - assert(enc->has_alpha_); + SB_DCHECK(enc->has_alpha_); // Alpha chunk header. PutLE32(alpha_chunk_hdr + TAG_SIZE, enc->alpha_data_size_); @@ -108,7 +112,7 @@ uint8_t vp8_chunk_hdr[CHUNK_HEADER_SIZE] = { 'V', 'P', '8', ' ' }; - assert(vp8_size == (uint32_t)vp8_size); + SB_DCHECK(vp8_size == (uint32_t)vp8_size); PutLE32(vp8_chunk_hdr + TAG_SIZE, (uint32_t)vp8_size); if (!pic->writer(vp8_chunk_hdr, sizeof(vp8_chunk_hdr), pic)) { return VP8_ENC_ERROR_BAD_WRITE; @@ -280,7 +284,7 @@ PutLE24(buffer + 0, enc->layer_data_size_); buffer[3] = enc->pic_->colorspace & WEBP_CSP_UV_MASK; if (enc->layer_data_size_ > 0) { - assert(enc->use_layer_); + SB_DCHECK(enc->use_layer_); // append layer data to last partition if (!VP8BitWriterAppend(&enc->parts_[enc->num_parts_ - 1], enc->layer_data_, enc->layer_data_size_)) {
diff --git a/src/third_party/libwebp/enc/token.c b/src/third_party/libwebp/enc/token.c index bbe2f58..1280eb5 100644 --- a/src/third_party/libwebp/enc/token.c +++ b/src/third_party/libwebp/enc/token.c
@@ -17,7 +17,8 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -32,7 +33,7 @@ #if !defined(DISABLE_TOKEN_BUFFER) -// we use pages to reduce the number of memcpy() +// we use pages to reduce the number of SbMemoryCopy() #define MAX_NUM_TOKEN 8192 // max number of token per page #define FIXED_PROBA_BIT (1u << 14) @@ -58,7 +59,7 @@ const VP8Tokens* p = b->pages_; while (p != NULL) { const VP8Tokens* const next = p->next_; - free((void*)p); + SbMemoryDeallocate((void*)p); p = next; } VP8TBufferInit(b); @@ -66,7 +67,7 @@ } static int TBufferNewPage(VP8TBuffer* const b) { - VP8Tokens* const page = b->error_ ? NULL : (VP8Tokens*)malloc(sizeof(*page)); + VP8Tokens* const page = b->error_ ? NULL : (VP8Tokens*)SbMemoryAllocate(sizeof(*page)); if (page == NULL) { b->error_ = 1; return 0; @@ -86,8 +87,8 @@ static WEBP_INLINE int AddToken(VP8TBuffer* const b, int bit, uint32_t proba_idx) { - assert(proba_idx < FIXED_PROBA_BIT); - assert(bit == 0 || bit == 1); + SB_DCHECK(proba_idx < FIXED_PROBA_BIT); + SB_DCHECK(bit == 0 || bit == 1); if (b->left_ > 0 || TBufferNewPage(b)) { const int slot = --b->left_; b->tokens_[slot] = (bit << 15) | proba_idx; @@ -97,8 +98,8 @@ static WEBP_INLINE void AddConstantToken(VP8TBuffer* const b, int bit, int proba) { - assert(proba < 256); - assert(bit == 0 || bit == 1); + SB_DCHECK(proba < 256); + SB_DCHECK(bit == 0 || bit == 1); if (b->left_ > 0 || TBufferNewPage(b)) { const int slot = --b->left_; b->tokens_[slot] = (bit << 15) | FIXED_PROBA_BIT | proba; @@ -235,7 +236,7 @@ VP8PutBit(bw, bit, probas[token & 0x3fffu]); } } - if (final_pass) free((void*)p); + if (final_pass) SbMemoryDeallocate((void*)p); p = next; } if (final_pass) b->pages_ = NULL;
diff --git a/src/third_party/libwebp/enc/tree.c b/src/third_party/libwebp/enc/tree.c index ecd8fb9..31df71f 100644 --- a/src/third_party/libwebp/enc/tree.c +++ b/src/third_party/libwebp/enc/tree.c
@@ -13,6 +13,11 @@ #include "./vp8enci.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -161,8 +166,8 @@ void VP8DefaultProbas(VP8Encoder* const enc) { VP8Proba* const probas = &enc->proba_; probas->use_skip_proba_ = 0; - memset(probas->segments_, 255u, sizeof(probas->segments_)); - memcpy(probas->coeffs_, VP8CoeffsProba0, sizeof(VP8CoeffsProba0)); + SbMemorySet(probas->segments_, 255u, sizeof(probas->segments_)); + SbMemoryCopy(probas->coeffs_, VP8CoeffsProba0, sizeof(VP8CoeffsProba0)); // Note: we could hard-code the level_costs_ corresponding to VP8CoeffsProba0, // but that's ~11k of static data. Better call VP8CalculateLevelCosts() later. probas->dirty_ = 1;
diff --git a/src/third_party/libwebp/enc/vp8enci.h b/src/third_party/libwebp/enc/vp8enci.h index 61d56be..fe37140 100644 --- a/src/third_party/libwebp/enc/vp8enci.h +++ b/src/third_party/libwebp/enc/vp8enci.h
@@ -14,7 +14,12 @@ #ifndef WEBP_ENC_VP8ENCI_H_ #define WEBP_ENC_VP8ENCI_H_ +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <string.h> // for memcpy() +#endif #include "../webp/encode.h" #include "../dsp/dsp.h" #include "../utils/bit_writer.h"
diff --git a/src/third_party/libwebp/enc/vp8l.c b/src/third_party/libwebp/enc/vp8l.c index 945870c..34070b3 100644 --- a/src/third_party/libwebp/enc/vp8l.c +++ b/src/third_party/libwebp/enc/vp8l.c
@@ -12,9 +12,14 @@ // Author: Vikas Arora (vikaas.arora@gmail.com) // +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <stdio.h> #include <stdlib.h> +#endif #include "./backward_references.h" #include "./vp8enci.h" @@ -39,7 +44,7 @@ static int CompareColors(const void* p1, const void* p2) { const uint32_t a = *(const uint32_t*)p1; const uint32_t b = *(const uint32_t*)p2; - assert(a != b); + SB_DCHECK(a != b); return (a < b) ? -1 : 1; } @@ -97,7 +102,7 @@ } } - qsort(palette, num_colors, sizeof(*palette), CompareColors); + SbSystemSort(palette, num_colors, sizeof(*palette), CompareColors); *palette_size = num_colors; return 1; } @@ -112,7 +117,7 @@ VP8LHistogram* nonpredicted = NULL; VP8LHistogram* predicted = - (VP8LHistogram*)malloc(2 * sizeof(*predicted)); + (VP8LHistogram*)SbMemoryAllocate(2 * sizeof(*predicted)); if (predicted == NULL) return 0; nonpredicted = predicted + 1; @@ -139,13 +144,13 @@ } *nonpredicted_bits = VP8LHistogramEstimateBitsBulk(nonpredicted); *predicted_bits = VP8LHistogramEstimateBitsBulk(predicted); - free(predicted); + SbMemoryDeallocate(predicted); return 1; } static int VP8LEncAnalyze(VP8LEncoder* const enc, WebPImageHint image_hint) { const WebPPicture* const pic = enc->pic_; - assert(pic != NULL && pic->argb != NULL); + SB_DCHECK(pic != NULL && pic->argb != NULL); enc->use_palette_ = AnalyzeAndCreatePalette(pic, enc->palette_, &enc->palette_size_); @@ -235,9 +240,9 @@ End: if (!ok) { - free(mem_buf); + SbMemoryDeallocate(mem_buf); // If one VP8LCreateHuffmanTree() above fails, we need to clean up behind. - memset(huffman_codes, 0, 5 * histogram_image_size * sizeof(*huffman_codes)); + SbMemorySet(huffman_codes, 0, 5 * histogram_image_size * sizeof(*huffman_codes)); } return ok; } @@ -362,14 +367,14 @@ const int nbits = VP8LBitsLog2Ceiling(trimmed_length - 1); const int nbitpairs = (nbits == 0) ? 1 : (nbits + 1) / 2; VP8LWriteBits(bw, 3, nbitpairs - 1); - assert(trimmed_length >= 2); + SB_DCHECK(trimmed_length >= 2); VP8LWriteBits(bw, nbitpairs * 2, trimmed_length - 2); } StoreHuffmanTreeToBitMask(bw, tokens, length, &huffman_code); } ok = 1; End: - free(tokens); + SbMemoryDeallocate(tokens); return ok; } @@ -488,7 +493,7 @@ VP8LHistogramStoreRefs(&refs, histogram_image->histograms[0]); // Create Huffman bit lengths and codes for each histogram image. - assert(histogram_image->size == 1); + SB_DCHECK(histogram_image->size == 1); if (!GetHuffBitLengthsAndCodes(histogram_image, huffman_codes)) { goto Error; } @@ -510,9 +515,9 @@ ok = 1; Error: - free(histogram_image); + SbMemoryDeallocate(histogram_image); VP8LClearBackwardRefs(&refs); - free(huffman_codes[0].codes); + SbMemoryDeallocate(huffman_codes[0].codes); return ok; } @@ -535,12 +540,12 @@ uint16_t* const histogram_symbols = (uint16_t*)WebPSafeMalloc((uint64_t)histogram_image_xysize, sizeof(*histogram_symbols)); - assert(histogram_bits >= MIN_HUFFMAN_BITS); - assert(histogram_bits <= MAX_HUFFMAN_BITS); + SB_DCHECK(histogram_bits >= MIN_HUFFMAN_BITS); + SB_DCHECK(histogram_bits <= MAX_HUFFMAN_BITS); if (histogram_image == NULL || histogram_symbols == NULL) { - free(histogram_image); - free(histogram_symbols); + SbMemoryDeallocate(histogram_image); + SbMemoryDeallocate(histogram_symbols); return 0; } @@ -566,7 +571,7 @@ goto Error; } // Free combined histograms. - free(histogram_image); + SbMemoryDeallocate(histogram_image); histogram_image = NULL; // Color Cache parameters. @@ -600,7 +605,7 @@ VP8LSubSampleSize(width, histogram_bits), VP8LSubSampleSize(height, histogram_bits), quality); - free(histogram_argb); + SbMemoryDeallocate(histogram_argb); if (!ok) goto Error; } } @@ -621,14 +626,14 @@ ok = 1; Error: - free(histogram_image); + SbMemoryDeallocate(histogram_image); VP8LClearBackwardRefs(&refs); if (huffman_codes != NULL) { - free(huffman_codes->codes); - free(huffman_codes); + SbMemoryDeallocate(huffman_codes->codes); + SbMemoryDeallocate(huffman_codes); } - free(histogram_symbols); + SbMemoryDeallocate(histogram_symbols); return ok; } @@ -644,7 +649,7 @@ int i; const uint32_t* const argb = enc->argb_; double bit_cost_before, bit_cost_after; - VP8LHistogram* const histo = (VP8LHistogram*)malloc(sizeof(*histo)); + VP8LHistogram* const histo = (VP8LHistogram*)SbMemoryAllocate(sizeof(*histo)); if (histo == NULL) return 0; VP8LHistogramInit(histo, 1); @@ -663,7 +668,7 @@ ++histo->blue_[((c >> 0) - green) & 0xff]; } bit_cost_after = VP8LHistogramEstimateBits(histo); - free(histo); + SbMemoryDeallocate(histo); // Check if subtracting green yields low entropy. enc->use_subtract_green_ = (bit_cost_after < bit_cost_before); @@ -687,7 +692,7 @@ enc->transform_data_); VP8LWriteBits(bw, 1, TRANSFORM_PRESENT); VP8LWriteBits(bw, 2, PREDICTOR_TRANSFORM); - assert(pred_bits >= 2); + SB_DCHECK(pred_bits >= 2); VP8LWriteBits(bw, 3, pred_bits - 2); if (!EncodeImageNoHuffman(bw, enc->transform_data_, transform_width, transform_height, quality)) { @@ -708,7 +713,7 @@ enc->argb_, enc->transform_data_); VP8LWriteBits(bw, 1, TRANSFORM_PRESENT); VP8LWriteBits(bw, 2, CROSS_COLOR_TRANSFORM); - assert(ccolor_transform_bits >= 2); + SB_DCHECK(ccolor_transform_bits >= 2); VP8LWriteBits(bw, 3, ccolor_transform_bits - 2); if (!EncodeImageNoHuffman(bw, enc->transform_data_, transform_width, transform_height, quality)) { @@ -737,7 +742,7 @@ VP8LBitWriter* const bw) { const int width = pic->width - 1; const int height = pic->height - 1; - assert(width < WEBP_MAX_DIMENSION && height < WEBP_MAX_DIMENSION); + SB_DCHECK(width < WEBP_MAX_DIMENSION && height < WEBP_MAX_DIMENSION); VP8LWriteBits(bw, VP8L_IMAGE_SIZE_BITS, width); VP8LWriteBits(bw, VP8L_IMAGE_SIZE_BITS, height); @@ -904,7 +909,7 @@ // Save palette to bitstream. VP8LWriteBits(bw, 1, TRANSFORM_PRESENT); VP8LWriteBits(bw, 2, COLOR_INDEXING_TRANSFORM); - assert(palette_size >= 1); + SB_DCHECK(palette_size >= 1); VP8LWriteBits(bw, 8, palette_size - 1); for (i = palette_size - 1; i >= 1; --i) { palette[i] = VP8LSubPixels(palette[i], palette[i - 1]); @@ -915,7 +920,7 @@ } Error: - free(row); + SbMemoryDeallocate(row); return err; } @@ -952,7 +957,7 @@ static VP8LEncoder* VP8LEncoderNew(const WebPConfig* const config, const WebPPicture* const picture) { - VP8LEncoder* const enc = (VP8LEncoder*)calloc(1, sizeof(*enc)); + VP8LEncoder* const enc = (VP8LEncoder*)SbMemoryCalloc(1, sizeof(*enc)); if (enc == NULL) { WebPEncodingSetError(picture, VP8_ENC_ERROR_OUT_OF_MEMORY); return NULL; @@ -963,8 +968,8 @@ } static void VP8LEncoderDelete(VP8LEncoder* enc) { - free(enc->argb_); - free(enc); + SbMemoryDeallocate(enc->argb_); + SbMemoryDeallocate(enc); } // ----------------------------------------------------------------------------- @@ -1008,7 +1013,7 @@ err = AllocateTransformBuffer(enc, width, height); if (err != VP8_ENC_OK) goto Error; for (y = 0; y < height; ++y) { - memcpy(enc->argb_ + y * width, + SbMemoryCopy(enc->argb_ + y * width, picture->argb + y * picture->argb_stride, width * sizeof(*enc->argb_)); } @@ -1110,7 +1115,7 @@ // Reset stats (for pure lossless coding) if (picture->stats != NULL) { WebPAuxStats* const stats = picture->stats; - memset(stats, 0, sizeof(*stats)); + SbMemorySet(stats, 0, sizeof(*stats)); stats->PSNR[0] = 99.f; stats->PSNR[1] = 99.f; stats->PSNR[2] = 99.f; @@ -1155,7 +1160,7 @@ if (picture->extra_info != NULL) { const int mb_w = (width + 15) >> 4; const int mb_h = (height + 15) >> 4; - memset(picture->extra_info, 0, mb_w * mb_h * sizeof(*picture->extra_info)); + SbMemorySet(picture->extra_info, 0, mb_w * mb_h * sizeof(*picture->extra_info)); } Error:
diff --git a/src/third_party/libwebp/enc/webpenc.c b/src/third_party/libwebp/enc/webpenc.c index d420d06..ae4fb3b 100644 --- a/src/third_party/libwebp/enc/webpenc.c +++ b/src/third_party/libwebp/enc/webpenc.c
@@ -11,10 +11,15 @@ // // Author: Skal (pascal.massimino@gmail.com) +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <stdlib.h> #include <string.h> #include <math.h> +#endif #include "./vp8enci.h" #include "./vp8li.h" @@ -54,7 +59,7 @@ return 0; // caller/system version mismatch! } if (picture != NULL) { - memset(picture, 0, sizeof(*picture)); + SbMemorySet(picture, 0, sizeof(*picture)); picture->writer = DummyWriter; WebPEncodingSetError(picture, VP8_ENC_OK); } @@ -228,7 +233,7 @@ } enc = (VP8Encoder*)mem; mem = (uint8_t*)DO_ALIGN(mem + sizeof(*enc)); - memset(enc, 0, sizeof(*enc)); + SbMemorySet(enc, 0, sizeof(*enc)); enc->num_parts_ = 1 << config->partitions; enc->mb_w_ = mb_w; enc->mb_h_ = mb_h; @@ -292,7 +297,7 @@ VP8EncDeleteLayer(enc); #endif VP8TBufferClear(&enc->tokens_); - free(enc); + SbMemoryDeallocate(enc); } return ok; } @@ -336,8 +341,8 @@ int WebPEncodingSetError(const WebPPicture* const pic, WebPEncodingError error) { - assert((int)error < VP8_ENC_ERROR_LAST); - assert((int)error >= VP8_ENC_OK); + SB_DCHECK((int)error < VP8_ENC_ERROR_LAST); + SB_DCHECK((int)error >= VP8_ENC_OK); ((WebPPicture*)pic)->error_code = error; return 0; } @@ -371,7 +376,7 @@ if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION); - if (pic->stats != NULL) memset(pic->stats, 0, sizeof(*pic->stats)); + if (pic->stats != NULL) SbMemorySet(pic->stats, 0, sizeof(*pic->stats)); if (!config->lossless) { VP8Encoder* enc = NULL;
diff --git a/src/third_party/libwebp/starboard_private.h b/src/third_party/libwebp/starboard_private.h deleted file mode 100644 index 242ef00..0000000 --- a/src/third_party/libwebp/starboard_private.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2016 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef WEBP_STARBOARD_PRIVATE_H_ -#define WEBP_STARBOARD_PRIVATE_H_ - -#include "starboard/log.h" -#include "starboard/memory.h" -#include "starboard/system.h" - - -static SB_C_INLINE int webp_abs(int a) { - return (a < 0 ? -a : a); -} - -#undef assert -#define assert(x) SB_DCHECK(x) - -#define abs(x) webp_abs(x) -#define calloc SbMemoryCalloc -#define free SbMemoryDeallocate -#define malloc SbMemoryAllocate -#define memcpy SbMemoryCopy -#define memmove SbMemoryMove -#define memset SbMemorySet -#define qsort SbSystemSort - - -#endif /* WEBP_STARBOARD_PRIVATE_H_ */
diff --git a/src/third_party/libwebp/utils/bit_reader.c b/src/third_party/libwebp/utils/bit_reader.c index ab7a827..ad6dee0 100644 --- a/src/third_party/libwebp/utils/bit_reader.c +++ b/src/third_party/libwebp/utils/bit_reader.c
@@ -13,6 +13,10 @@ #include "./bit_reader.h" +#if defined(STARBOARD) +#include "starboard/log.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -28,9 +32,9 @@ void VP8InitBitReader(VP8BitReader* const br, const uint8_t* const start, const uint8_t* const end) { - assert(br != NULL); - assert(start != NULL); - assert(start <= end); + SB_DCHECK(br != NULL); + SB_DCHECK(start != NULL); + SB_DCHECK(start <= end); br->range_ = MK(255 - 1); br->buf_ = start; br->buf_end_ = end; @@ -74,7 +78,7 @@ #undef MK void VP8LoadFinalBytes(VP8BitReader* const br) { - assert(br != NULL && br->buf_ != NULL); + SB_DCHECK(br != NULL && br->buf_ != NULL); // Only read 8bits at a time if (br->buf_ < br->buf_end_) { #ifndef USE_RIGHT_JUSTIFY @@ -128,9 +132,9 @@ const uint8_t* const start, size_t length) { size_t i; - assert(br != NULL); - assert(start != NULL); - assert(length < 0xfffffff8u); // can't happen with a RIFF chunk. + SB_DCHECK(br != NULL); + SB_DCHECK(start != NULL); + SB_DCHECK(length < 0xfffffff8u); // can't happen with a RIFF chunk. br->buf_ = start; br->len_ = length; @@ -147,9 +151,9 @@ void VP8LBitReaderSetBuffer(VP8LBitReader* const br, const uint8_t* const buf, size_t len) { - assert(br != NULL); - assert(buf != NULL); - assert(len < 0xfffffff8u); // can't happen with a RIFF chunk. + SB_DCHECK(br != NULL); + SB_DCHECK(buf != NULL); + SB_DCHECK(len < 0xfffffff8u); // can't happen with a RIFF chunk. br->eos_ = (br->pos_ >= len); br->buf_ = buf; br->len_ = len; @@ -186,7 +190,7 @@ } uint32_t VP8LReadBits(VP8LBitReader* const br, int n_bits) { - assert(n_bits >= 0); + SB_DCHECK(n_bits >= 0); // Flag an error if end_of_stream or n_bits is more than allowed limit. if (!br->eos_ && n_bits < MAX_NUM_BIT_READ) { const uint32_t val =
diff --git a/src/third_party/libwebp/utils/bit_reader.h b/src/third_party/libwebp/utils/bit_reader.h index 1d022a5..e9e0ab8 100644 --- a/src/third_party/libwebp/utils/bit_reader.h +++ b/src/third_party/libwebp/utils/bit_reader.h
@@ -16,7 +16,8 @@ #define WEBP_UTILS_BIT_READER_H_ #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #ifdef _MSC_VER @@ -154,7 +155,7 @@ void VP8LoadFinalBytes(VP8BitReader* const br); // special case for the tail static WEBP_INLINE void VP8LoadNewBytes(VP8BitReader* const br) { - assert(br != NULL && br->buf_ != NULL); + SB_DCHECK(br != NULL && br->buf_ != NULL); // Read 'BITS' bits at a time if possible. if (br->buf_ + sizeof(lbit_t) <= br->buf_end_) { // convert memory type to register type (with some zero'ing!) @@ -253,7 +254,7 @@ br->bits_ -= shift; #else const int shift = kVP8Log2Range[br->range_]; - assert(br->range_ < (range_t)128); + SB_DCHECK(br->range_ < (range_t)128); br->range_ = kVP8NewRange[br->range_]; br->bits_ -= shift; #endif
diff --git a/src/third_party/libwebp/utils/bit_writer.c b/src/third_party/libwebp/utils/bit_writer.c index 4da869d..8ee1cd1 100644 --- a/src/third_party/libwebp/utils/bit_writer.c +++ b/src/third_party/libwebp/utils/bit_writer.c
@@ -13,7 +13,8 @@ // Vikas Arora (vikaas.arora@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <string.h> // for memcpy() @@ -43,13 +44,13 @@ new_size = 2 * bw->max_pos_; if (new_size < needed_size) new_size = needed_size; if (new_size < 1024) new_size = 1024; - new_buf = (uint8_t*)malloc(new_size); + new_buf = (uint8_t*)SbMemoryAllocate(new_size); if (new_buf == NULL) { bw->error_ = 1; return 0; } - memcpy(new_buf, bw->buf_, bw->pos_); - free(bw->buf_); + SbMemoryCopy(new_buf, bw->buf_, bw->pos_); + SbMemoryDeallocate(bw->buf_); bw->buf_ = new_buf; bw->max_pos_ = new_size; return 1; @@ -58,7 +59,7 @@ static void kFlush(VP8BitWriter* const bw) { const int s = 8 + bw->nb_bits_; const int32_t bits = bw->value_ >> s; - assert(bw->nb_bits_ >= 0); + SB_DCHECK(bw->nb_bits_ >= 0); bw->value_ -= bits << s; bw->nb_bits_ -= 8; if ((bits & 0xff) != 0xff) { @@ -182,18 +183,18 @@ int VP8BitWriterAppend(VP8BitWriter* const bw, const uint8_t* data, size_t size) { - assert(data); + SB_DCHECK(data); if (bw->nb_bits_ != -8) return 0; // kFlush() must have been called if (!BitWriterResize(bw, size)) return 0; - memcpy(bw->buf_ + bw->pos_, data, size); + SbMemoryCopy(bw->buf_ + bw->pos_, data, size); bw->pos_ += size; return 1; } void VP8BitWriterWipeOut(VP8BitWriter* const bw) { if (bw) { - free(bw->buf_); - memset(bw, 0, sizeof(*bw)); + SbMemoryDeallocate(bw->buf_); + SbMemorySet(bw, 0, sizeof(*bw)); } } @@ -216,28 +217,28 @@ if (allocated_size < size_required) allocated_size = size_required; // make allocated size multiple of 1k allocated_size = (((allocated_size >> 10) + 1) << 10); - allocated_buf = (uint8_t*)malloc(allocated_size); + allocated_buf = (uint8_t*)SbMemoryAllocate(allocated_size); if (allocated_buf == NULL) { bw->error_ = 1; return 0; } - memcpy(allocated_buf, bw->buf_, current_size); - free(bw->buf_); + SbMemoryCopy(allocated_buf, bw->buf_, current_size); + SbMemoryDeallocate(bw->buf_); bw->buf_ = allocated_buf; bw->max_bytes_ = allocated_size; - memset(allocated_buf + current_size, 0, allocated_size - current_size); + SbMemorySet(allocated_buf + current_size, 0, allocated_size - current_size); return 1; } int VP8LBitWriterInit(VP8LBitWriter* const bw, size_t expected_size) { - memset(bw, 0, sizeof(*bw)); + SbMemorySet(bw, 0, sizeof(*bw)); return VP8LBitWriterResize(bw, expected_size); } void VP8LBitWriterDestroy(VP8LBitWriter* const bw) { if (bw != NULL) { - free(bw->buf_); - memset(bw, 0, sizeof(*bw)); + SbMemoryDeallocate(bw->buf_); + SbMemorySet(bw, 0, sizeof(*bw)); } } @@ -269,7 +270,7 @@ bits >>= 8; } } - assert(n_bits <= 25); + SB_DCHECK(n_bits <= 25); *p = bits; bw->bit_pos_ += n_bits; }
diff --git a/src/third_party/libwebp/utils/color_cache.c b/src/third_party/libwebp/utils/color_cache.c index be6ed1f..a9a0d2a 100644 --- a/src/third_party/libwebp/utils/color_cache.c +++ b/src/third_party/libwebp/utils/color_cache.c
@@ -12,7 +12,8 @@ // Author: Jyrki Alakuijala (jyrki@google.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -30,8 +31,8 @@ int VP8LColorCacheInit(VP8LColorCache* const cc, int hash_bits) { const int hash_size = 1 << hash_bits; - assert(cc != NULL); - assert(hash_bits > 0); + SB_DCHECK(cc != NULL); + SB_DCHECK(hash_bits > 0); cc->colors_ = (uint32_t*)WebPSafeCalloc((uint64_t)hash_size, sizeof(*cc->colors_)); if (cc->colors_ == NULL) return 0; @@ -41,7 +42,7 @@ void VP8LColorCacheClear(VP8LColorCache* const cc) { if (cc != NULL) { - free(cc->colors_); + SbMemoryDeallocate(cc->colors_); cc->colors_ = NULL; } }
diff --git a/src/third_party/libwebp/utils/color_cache.h b/src/third_party/libwebp/utils/color_cache.h index e5a0bd6..4876bd4 100644 --- a/src/third_party/libwebp/utils/color_cache.h +++ b/src/third_party/libwebp/utils/color_cache.h
@@ -17,6 +17,10 @@ #include "../webp/types.h" +#if defined(STARBOARD) +#include "starboard/log.h" +#endif + #if defined(__cplusplus) || defined(c_plusplus) extern "C" { #endif @@ -31,7 +35,7 @@ static WEBP_INLINE uint32_t VP8LColorCacheLookup( const VP8LColorCache* const cc, uint32_t key) { - assert(key <= (~0U >> cc->hash_shift_)); + SB_DCHECK(key <= (~0U >> cc->hash_shift_)); return cc->colors_[key]; }
diff --git a/src/third_party/libwebp/utils/filters.c b/src/third_party/libwebp/utils/filters.c index eb5bb34..000c6cd 100644 --- a/src/third_party/libwebp/utils/filters.c +++ b/src/third_party/libwebp/utils/filters.c
@@ -12,9 +12,15 @@ // Author: Urvang (urvang@google.com) #include "./filters.h" +#if defined(STARBOARD) +#include "starboard/client_porting/poem/stdlib_poem.h" +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <assert.h> #include <stdlib.h> #include <string.h> +#endif #if defined(__cplusplus) || defined(c_plusplus) extern "C" { @@ -24,11 +30,11 @@ // Helpful macro. # define SANITY_CHECK(in, out) \ - assert(in != NULL); \ - assert(out != NULL); \ - assert(width > 0); \ - assert(height > 0); \ - assert(stride >= width); + SB_DCHECK(in != NULL); \ + SB_DCHECK(out != NULL); \ + SB_DCHECK(width > 0); \ + SB_DCHECK(height > 0); \ + SB_DCHECK(stride >= width); static WEBP_INLINE void PredictLine(const uint8_t* src, const uint8_t* pred, uint8_t* dst, int length, int inverse) { @@ -165,7 +171,7 @@ int width, int height, int stride) { int i, j; int bins[WEBP_FILTER_LAST][SMAX]; - memset(bins, 0, sizeof(bins)); + SbMemorySet(bins, 0, sizeof(bins)); // We only sample every other pixels. That's enough. for (j = 2; j < height - 1; j += 2) {
diff --git a/src/third_party/libwebp/utils/huffman.c b/src/third_party/libwebp/utils/huffman.c index 16a73f7..f6b883f 100644 --- a/src/third_party/libwebp/utils/huffman.c +++ b/src/third_party/libwebp/utils/huffman.c
@@ -12,7 +12,8 @@ // Author: Urvang Joshi (urvang@google.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -44,14 +45,14 @@ HuffmanTreeNode* const node) { HuffmanTreeNode* const children = tree->root_ + tree->num_nodes_; node->children_ = (int)(children - node); - assert(children - node == (int)(children - node)); + SB_DCHECK(children - node == (int)(children - node)); tree->num_nodes_ += 2; TreeNodeInit(children + 0); TreeNodeInit(children + 1); } static int TreeInit(HuffmanTree* const tree, int num_leaves) { - assert(tree != NULL); + SB_DCHECK(tree != NULL); if (num_leaves == 0) return 0; // We allocate maximum possible nodes in the tree at once. // Note that a Huffman tree is a full binary tree; and in a full binary tree @@ -67,7 +68,7 @@ void HuffmanTreeRelease(HuffmanTree* const tree) { if (tree != NULL) { - free(tree->root_); + SbMemoryDeallocate(tree->root_); tree->root_ = NULL; tree->max_nodes_ = 0; tree->num_nodes_ = 0; @@ -83,9 +84,9 @@ int next_codes[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 }; int max_code_length = 0; - assert(code_lengths != NULL); - assert(code_lengths_size > 0); - assert(huff_codes != NULL); + SB_DCHECK(code_lengths != NULL); + SB_DCHECK(code_lengths_size > 0); + SB_DCHECK(huff_codes != NULL); // Calculate max code length. for (symbol = 0; symbol < code_lengths_size; ++symbol) { @@ -154,8 +155,8 @@ int num_symbols = 0; int root_symbol = 0; - assert(tree != NULL); - assert(code_lengths != NULL); + SB_DCHECK(tree != NULL); + SB_DCHECK(code_lengths != NULL); // Find out number of symbols and the root symbol. for (symbol = 0; symbol < code_lengths_size; ++symbol) { @@ -199,7 +200,7 @@ } ok = 1; End: - free(codes); + SbMemoryDeallocate(codes); ok = ok && IsFull(tree); if (!ok) HuffmanTreeRelease(tree); return ok; @@ -214,10 +215,10 @@ int ok = 0; int i; - assert(tree != NULL); - assert(code_lengths != NULL); - assert(codes != NULL); - assert(symbols != NULL); + SB_DCHECK(tree != NULL); + SB_DCHECK(code_lengths != NULL); + SB_DCHECK(codes != NULL); + SB_DCHECK(symbols != NULL); // Initialize the tree. Will fail if num_symbols = 0. if (!TreeInit(tree, num_symbols)) return 0;
diff --git a/src/third_party/libwebp/utils/huffman.h b/src/third_party/libwebp/utils/huffman.h index 8629a27..5d59b7d 100644 --- a/src/third_party/libwebp/utils/huffman.h +++ b/src/third_party/libwebp/utils/huffman.h
@@ -15,7 +15,7 @@ #define WEBP_UTILS_HUFFMAN_H_ #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" #else #include <assert.h> #endif
diff --git a/src/third_party/libwebp/utils/huffman_encode.c b/src/third_party/libwebp/utils/huffman_encode.c index 0d0fe5f..b66dd41 100644 --- a/src/third_party/libwebp/utils/huffman_encode.c +++ b/src/third_party/libwebp/utils/huffman_encode.c
@@ -12,7 +12,8 @@ // Entropy encoding (Huffman) for webp lossless. #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <assert.h> #include <stdlib.h> @@ -48,7 +49,7 @@ } // 2) Let's mark all population counts that already can be encoded // with an rle code. - good_for_rle = (uint8_t*)calloc(length, 1); + good_for_rle = (uint8_t*)SbMemoryCalloc(length, 1); if (good_for_rle == NULL) { return 0; } @@ -124,7 +125,7 @@ } } } - free(good_for_rle); + SbMemoryDeallocate(good_for_rle); return 1; } @@ -145,7 +146,7 @@ } else if (t1->total_count_ < t2->total_count_) { return 1; } else { - assert(t1->value_ != t2->value_); + SB_DCHECK(t1->value_ != t2->value_); return (t1->value_ < t2->value_) ? -1 : 1; } } @@ -211,7 +212,7 @@ // second iteration of this loop. // If we actually start running inside this loop a lot, we would perhaps // be better off with the Katajainen algorithm. - assert(tree_size_orig <= (1 << (tree_depth_limit - 1))); + SB_DCHECK(tree_size_orig <= (1 << (tree_depth_limit - 1))); for (count_min = 1; ; count_min *= 2) { int tree_size = tree_size_orig; // We need to pack the Huffman tree in tree_depth_limit bits. @@ -231,7 +232,7 @@ } // Build the Huffman tree. - qsort(tree, tree_size, sizeof(*tree), CompareHuffmanTrees); + SbSystemSort(tree, tree_size, sizeof(*tree), CompareHuffmanTrees); if (tree_size > 1) { // Normal case. int tree_pool_size = 0; @@ -250,7 +251,7 @@ break; } } - memmove(tree + (k + 1), tree + k, (tree_size - k) * sizeof(*tree)); + SbMemoryMove(tree + (k + 1), tree + k, (tree_size - k) * sizeof(*tree)); tree[k].total_count_ = count; tree[k].value_ = -1; @@ -277,7 +278,7 @@ } } } - free(tree); + SbMemoryDeallocate(tree); return 1; } @@ -287,7 +288,7 @@ static HuffmanTreeToken* CodeRepeatedValues(int repetitions, HuffmanTreeToken* tokens, int value, int prev_value) { - assert(value <= MAX_ALLOWED_CODE_LENGTH); + SB_DCHECK(value <= MAX_ALLOWED_CODE_LENGTH); if (value != prev_value) { tokens->code = value; tokens->extra_bits = 0; @@ -356,7 +357,7 @@ const int depth_size = tree->num_symbols; int prev_value = 8; // 8 is the initial value for rle. int i = 0; - assert(tokens != NULL); + SB_DCHECK(tokens != NULL); while (i < depth_size) { const int value = tree->code_lengths[i]; int k = i + 1; @@ -370,7 +371,7 @@ prev_value = value; } i += runs; - assert(tokens <= ending_token); + SB_DCHECK(tokens <= ending_token); } (void)ending_token; // suppress 'unused variable' warning return (int)(tokens - starting_token); @@ -404,11 +405,11 @@ uint32_t next_code[MAX_ALLOWED_CODE_LENGTH + 1]; int depth_count[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 }; - assert(tree != NULL); + SB_DCHECK(tree != NULL); len = tree->num_symbols; for (i = 0; i < len; ++i) { const int code_length = tree->code_lengths[i]; - assert(code_length <= MAX_ALLOWED_CODE_LENGTH); + SB_DCHECK(code_length <= MAX_ALLOWED_CODE_LENGTH); ++depth_count[code_length]; } depth_count[0] = 0; // ignore unused symbol
diff --git a/src/third_party/libwebp/utils/quant_levels.c b/src/third_party/libwebp/utils/quant_levels.c index 9ac2ad9..2fb610b 100644 --- a/src/third_party/libwebp/utils/quant_levels.c +++ b/src/third_party/libwebp/utils/quant_levels.c
@@ -13,7 +13,7 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" #else #include <assert.h> #endif @@ -76,8 +76,8 @@ // Fixed values. Won't be changed. q_level[min_s] = 0; q_level[max_s] = num_levels - 1; - assert(inv_q_level[0] == min_s); - assert(inv_q_level[num_levels - 1] == max_s); + SB_DCHECK(inv_q_level[0] == min_s); + SB_DCHECK(inv_q_level[num_levels - 1] == max_s); // k-Means iterations. for (iter = 0; iter < MAX_ITER; ++iter) {
diff --git a/src/third_party/libwebp/utils/thread.c b/src/third_party/libwebp/utils/thread.c index b1615d0..55403a8 100644 --- a/src/third_party/libwebp/utils/thread.c +++ b/src/third_party/libwebp/utils/thread.c
@@ -11,8 +11,13 @@ // // Author: Skal (pascal.massimino@gmail.com) -#include <assert.h> -#include <string.h> // for memset() + +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else +#include <string.h> // for SbMemorySet() +#endif #include "./thread.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -180,7 +185,7 @@ //------------------------------------------------------------------------------ void WebPWorkerInit(WebPWorker* const worker) { - memset(worker, 0, sizeof(*worker)); + SbMemorySet(worker, 0, sizeof(*worker)); worker->status_ = NOT_OK; } @@ -188,7 +193,7 @@ #ifdef WEBP_USE_THREAD WebPWorkerChangeState(worker, OK); #endif - assert(worker->status_ <= OK); + SB_DCHECK(worker->status_ <= OK); return !worker->had_error; } @@ -211,7 +216,7 @@ } else if (worker->status_ > OK) { ok = WebPWorkerSync(worker); } - assert(!ok || (worker->status_ == OK)); + SB_DCHECK(!ok || (worker->status_ == OK)); return ok; } @@ -235,7 +240,7 @@ worker->status_ = NOT_OK; #endif } - assert(worker->status_ == NOT_OK); + SB_DCHECK(worker->status_ == NOT_OK); } //------------------------------------------------------------------------------
diff --git a/src/third_party/libwebp/utils/utils.c b/src/third_party/libwebp/utils/utils.c index ed53fc2..69697c3 100644 --- a/src/third_party/libwebp/utils/utils.c +++ b/src/third_party/libwebp/utils/utils.c
@@ -12,7 +12,8 @@ // Author: Skal (pascal.massimino@gmail.com) #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" +#include "starboard/memory.h" #else #include <stdlib.h> #endif @@ -36,14 +37,14 @@ void* WebPSafeMalloc(uint64_t nmemb, size_t size) { if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; - assert(nmemb * size > 0); - return malloc((size_t)(nmemb * size)); + SB_DCHECK(nmemb * size > 0); + return SbMemoryAllocate((size_t)(nmemb * size)); } void* WebPSafeCalloc(uint64_t nmemb, size_t size) { if (!CheckSizeArgumentsOverflow(nmemb, size)) return NULL; - assert(nmemb * size > 0); - return calloc((size_t)nmemb, size); + SB_DCHECK(nmemb * size > 0); + return SbMemoryCalloc((size_t)nmemb, size); } //------------------------------------------------------------------------------
diff --git a/src/third_party/libwebp/utils/utils.h b/src/third_party/libwebp/utils/utils.h index f249b36..e65c339 100644 --- a/src/third_party/libwebp/utils/utils.h +++ b/src/third_party/libwebp/utils/utils.h
@@ -16,7 +16,7 @@ #define WEBP_UTILS_UTILS_H_ #if defined(STARBOARD) -#include "third_party/libwebp/starboard_private.h" +#include "starboard/log.h" #else #include <assert.h> #endif @@ -37,11 +37,11 @@ // large, or return NULL. You don't need to call these for constructs like // malloc(sizeof(foo)), but only if there's picture-dependent size involved // somewhere (like: malloc(num_pixels * sizeof(*something))). That's why this -// safe malloc() borrows the signature from calloc(), pointing at the dangerous +// safe malloc() borrows the signature from malloc(), pointing at the dangerous // underlying multiply involved. void* WebPSafeMalloc(uint64_t nmemb, size_t size); // Note that WebPSafeCalloc() expects the second argument type to be 'size_t' -// in order to favor the "calloc(num_foo, sizeof(foo))" pattern. +// in order to favor the "SbMemoryCalloc(num_foo, sizeof(foo))" pattern. void* WebPSafeCalloc(uint64_t nmemb, size_t size); //------------------------------------------------------------------------------ @@ -62,13 +62,13 @@ // Store 16, 24 or 32 bits in little-endian order. static WEBP_INLINE void PutLE16(uint8_t* const data, int val) { - assert(val < (1 << 16)); + SB_DCHECK(val < (1 << 16)); data[0] = (val >> 0); data[1] = (val >> 8); } static WEBP_INLINE void PutLE24(uint8_t* const data, int val) { - assert(val < (1 << 24)); + SB_DCHECK(val < (1 << 24)); PutLE16(data, val & 0xffff); data[2] = (val >> 16); }
diff --git a/src/third_party/libwebp/webp/decode.h b/src/third_party/libwebp/webp/decode.h index 141f861..1d98b8c 100644 --- a/src/third_party/libwebp/webp/decode.h +++ b/src/third_party/libwebp/webp/decode.h
@@ -73,7 +73,7 @@ // Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer // returned is the Y samples buffer. Upon return, *u and *v will point to -// the U and V chroma data. These U and V buffers need NOT be free()'d, +// the U and V chroma data. These U and V buffers need NOT be freed()'d, // unlike the returned Y luma one. The dimension of the U and V planes // are both (*width + 1) / 2 and (*height + 1)/ 2. // Upon return, the Y buffer has a stride returned as '*stride', while U and V
diff --git a/src/third_party/libwebp/webp/encode.h b/src/third_party/libwebp/webp/encode.h index 726992f..47d9d91 100644 --- a/src/third_party/libwebp/webp/encode.h +++ b/src/third_party/libwebp/webp/encode.h
@@ -42,7 +42,7 @@ // Returns the size of the compressed data (pointed to by *output), or 0 if // an error occurred. The compressed data must be released by the caller -// using the call 'free(*output)'. +// using the call 'SbMemoryDeallocate(*output)'. // These functions compress using the lossy format, and the quality_factor // can go from 0 (smaller output, lower quality) to 100 (best quality, // larger output). @@ -222,7 +222,7 @@ // The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon // completion, writer.mem and writer.size will hold the coded data. -// writer.mem must be freed using the call 'free(writer.mem)'. +// writer.mem must be freed using the call 'SbMemoryDeallocate(writer.mem)'. WEBP_EXTERN(int) WebPMemoryWrite(const uint8_t* data, size_t data_size, const WebPPicture* picture);
diff --git a/src/third_party/libwebp/webp/mux_types.h b/src/third_party/libwebp/webp/mux_types.h index b8bce36..7c7abac 100644 --- a/src/third_party/libwebp/webp/mux_types.h +++ b/src/third_party/libwebp/webp/mux_types.h
@@ -14,8 +14,13 @@ #ifndef WEBP_WEBP_MUX_TYPES_H_ #define WEBP_WEBP_MUX_TYPES_H_ +#if defined(STARBOARD) +#include "starboard/log.h" +#include "starboard/memory.h" +#else #include <stdlib.h> // free() #include <string.h> // memset() +#endif #include "./types.h" #if defined(__cplusplus) || defined(c_plusplus) @@ -55,7 +60,7 @@ // Initializes the contents of the 'webp_data' object with default values. static WEBP_INLINE void WebPDataInit(WebPData* webp_data) { if (webp_data != NULL) { - memset(webp_data, 0, sizeof(*webp_data)); + SbMemorySet(webp_data, 0, sizeof(*webp_data)); } } @@ -63,7 +68,7 @@ // deallocate the object itself. static WEBP_INLINE void WebPDataClear(WebPData* webp_data) { if (webp_data != NULL) { - free((void*)webp_data->bytes); + SbMemoryDeallocate((void*)webp_data->bytes); WebPDataInit(webp_data); } } @@ -74,9 +79,9 @@ if (src == NULL || dst == NULL) return 0; WebPDataInit(dst); if (src->bytes != NULL && src->size != 0) { - dst->bytes = (uint8_t*)malloc(src->size); + dst->bytes = (uint8_t*)SbMemoryAllocate(src->size); if (dst->bytes == NULL) return 0; - memcpy((void*)dst->bytes, src->bytes, src->size); + SbMemoryCopy((void*)dst->bytes, src->bytes, src->size); dst->size = src->size; } return 1;
diff --git a/src/third_party/mozjs-45/cobalt_config/include/js-confdefs.h b/src/third_party/mozjs-45/cobalt_config/include/js-confdefs.h index e33b057..ec173ec 100644 --- a/src/third_party/mozjs-45/cobalt_config/include/js-confdefs.h +++ b/src/third_party/mozjs-45/cobalt_config/include/js-confdefs.h
@@ -25,8 +25,8 @@ #define JS_DEBUG 1 #endif -// Disabling this will fall back to getenv for locale-specific number -// formatting. +// Disabling this will fall back to js_sb_getenv for locale- +// specific number formatting. // This can be removed when ENABLE_INTL_API is enabled, which requires a newer // version of ICU. #define HAVE_LOCALECONV 1 @@ -42,4 +42,12 @@ // #include "js/RequiredDefines.h" +inline char* js_sb_getenv(const char* name) { + return nullptr; +} + +inline char* js_sb_secure_getenv(const char* name) { + return nullptr; +} + #endif /* _JS_CONFDEFS_H_ */
diff --git a/src/third_party/mozjs-45/cobalt_config/include/jscustomallocator.h b/src/third_party/mozjs-45/cobalt_config/include/jscustomallocator.h new file mode 100644 index 0000000..b1c9919 --- /dev/null +++ b/src/third_party/mozjs-45/cobalt_config/include/jscustomallocator.h
@@ -0,0 +1,178 @@ +// Copyright 2017 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef gc_JSCUSTOMALLOCATOR_H +#define gc_JSCUSTOMALLOCATOR_H + +#include <algorithm> + +#include "starboard/memory.h" +#include "starboard/string.h" + +namespace js { +namespace oom { + +// Code imported from default allocator. These identifiers must be supplied +// to SpiderMonkey common code. + +/* + * To make testing OOM in certain helper threads more effective, + * allow restricting the OOM testing to a certain helper thread + * type. This allows us to fail e.g. in off-thread script parsing + * without causing an OOM in the main thread first. + */ +enum ThreadType { + THREAD_TYPE_NONE = 0, // 0 + THREAD_TYPE_MAIN, // 1 + THREAD_TYPE_ASMJS, // 2 + THREAD_TYPE_ION, // 3 + THREAD_TYPE_PARSE, // 4 + THREAD_TYPE_COMPRESS, // 5 + THREAD_TYPE_GCHELPER, // 6 + THREAD_TYPE_GCPARALLEL, // 7 + THREAD_TYPE_MAX // Used to check shell function arguments +}; + +/* + * Getter/Setter functions to encapsulate mozilla::ThreadLocal, + * implementation is in jsutil.cpp. + */ +# if defined(DEBUG) || defined(JS_OOM_BREAKPOINT) +extern bool InitThreadType(void); +extern void SetThreadType(ThreadType); +extern uint32_t GetThreadType(void); +# else +inline bool InitThreadType(void) { return true; } +inline void SetThreadType(ThreadType t) {}; +inline uint32_t GetThreadType(void) { return 0; } +# endif + +} // namespace oom +} // namespace js + +# if defined(DEBUG) || defined(JS_OOM_BREAKPOINT) + +/* + * In order to test OOM conditions, when the testing function + * oomAfterAllocations COUNT is passed, we fail continuously after the NUM'th + * allocation from now. + */ +extern JS_PUBLIC_DATA(uint32_t) OOM_maxAllocations; /* set in builtin/TestingFunctions.cpp */ +extern JS_PUBLIC_DATA(uint32_t) OOM_counter; /* data race, who cares. */ +extern JS_PUBLIC_DATA(bool) OOM_failAlways; + +#define JS_OOM_CALL_BP_FUNC() do {} while(0) + +namespace js { +namespace oom { + +extern JS_PUBLIC_DATA(uint32_t) targetThread; + +static inline bool +IsThreadSimulatingOOM() +{ + return false; +} + +static inline bool +IsSimulatedOOMAllocation() +{ + return false; +} + +static inline bool +ShouldFailWithOOM() +{ + return false; +} + +} // namespace oom +} // namespace js + +# define JS_OOM_POSSIBLY_FAIL() \ + do { \ + if (js::oom::ShouldFailWithOOM()) \ + return nullptr; \ + } while (0) + +# define JS_OOM_POSSIBLY_FAIL_BOOL() \ + do { \ + if (js::oom::ShouldFailWithOOM()) \ + return false; \ + } while (0) + +# else // defined(DEBUG) || defined(JS_OOM_BREAKPOINT) + +# define JS_OOM_POSSIBLY_FAIL() do {} while(0) +# define JS_OOM_POSSIBLY_FAIL_BOOL() do {} while(0) +namespace js { +namespace oom { +static inline bool IsSimulatedOOMAllocation() { return false; } +static inline bool ShouldFailWithOOM() { return false; } +} // namespace oom +} // namespace js + +# endif // defined(DEBUG) || defined(JS_OOM_BREAKPOINT) + +namespace js { + +struct MOZ_RAII AutoEnterOOMUnsafeRegion +{ + MOZ_NORETURN MOZ_COLD void crash(const char* reason); +}; + +} // namespace js + +static inline void* js_malloc(size_t bytes) +{ + return SbMemoryAllocate(bytes); +} + +static inline void* js_calloc(size_t nmemb, size_t size) +{ + size_t total_size = nmemb * size; + void* memory = js_malloc(total_size); + if (memory) { + SbMemorySet(memory, 0, total_size); + } + return memory; +} + +static inline void* js_calloc(size_t bytes) +{ + return js_calloc(bytes, 1); +} + +static inline void* js_realloc(void* p, size_t bytes) +{ + return SbMemoryReallocate(p, bytes); +} + +static inline void js_free(void* p) +{ + if (p == NULL) { + return; + } + SbMemoryDeallocate(p); +} + +static inline char* js_strdup(const char* s) +{ + size_t length = SbStringGetLength(s) + 1; + char* new_ptr = reinterpret_cast<char*>(js_malloc(length)); + SbStringCopy(new_ptr, s, length); + return new_ptr; +} + +#endif // gc_JSCUSTOMALLOCATOR_H
diff --git a/src/third_party/mozjs-45/js/public/Utility.h b/src/third_party/mozjs-45/js/public/Utility.h index d62e62e..be4c600 100644 --- a/src/third_party/mozjs-45/js/public/Utility.h +++ b/src/third_party/mozjs-45/js/public/Utility.h
@@ -63,6 +63,10 @@ # include "jscustomallocator.h" #else +#if defined(STARBOARD) +#error "Builds on top of starboard should always use a custom allocator." +#endif + namespace js { namespace oom {
diff --git a/src/third_party/mozjs-45/js/src/builtin/Profilers.cpp b/src/third_party/mozjs-45/js/src/builtin/Profilers.cpp index 1ae46c4..19ffa62 100644 --- a/src/third_party/mozjs-45/js/src/builtin/Profilers.cpp +++ b/src/third_party/mozjs-45/js/src/builtin/Profilers.cpp
@@ -487,8 +487,8 @@ } // Bail if MOZ_PROFILE_WITH_PERF is empty or undefined. - if (!getenv("MOZ_PROFILE_WITH_PERF") || - !strlen(getenv("MOZ_PROFILE_WITH_PERF"))) { + if (!js_sb_getenv("MOZ_PROFILE_WITH_PERF") || + !strlen(js_sb_getenv("MOZ_PROFILE_WITH_PERF"))) { return true; } @@ -518,7 +518,7 @@ Vector<const char*, 0, SystemAllocPolicy> args; args.append(defaultArgs, ArrayLength(defaultArgs)); - const char* flags = getenv("MOZ_PROFILE_PERF_FLAGS"); + const char* flags = js_sb_getenv("MOZ_PROFILE_PERF_FLAGS"); if (!flags) { flags = "--call-graph"; }
diff --git a/src/third_party/mozjs-45/js/src/builtin/TestingFunctions.cpp b/src/third_party/mozjs-45/js/src/builtin/TestingFunctions.cpp index 588670d..e0d32b5 100644 --- a/src/third_party/mozjs-45/js/src/builtin/TestingFunctions.cpp +++ b/src/third_party/mozjs-45/js/src/builtin/TestingFunctions.cpp
@@ -59,7 +59,7 @@ static bool EnvVarIsDefined(const char* name) { - const char* value = getenv(name); + const char* value = js_sb_getenv(name); return value && *value; } @@ -70,7 +70,7 @@ if (!EnvVarIsDefined(name)) return false; - *valueOut = atoi(getenv(name)); + *valueOut = atoi(js_sb_getenv(name)); return true; } #endif @@ -3026,7 +3026,7 @@ return false; JSString* str = JS_NewStringCopyN(cx, content, length); - free(content); + js_free(content); if (!str) return false;
diff --git a/src/third_party/mozjs-45/js/src/editline/editline.h b/src/third_party/mozjs-45/js/src/editline/editline.h index b849e58..fa21ca7 100644 --- a/src/third_party/mozjs-45/js/src/editline/editline.h +++ b/src/third_party/mozjs-45/js/src/editline/editline.h
@@ -81,7 +81,7 @@ extern void rl_add_slash(); #if !defined(HAVE_STDLIB) -extern char *getenv(); +extern char *js_sb_getenv(); extern char *malloc(); extern char *realloc(); extern char *memcpy();
diff --git a/src/third_party/mozjs-45/js/src/gc/GCTrace.cpp b/src/third_party/mozjs-45/js/src/gc/GCTrace.cpp index 5a336b0..48d9e7c 100644 --- a/src/third_party/mozjs-45/js/src/gc/GCTrace.cpp +++ b/src/third_party/mozjs-45/js/src/gc/GCTrace.cpp
@@ -81,7 +81,7 @@ /* This currently does not support multiple runtimes. */ MOZ_ALWAYS_TRUE(!gcTraceFile); - char* filename = getenv("JS_GC_TRACE"); + char* filename = js_sb_getenv("JS_GC_TRACE"); if (!filename) return true;
diff --git a/src/third_party/mozjs-45/js/src/gc/Nursery.cpp b/src/third_party/mozjs-45/js/src/gc/Nursery.cpp index b6e0d5e..8afa389 100644 --- a/src/third_party/mozjs-45/js/src/gc/Nursery.cpp +++ b/src/third_party/mozjs-45/js/src/gc/Nursery.cpp
@@ -86,7 +86,7 @@ setCurrentChunk(0); updateDecommittedRegion(); - char* env = getenv("JS_GC_PROFILE_NURSERY"); + char* env = js_sb_getenv("JS_GC_PROFILE_NURSERY"); if (env) { if (0 == strcmp(env, "help")) { fprintf(stderr, "JS_GC_PROFILE_NURSERY=N\n\n"
diff --git a/src/third_party/mozjs-45/js/src/gc/Statistics.cpp b/src/third_party/mozjs-45/js/src/gc/Statistics.cpp index 0b8cd6a..c43bd62 100644 --- a/src/third_party/mozjs-45/js/src/gc/Statistics.cpp +++ b/src/third_party/mozjs-45/js/src/gc/Statistics.cpp
@@ -24,6 +24,10 @@ #include "vm/Runtime.h" #include "vm/Time.h" +#if defined(STARBOARD) +#include "starboard/string.h" +#endif + using namespace js; using namespace js::gc; using namespace js::gcstats; @@ -709,7 +713,11 @@ UniqueChars FilterJsonKey(const char*const buffer) { +#if defined(STARBOARD) + char* mut = SbStringDuplicate(buffer); +#else char* mut = strdup(buffer); +#endif char* c = mut; while (*c) { if (!isalpha(*c)) @@ -812,7 +820,7 @@ } } - char* env = getenv("MOZ_GCTIMER"); + char* env = js_sb_getenv("MOZ_GCTIMER"); if (env) { if (strcmp(env, "none") == 0) { fp = nullptr;
diff --git a/src/third_party/mozjs-45/js/src/jit/ExecutableAllocator.h b/src/third_party/mozjs-45/js/src/jit/ExecutableAllocator.h index 874f6b7..4db2d59 100644 --- a/src/third_party/mozjs-45/js/src/jit/ExecutableAllocator.h +++ b/src/third_party/mozjs-45/js/src/jit/ExecutableAllocator.h
@@ -43,6 +43,10 @@ #include "js/HashTable.h" #include "js/Vector.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#endif + #ifdef JS_CPU_SPARC #ifdef __linux__ // bugzilla 502369 static void sync_instruction_memory(caddr_t v, u_int len) @@ -397,7 +401,17 @@ static unsigned initialProtectionFlags(ProtectionSetting protection); -#if defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) +#if defined(STARBOARD) +#if SB_CAN(MAP_EXECUTABLE_MEMORY) + static void cacheFlush(void* code, size_t size) { + SbMemoryFlush(code, size); + } +#else // SB_CAN(MAP_EXECUTABLE_MEMORY) + static void cacheFlush(void* code, size_t size) { + MOZ_CRASH(); + } +#endif // SB_CAN(MAP_EXECUTABLE_MEMORY) +#elif defined(JS_CODEGEN_X86) || defined(JS_CODEGEN_X64) static void cacheFlush(void*, size_t) { }
diff --git a/src/third_party/mozjs-45/js/src/jit/JitOptions.cpp b/src/third_party/mozjs-45/js/src/jit/JitOptions.cpp index 8d43464..f7f9ccf 100644 --- a/src/third_party/mozjs-45/js/src/jit/JitOptions.cpp +++ b/src/third_party/mozjs-45/js/src/jit/JitOptions.cpp
@@ -39,7 +39,7 @@ template<typename T> T overrideDefault(const char* param, T dflt) { - char* str = getenv(param); + char* str = js_sb_getenv(param); if (!str) return dflt; if (IsBool<T>::value) { @@ -165,7 +165,7 @@ // a function with the highest ionmonkey optimization level. // (i.e. OptimizationLevel_Normal) const char* forcedDefaultIonWarmUpThresholdEnv = "JIT_OPTION_forcedDefaultIonWarmUpThreshold"; - if (const char* env = getenv(forcedDefaultIonWarmUpThresholdEnv)) { + if (const char* env = js_sb_getenv(forcedDefaultIonWarmUpThresholdEnv)) { Maybe<int> value = ParseInt(env); if (value.isSome()) forcedDefaultIonWarmUpThreshold.emplace(value.ref()); @@ -176,7 +176,7 @@ // Force the used register allocator instead of letting the optimization // pass decide. const char* forcedRegisterAllocatorEnv = "JIT_OPTION_forcedRegisterAllocator"; - if (const char* env = getenv(forcedRegisterAllocatorEnv)) { + if (const char* env = js_sb_getenv(forcedRegisterAllocatorEnv)) { forcedRegisterAllocator = LookupRegisterAllocator(env); if (!forcedRegisterAllocator.isSome()) Warn(forcedRegisterAllocatorEnv, env);
diff --git a/src/third_party/mozjs-45/js/src/jit/JitSpewer.cpp b/src/third_party/mozjs-45/js/src/jit/JitSpewer.cpp index d7d7c48..74e0b27 100644 --- a/src/third_party/mozjs-45/js/src/jit/JitSpewer.cpp +++ b/src/third_party/mozjs-45/js/src/jit/JitSpewer.cpp
@@ -109,7 +109,7 @@ static bool FilterContainsLocation(JSScript* function) { - static const char* filter = getenv("IONFILTER"); + static const char* filter = js_sb_getenv("IONFILTER"); // If there is no filter we accept all outputs. if (!filter || !filter[0]) @@ -389,7 +389,7 @@ if (LoggingChecked) return; LoggingChecked = true; - const char* env = getenv("IONFLAGS"); + const char* env = js_sb_getenv("IONFLAGS"); if (!env) return; if (strstr(env, "help")) {
diff --git a/src/third_party/mozjs-45/js/src/jit/PerfSpewer.cpp b/src/third_party/mozjs-45/js/src/jit/PerfSpewer.cpp index b037848..8895a39 100644 --- a/src/third_party/mozjs-45/js/src/jit/PerfSpewer.cpp +++ b/src/third_party/mozjs-45/js/src/jit/PerfSpewer.cpp
@@ -74,7 +74,7 @@ void js::jit::CheckPerf() { if (!PerfChecked) { - const char* env = getenv("IONPERF"); + const char* env = js_sb_getenv("IONPERF"); if (env == nullptr) { PerfMode = PERF_MODE_NONE; fprintf(stderr, "Warning: JIT perf reporting requires IONPERF set to \"block\" or \"func\". ");
diff --git a/src/third_party/mozjs-45/js/src/jit/RegisterAllocator.cpp b/src/third_party/mozjs-45/js/src/jit/RegisterAllocator.cpp index 1fb9370..450de3e 100644 --- a/src/third_party/mozjs-45/js/src/jit/RegisterAllocator.cpp +++ b/src/third_party/mozjs-45/js/src/jit/RegisterAllocator.cpp
@@ -467,6 +467,8 @@ #endif } +#undef MAX +#undef MIN const CodePosition CodePosition::MAX(UINT_MAX); const CodePosition CodePosition::MIN(0);
diff --git a/src/third_party/mozjs-45/js/src/jit/arm/Architecture-arm.cpp b/src/third_party/mozjs-45/js/src/jit/arm/Architecture-arm.cpp index 30932ae..eb0d6bb 100644 --- a/src/third_party/mozjs-45/js/src/jit/arm/Architecture-arm.cpp +++ b/src/third_party/mozjs-45/js/src/jit/arm/Architecture-arm.cpp
@@ -182,7 +182,7 @@ if (armHwCapFlags != HWCAP_UNINITIALIZED) return; - const char* env = getenv("ARMHWCAP"); + const char* env = js_sb_getenv("ARMHWCAP"); if (ParseARMHwCapFlags(env)) return;
diff --git a/src/third_party/mozjs-45/js/src/jit/arm/Assembler-arm.cpp b/src/third_party/mozjs-45/js/src/jit/arm/Assembler-arm.cpp index 20cc6b9..5c19f5a 100644 --- a/src/third_party/mozjs-45/js/src/jit/arm/Assembler-arm.cpp +++ b/src/third_party/mozjs-45/js/src/jit/arm/Assembler-arm.cpp
@@ -3374,7 +3374,7 @@ { static bool isSet = false; if (!isSet) { - char* fillStr = getenv("ARM_ASM_NOP_FILL"); + char* fillStr = js_sb_getenv("ARM_ASM_NOP_FILL"); uint32_t fill; if (fillStr && sscanf(fillStr, "%u", &fill) == 1) NopFill = fill; @@ -3390,7 +3390,7 @@ { static bool isSet = false; if (!isSet) { - char* poolMaxOffsetStr = getenv("ASM_POOL_MAX_OFFSET"); + char* poolMaxOffsetStr = js_sb_getenv("ASM_POOL_MAX_OFFSET"); uint32_t poolMaxOffset; if (poolMaxOffsetStr && sscanf(poolMaxOffsetStr, "%u", &poolMaxOffset) == 1) AsmPoolMaxOffset = poolMaxOffset;
diff --git a/src/third_party/mozjs-45/js/src/jit/arm/Simulator-arm.cpp b/src/third_party/mozjs-45/js/src/jit/arm/Simulator-arm.cpp index c7da24a..1ce86d1 100644 --- a/src/third_party/mozjs-45/js/src/jit/arm/Simulator-arm.cpp +++ b/src/third_party/mozjs-45/js/src/jit/arm/Simulator-arm.cpp
@@ -397,10 +397,10 @@ return nullptr; } - if (getenv("ARM_SIM_ICACHE_CHECKS")) + if (js_sb_getenv("ARM_SIM_ICACHE_CHECKS")) Simulator::ICacheCheckingEnabled = true; - char* stopAtStr = getenv("ARM_SIM_STOP_AT"); + char* stopAtStr = js_sb_getenv("ARM_SIM_STOP_AT"); int64_t stopAt; if (stopAtStr && sscanf(stopAtStr, "%lld", &stopAt) == 1) { fprintf(stderr, "\nStopping simulation at icount %lld\n", stopAt); @@ -2940,7 +2940,7 @@ } case 7: { // BKPT fprintf(stderr, "Simulator hit BKPT.\n"); - if (getenv("ARM_SIM_DEBUGGER")) { + if (js_sb_getenv("ARM_SIM_DEBUGGER")) { ArmDebugger dbg(this); dbg.debug(); } else {
diff --git a/src/third_party/mozjs-45/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp b/src/third_party/mozjs-45/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp index 8438a9c..27b9eaa 100644 --- a/src/third_party/mozjs-45/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp +++ b/src/third_party/mozjs-45/js/src/jit/arm64/vixl/MozSimulator-vixl.cpp
@@ -170,7 +170,7 @@ // FIXME: We should free it at some point. // FIXME: Note that it can't be stored in the SimulatorRuntime due to lifetime conflicts. Simulator *sim; - if (getenv("USE_DEBUGGER") != nullptr) + if (js_sb_getenv("USE_DEBUGGER") != nullptr) sim = js_new<Debugger>(decoder, stdout); else sim = js_new<Simulator>(decoder, stdout); @@ -288,7 +288,7 @@ VIXL_ASSERT(entryStack == exitStack); int64_t result = xreg(0); - if (getenv("USE_DEBUGGER")) + if (js_sb_getenv("USE_DEBUGGER")) printf("LEAVE\n"); return result; } @@ -706,7 +706,7 @@ // Simulate a return. set_lr(savedLR); set_pc((Instruction*)savedLR); - if (getenv("USE_DEBUGGER")) + if (js_sb_getenv("USE_DEBUGGER")) printf("SVCRET\n"); }
diff --git a/src/third_party/mozjs-45/js/src/jit/mips32/Simulator-mips32.cpp b/src/third_party/mozjs-45/js/src/jit/mips32/Simulator-mips32.cpp index c6d0b36..424de98 100644 --- a/src/third_party/mozjs-45/js/src/jit/mips32/Simulator-mips32.cpp +++ b/src/third_party/mozjs-45/js/src/jit/mips32/Simulator-mips32.cpp
@@ -527,10 +527,10 @@ return nullptr; } - if (getenv("MIPS_SIM_ICACHE_CHECKS")) + if (js_sb_getenv("MIPS_SIM_ICACHE_CHECKS")) Simulator::ICacheCheckingEnabled = true; - char* stopAtStr = getenv("MIPS_SIM_STOP_AT"); + char* stopAtStr = js_sb_getenv("MIPS_SIM_STOP_AT"); int64_t stopAt; if (stopAtStr && sscanf(stopAtStr, "%lld", &stopAt) == 1) { fprintf(stderr, "\nStopping simulation at icount %lld\n", stopAt);
diff --git a/src/third_party/mozjs-45/js/src/jit/mips64/Simulator-mips64.cpp b/src/third_party/mozjs-45/js/src/jit/mips64/Simulator-mips64.cpp index 2728af2..f8fc143 100644 --- a/src/third_party/mozjs-45/js/src/jit/mips64/Simulator-mips64.cpp +++ b/src/third_party/mozjs-45/js/src/jit/mips64/Simulator-mips64.cpp
@@ -564,11 +564,11 @@ return nullptr; } - if (getenv("MIPS_SIM_ICACHE_CHECKS")) + if (js_sb_getenv("MIPS_SIM_ICACHE_CHECKS")) Simulator::ICacheCheckingEnabled = true; int64_t stopAt; - char* stopAtStr = getenv("MIPS_SIM_STOP_AT"); + char* stopAtStr = js_sb_getenv("MIPS_SIM_STOP_AT"); if (stopAtStr && sscanf(stopAtStr, "%ld", &stopAt) == 1) { fprintf(stderr, "\nStopping simulation at icount %ld\n", stopAt); Simulator::StopSimAt = stopAt;
diff --git a/src/third_party/mozjs-45/js/src/jit/none/MacroAssembler-none.h b/src/third_party/mozjs-45/js/src/jit/none/MacroAssembler-none.h index 512ae81..ed21f1b 100644 --- a/src/third_party/mozjs-45/js/src/jit/none/MacroAssembler-none.h +++ b/src/third_party/mozjs-45/js/src/jit/none/MacroAssembler-none.h
@@ -259,6 +259,14 @@ template <typename T, typename S> void branchPrivatePtr(Condition, T, S, Label*) { MOZ_CRASH(); } template <typename T, typename S> void decBranchPtr(Condition, T, S, Label*) { MOZ_CRASH(); } template <typename T, typename S> void branchTest64(Condition, T, T, S, Label*) { MOZ_CRASH(); } + + // These functions are missing from stock SpiderMonkey 45, but should be + // here, see: + // https://bugzilla.mozilla.org/show_bug.cgi?id=1266366 + // https://bug1266366.bmoattachments.org/attachment.cgi?id=8743851 + template <typename T, typename S> void branch64(Condition, T, S, Label*) { MOZ_CRASH(); } + template <typename T, typename S> void branch64(Condition, T, T, S, Label*) { MOZ_CRASH(); } + template <typename T, typename S> void mov(T, S) { MOZ_CRASH(); } template <typename T, typename S> void movq(T, S) { MOZ_CRASH(); } template <typename T, typename S> void movePtr(T, S) { MOZ_CRASH(); }
diff --git a/src/third_party/mozjs-45/js/src/jscntxt.cpp b/src/third_party/mozjs-45/js/src/jscntxt.cpp index d7358ce..d85375e 100644 --- a/src/third_party/mozjs-45/js/src/jscntxt.cpp +++ b/src/third_party/mozjs-45/js/src/jscntxt.cpp
@@ -1059,7 +1059,7 @@ #if !defined(ANDROID) || defined(GONK) return false; #else // ANDROID - if (getenv("JS_IGNORE_JIT_BROKENNESS")) { + if (js_sb_getenv("JS_IGNORE_JIT_BROKENNESS")) { return false; }
diff --git a/src/third_party/mozjs-45/js/src/jsgc.cpp b/src/third_party/mozjs-45/js/src/jsgc.cpp index 610fd78..23bd1a9 100644 --- a/src/third_party/mozjs-45/js/src/jsgc.cpp +++ b/src/third_party/mozjs-45/js/src/jsgc.cpp
@@ -1292,7 +1292,7 @@ tunables.setParameter(JSGC_MAX_BYTES, maxbytes, lock); setMaxMallocBytes(maxbytes); - const char* size = getenv("JSGC_MARK_STACK_LIMIT"); + const char* size = js_sb_getenv("JSGC_MARK_STACK_LIMIT"); if (size) setMarkStackLimit(atoi(size), lock); @@ -1311,7 +1311,7 @@ } #ifdef JS_GC_ZEAL - const char* zealSpec = getenv("JS_GC_ZEAL"); + const char* zealSpec = js_sb_getenv("JS_GC_ZEAL"); if (zealSpec && zealSpec[0] && !parseAndSetZeal(zealSpec)) return false; #endif @@ -3400,7 +3400,9 @@ { static unsigned ncpus = 0; if (ncpus == 0) { -# ifdef XP_WIN +# if defined(STARBOARD) + ncpus = SbSystemGetNumberOfProcessors(); +# elif defined(XP_WIN) SYSTEM_INFO sysinfo; GetSystemInfo(&sysinfo); ncpus = unsigned(sysinfo.dwNumberOfProcessors);
diff --git a/src/third_party/mozjs-45/js/src/jsmath.cpp b/src/third_party/mozjs-45/js/src/jsmath.cpp index 83d5a09..05747bf 100644 --- a/src/third_party/mozjs-45/js/src/jsmath.cpp +++ b/src/third_party/mozjs-45/js/src/jsmath.cpp
@@ -57,6 +57,11 @@ # define HAVE_ARC4RANDOM #endif +#if defined(STARBOARD) +#undef HAVE_ARC4RANDOM +#define HAVE_LOG2 1 +#endif + using namespace js; using mozilla::Abs;
diff --git a/src/third_party/mozjs-45/js/src/jsnum.cpp b/src/third_party/mozjs-45/js/src/jsnum.cpp index 68c70a0..237bcdf 100644 --- a/src/third_party/mozjs-45/js/src/jsnum.cpp +++ b/src/third_party/mozjs-45/js/src/jsnum.cpp
@@ -1073,9 +1073,9 @@ decimalPoint = locale->decimal_point; grouping = locale->grouping; #else - thousandsSeparator = getenv("LOCALE_THOUSANDS_SEP"); - decimalPoint = getenv("LOCALE_DECIMAL_POINT"); - grouping = getenv("LOCALE_GROUPING"); + thousandsSeparator = js_sb_getenv("LOCALE_THOUSANDS_SEP"); + decimalPoint = js_sb_getenv("LOCALE_DECIMAL_POINT"); + grouping = js_sb_getenv("LOCALE_GROUPING"); #endif if (!thousandsSeparator) thousandsSeparator = "'";
diff --git a/src/third_party/mozjs-45/js/src/jsutil.h b/src/third_party/mozjs-45/js/src/jsutil.h index e28cb39..9a9dea4 100644 --- a/src/third_party/mozjs-45/js/src/jsutil.h +++ b/src/third_party/mozjs-45/js/src/jsutil.h
@@ -294,7 +294,7 @@ static inline void* Poison(void* ptr, uint8_t value, size_t num) { - static bool disablePoison = bool(getenv("JSGC_DISABLE_POISONING")); + static bool disablePoison = bool(js_sb_getenv("JSGC_DISABLE_POISONING")); if (disablePoison) return ptr;
diff --git a/src/third_party/mozjs-45/js/src/shell/OSObject.cpp b/src/third_party/mozjs-45/js/src/shell/OSObject.cpp index e06d535..6b04f3d 100644 --- a/src/third_party/mozjs-45/js/src/shell/OSObject.cpp +++ b/src/third_party/mozjs-45/js/src/shell/OSObject.cpp
@@ -10,7 +10,9 @@ #include <errno.h> #include <stdlib.h> -#ifdef XP_WIN +#if defined(STARBOARD) +// Intentionally empty. +#elif defined(XP_WIN) #include <direct.h> #include <process.h> #include <string.h> @@ -94,6 +96,9 @@ JSString* ResolvePath(JSContext* cx, HandleString filenameStr, PathResolutionMode resolveMode) { +#if defined(STARBOARD) + return nullptr; +#else // defined(STARBOARD) JSAutoByteString filename(cx, filenameStr); if (!filename) return nullptr; @@ -139,6 +144,7 @@ return nullptr; return JS_NewStringCopyZ(cx, buffer); +#endif // defined(STARBOARD) } static JSObject* @@ -462,7 +468,7 @@ if (!keyBytes.encodeUtf8(cx, key)) return false; - if (const char* valueBytes = getenv(keyBytes.ptr())) { + if (const char* valueBytes = js_sb_getenv(keyBytes.ptr())) { RootedString value(cx, JS_NewStringCopyZ(cx, valueBytes)); if (!value) return false; @@ -481,7 +487,11 @@ JS_ReportError(cx, "os.getpid takes no arguments"); return false; } +#if defined(STARBOARD) + args.rval().setInt32(0); +#else args.rval().setInt32(getpid()); +#endif return true; } @@ -566,7 +576,7 @@ return true; } -#ifndef XP_WIN +#if !defined(XP_WIN) && !defined(STARBOARD) static bool os_spawn(JSContext* cx, unsigned argc, Value* vp) { @@ -698,7 +708,7 @@ " Execute command on the current host, returning result code or throwing an\n" " exception on failure."), -#ifndef XP_WIN +#if !defined(XP_WIN) && !defined(STARBOARD) JS_FN_HELP("spawn", os_spawn, 1, 0, "spawn(command)", " Start up a separate process running the given command. Returns the pid."),
diff --git a/src/third_party/mozjs-45/js/src/shell/js.cpp b/src/third_party/mozjs-45/js/src/shell/js.cpp index 70f1f64..cc4e445 100644 --- a/src/third_party/mozjs-45/js/src/shell/js.cpp +++ b/src/third_party/mozjs-45/js/src/shell/js.cpp
@@ -10,7 +10,12 @@ #include "mozilla/Atomics.h" #include "mozilla/DebugOnly.h" #include "mozilla/GuardObjects.h" +#if !defined(STARBOARD) +// mozalloc is only (minimally) used in the shell, and thus is not fully +// starboardized. Don't bother including it and just ifdef out references to +// stuff from it. #include "mozilla/mozalloc.h" +#endif // !defined(STARBOARD) #include "mozilla/PodOperations.h" #ifdef XP_WIN @@ -6541,7 +6546,7 @@ if (op->getBoolOption("fuzzing-safe")) fuzzingSafe = true; else - fuzzingSafe = (getenv("MOZ_FUZZING_SAFE") && getenv("MOZ_FUZZING_SAFE")[0] != '0'); + fuzzingSafe = (js_sb_getenv("MOZ_FUZZING_SAFE") && js_sb_getenv("MOZ_FUZZING_SAFE")[0] != '0'); if (op->getBoolOption("disable-oom-functions")) disableOOMFunctions = true; @@ -6579,7 +6584,7 @@ FILE* defaultOut, FILE** outFile) { - const char* outPath = getenv(envVar); + const char* outPath = js_sb_getenv(envVar); if (!outPath || !*outPath || !(*outFile = fopen(outPath, "w"))) { *outFile = defaultOut; } @@ -6596,7 +6601,7 @@ PreInit() { #ifdef XP_WIN - const char* crash_option = getenv("XRE_NO_WINDOWS_CRASH_DIALOG"); + const char* crash_option = js_sb_getenv("XRE_NO_WINDOWS_CRASH_DIALOG"); if (crash_option && strncmp(crash_option, "1", 1)) { // Disable the segfault dialog. We want to fail the tests immediately // instead of hanging automation. @@ -6886,7 +6891,9 @@ JS_SetNativeStackQuota(rt, gMaxStackSize); +#if !defined(STARBOARD) JS::dbg::SetDebuggerMallocSizeOf(rt, moz_malloc_size_of); +#endif if (!offThreadState.init()) return 1;
diff --git a/src/third_party/mozjs-45/js/src/vm/CodeCoverage.cpp b/src/third_party/mozjs-45/js/src/vm/CodeCoverage.cpp index f5d628e..4b39d67 100644 --- a/src/third_party/mozjs-45/js/src/vm/CodeCoverage.cpp +++ b/src/third_party/mozjs-45/js/src/vm/CodeCoverage.cpp
@@ -527,7 +527,7 @@ bool LCovRuntime::fillWithFilename(char *name, size_t length) { - const char* outDir = getenv("JS_CODE_COVERAGE_OUTPUT_DIR"); + const char* outDir = js_sb_getenv("JS_CODE_COVERAGE_OUTPUT_DIR"); if (!outDir || *outDir == 0) return false;
diff --git a/src/third_party/mozjs-45/js/src/vm/NativeObject.cpp b/src/third_party/mozjs-45/js/src/vm/NativeObject.cpp index f0488a5..88f3c2d 100644 --- a/src/third_party/mozjs-45/js/src/vm/NativeObject.cpp +++ b/src/third_party/mozjs-45/js/src/vm/NativeObject.cpp
@@ -107,7 +107,7 @@ { static int throttle = -1; if (throttle < 0) { - if (const char* var = getenv("JS_CHECK_SHAPE_THROTTLE")) + if (const char* var = js_sb_getenv("JS_CHECK_SHAPE_THROTTLE")) throttle = atoi(var); if (throttle < 0) throttle = 0;
diff --git a/src/third_party/mozjs-45/js/src/vm/Runtime.cpp b/src/third_party/mozjs-45/js/src/vm/Runtime.cpp index 23ecfd8..7df7dee 100644 --- a/src/third_party/mozjs-45/js/src/vm/Runtime.cpp +++ b/src/third_party/mozjs-45/js/src/vm/Runtime.cpp
@@ -254,9 +254,9 @@ static bool SignalBasedTriggersDisabled() { - // Don't bother trying to cache the getenv lookup; this should be called + // Don't bother trying to cache the js_sb_getenv lookup; this should be called // infrequently. - return !!getenv("JS_DISABLE_SLOW_SCRIPT_SIGNALS") || !!getenv("JS_NO_SIGNALS"); + return !!js_sb_getenv("JS_DISABLE_SLOW_SCRIPT_SIGNALS") || !!js_sb_getenv("JS_NO_SIGNALS"); } bool @@ -711,7 +711,7 @@ #ifdef HAVE_SETLOCALE locale = setlocale(LC_ALL, nullptr); #else - locale = getenv("LANG"); + locale = js_sb_getenv("LANG"); #endif // convert to a well-formed BCP 47 language tag if (!locale || !strcmp(locale, "C"))
diff --git a/src/third_party/mozjs-45/js/src/vm/SelfHosting.cpp b/src/third_party/mozjs-45/js/src/vm/SelfHosting.cpp index 36726cb..34f4835 100644 --- a/src/third_party/mozjs-45/js/src/vm/SelfHosting.cpp +++ b/src/third_party/mozjs-45/js/src/vm/SelfHosting.cpp
@@ -1769,7 +1769,7 @@ RootedValue rv(cx); bool ok = true; - char* filename = getenv("MOZ_SELFHOSTEDJS"); + char* filename = js_sb_getenv("MOZ_SELFHOSTEDJS"); if (filename) { RootedScript script(cx); if (Compile(cx, options, filename, &script))
diff --git a/src/third_party/mozjs-45/js/src/vm/Stack.cpp b/src/third_party/mozjs-45/js/src/vm/Stack.cpp index 01e8b43..b755b72 100644 --- a/src/third_party/mozjs-45/js/src/vm/Stack.cpp +++ b/src/third_party/mozjs-45/js/src/vm/Stack.cpp
@@ -1420,7 +1420,7 @@ static bool visible = false; if (!checked) { checked = true; - char* env = getenv("MOZ_SHOW_ALL_JS_FRAMES"); + char* env = js_sb_getenv("MOZ_SHOW_ALL_JS_FRAMES"); visible = !!env; } return visible;
diff --git a/src/third_party/mozjs-45/js/src/vm/TraceLogging.cpp b/src/third_party/mozjs-45/js/src/vm/TraceLogging.cpp index 6248c5d..58442f9 100644 --- a/src/third_party/mozjs-45/js/src/vm/TraceLogging.cpp +++ b/src/third_party/mozjs-45/js/src/vm/TraceLogging.cpp
@@ -650,7 +650,7 @@ if (!threadLoggers.init()) return false; - const char* env = getenv("TLLOG"); + const char* env = js_sb_getenv("TLLOG"); if (!env) env = ""; @@ -758,7 +758,7 @@ enabledTextIds[TraceLogger_Baseline] = enabledTextIds[TraceLogger_Engine]; enabledTextIds[TraceLogger_IonMonkey] = enabledTextIds[TraceLogger_Engine]; - const char* options = getenv("TLOPTIONS"); + const char* options = js_sb_getenv("TLOPTIONS"); if (options) { if (strstr(options, "help")) { fflush(nullptr);
diff --git a/src/third_party/mozjs-45/js/src/vm/TypeInference.cpp b/src/third_party/mozjs-45/js/src/vm/TypeInference.cpp index f6bde8c..2bf9a37 100644 --- a/src/third_party/mozjs-45/js/src/vm/TypeInference.cpp +++ b/src/third_party/mozjs-45/js/src/vm/TypeInference.cpp
@@ -131,7 +131,7 @@ if (!checked) { checked = true; PodArrayZero(active); - const char* env = getenv("INFERFLAGS"); + const char* env = js_sb_getenv("INFERFLAGS"); if (!env) return false; if (strstr(env, "ops")) @@ -153,7 +153,7 @@ static bool checked = false; if (!checked) { checked = true; - const char* env = getenv("TERM"); + const char* env = js_sb_getenv("TERM"); if (!env) return false; if (strcmp(env, "xterm-color") == 0 || strcmp(env, "xterm-256color") == 0)
diff --git a/src/third_party/mozjs-45/js/src/vm/UnboxedObject.cpp b/src/third_party/mozjs-45/js/src/vm/UnboxedObject.cpp index 039a40f..f661dde 100644 --- a/src/third_party/mozjs-45/js/src/vm/UnboxedObject.cpp +++ b/src/third_party/mozjs-45/js/src/vm/UnboxedObject.cpp
@@ -1901,11 +1901,11 @@ { bool isArray = !templateShape; - // Unboxed arrays are nightly only for now. The getenv() call will be + // Unboxed arrays are nightly only for now. The js_sb_getenv() call will be // removed when they are on by default. See bug 1153266. if (isArray) { #ifdef NIGHTLY_BUILD - if (!getenv("JS_OPTION_USE_UNBOXED_ARRAYS")) { + if (!js_sb_getenv("JS_OPTION_USE_UNBOXED_ARRAYS")) { if (!group->runtimeFromAnyThread()->options().unboxedArrays()) return true; }
diff --git a/src/third_party/mozjs-45/mfbt/AllocPolicy.h b/src/third_party/mozjs-45/mfbt/AllocPolicy.h index 0237ce4..99a0370 100644 --- a/src/third_party/mozjs-45/mfbt/AllocPolicy.h +++ b/src/third_party/mozjs-45/mfbt/AllocPolicy.h
@@ -14,8 +14,12 @@ #include "mozilla/TemplateLib.h" +#if defined(STARBOARD) +#include "starboard/memory.h" +#else #include <stddef.h> #include <stdlib.h> +#endif namespace mozilla { @@ -76,13 +80,21 @@ if (aNumElems & mozilla::tl::MulOverflowMask<sizeof(T)>::value) { return nullptr; } +#if defined(STARBOARD) + return static_cast<T*>(SbMemoryAllocate(aNumElems * sizeof(T))); +#else return static_cast<T*>(malloc(aNumElems * sizeof(T))); +#endif } template <typename T> T* maybe_pod_calloc(size_t aNumElems) { +#if defined(STARBOARD) + return static_cast<T*>(SbMemoryCalloc(aNumElems, sizeof(T))); +#else return static_cast<T*>(calloc(aNumElems, sizeof(T))); +#endif } template <typename T> @@ -91,7 +103,11 @@ if (aNewSize & mozilla::tl::MulOverflowMask<sizeof(T)>::value) { return nullptr; } +#if defined(STARBOARD) + return static_cast<T*>(SbMemoryReallocate(aPtr, aNewSize * sizeof(T))); +#else return static_cast<T*>(realloc(aPtr, aNewSize * sizeof(T))); +#endif } template <typename T> @@ -114,7 +130,11 @@ void free_(void* aPtr) { +#if defined(STARBOARD) + SbMemoryDeallocate(aPtr); +#else free(aPtr); +#endif } void reportAllocOverflow() const
diff --git a/src/third_party/mozjs-45/mfbt/Assertions.h b/src/third_party/mozjs-45/mfbt/Assertions.h index f138ff9..dd772f5 100644 --- a/src/third_party/mozjs-45/mfbt/Assertions.h +++ b/src/third_party/mozjs-45/mfbt/Assertions.h
@@ -38,10 +38,16 @@ # define MOZ_CRASH_ANNOTATE(...) do { /* nothing */ } while (0) #endif +#if defined(STARBOARD) +#include "starboard/log.h" +#else #include <stddef.h> #include <stdio.h> #include <stdlib.h> -#ifdef WIN32 +#endif + +#if defined(STARBOARD) +#elif defined(WIN32) /* * TerminateProcess and GetCurrentProcess are defined in <winbase.h>, which * further depends on <windef.h>. We hardcode these few definitions manually @@ -152,7 +158,10 @@ MOZ_ReportAssertionFailure(const char* aStr, const char* aFilename, int aLine) MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS { -#ifdef ANDROID +#if defined(STARBOARD) + SbLogFormatF("Assertion failure: %s, at %s:%d\n", aStr, aFilename, aLine); + SbLogFlush(); +#elif defined(ANDROID) __android_log_print(ANDROID_LOG_FATAL, "MOZ_Assert", "Assertion failure: %s, at %s:%d\n", aStr, aFilename, aLine); @@ -169,7 +178,10 @@ MOZ_ReportCrash(const char* aStr, const char* aFilename, int aLine) MOZ_PRETEND_NORETURN_FOR_STATIC_ANALYSIS { -#ifdef ANDROID +#if defined(STARBOARD) + SbLogFormatF("Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine); + SbLogFlush(); +#elif defined(ANDROID) __android_log_print(ANDROID_LOG_FATAL, "MOZ_CRASH", "Hit MOZ_CRASH(%s) at %s:%d\n", aStr, aFilename, aLine); #else @@ -185,7 +197,13 @@ * MOZ_REALLY_CRASH is used in the implementation of MOZ_CRASH(). You should * call MOZ_CRASH instead. */ -#if defined(_MSC_VER) +#if defined(STARBOARD) +# define MOZ_REALLY_CRASH() \ + do { \ + *((volatile int*) NULL) = __LINE__; \ + ::SbSystemBreakIntoDebugger(); \ + } while (0) +#elif defined(_MSC_VER) /* * On MSVC use the __debugbreak compiler intrinsic, which produces an inline * (not nested in a system function) breakpoint. This distinctively invokes
diff --git a/src/third_party/mozjs-45/mfbt/ThreadLocal.h b/src/third_party/mozjs-45/mfbt/ThreadLocal.h index 79da298..65be357 100644 --- a/src/third_party/mozjs-45/mfbt/ThreadLocal.h +++ b/src/third_party/mozjs-45/mfbt/ThreadLocal.h
@@ -9,7 +9,10 @@ #ifndef mozilla_ThreadLocal_h #define mozilla_ThreadLocal_h -#if defined(XP_WIN) +#if defined(STARBOARD) +#include "starboard/atomic.h" +#include "starboard/thread.h" +#elif defined(XP_WIN) // This file will get included in any file that wants to add a profiler mark. // In order to not bring <windows.h> together we could include windef.h and // winbase.h which are sufficient to get the prototypes for the Tls* functions. @@ -36,7 +39,9 @@ // sig_safe_t denotes an atomic type which can be read or stored in a single // instruction. This means that data of this type is safe to be manipulated // from a signal handler, or other similar asynchronous execution contexts. -#if defined(XP_WIN) +#if defined(STARBOARD) +typedef SbAtomic32 sig_safe_t; +#elif defined(XP_WIN) typedef unsigned long sig_safe_t; #else typedef sig_atomic_t sig_safe_t; @@ -72,7 +77,9 @@ template<typename T> class ThreadLocal { -#if defined(XP_WIN) +#if defined(STARBOARD) + typedef SbThreadLocalKey key_t; +#elif defined(XP_WIN) typedef unsigned long key_t; #else typedef pthread_key_t key_t; @@ -119,7 +126,10 @@ "mozilla::ThreadLocal can't be used for types larger than " "a pointer"); MOZ_ASSERT(!initialized()); -#ifdef XP_WIN +#if defined(STARBOARD) + mKey = SbThreadCreateLocalKey(nullptr); + mInited = SbThreadIsValidLocalKey(mKey); +#elif defined(XP_WIN) mKey = TlsAlloc(); mInited = mKey != 0xFFFFFFFFUL; // TLS_OUT_OF_INDEXES #else @@ -134,7 +144,9 @@ { MOZ_ASSERT(initialized()); void* h; -#ifdef XP_WIN +#if defined(STARBOARD) + h = SbThreadGetLocalValue(mKey); +#elif defined(XP_WIN) h = TlsGetValue(mKey); #else h = pthread_getspecific(mKey); @@ -148,7 +160,9 @@ { MOZ_ASSERT(initialized()); void* h = reinterpret_cast<void*>(static_cast<typename Helper<T>::Type>(aValue)); -#ifdef XP_WIN +#if defined(STARBOARD) + bool succeeded = SbThreadSetLocalValue(mKey, h); +#elif defined(XP_WIN) bool succeeded = TlsSetValue(mKey, h); #else bool succeeded = !pthread_setspecific(mKey, h);
diff --git a/src/third_party/mozjs-45/mfbt/lz4.c b/src/third_party/mozjs-45/mfbt/lz4.c index c416fe8..230ef00 100644 --- a/src/third_party/mozjs-45/mfbt/lz4.c +++ b/src/third_party/mozjs-45/mfbt/lz4.c
@@ -151,12 +151,24 @@ /************************************** Memory routines **************************************/ +#if defined(STARBOARD) + +#include "starboard/memory.h" +#define ALLOCATOR(n,s) SbMemoryCalloc(n,s) +#define FREEMEM SbMemoryDeallocate +#include "starboard/string.h" +#define MEM_INIT SbMemorySet +#define memcpy(d,s,c) SbMemoryCopy(d,s,c) + +#else // defined(STARBOARD) + #include <stdlib.h> /* malloc, calloc, free */ #define ALLOCATOR(n,s) calloc(n,s) #define FREEMEM free #include <string.h> /* memset, memcpy */ #define MEM_INIT memset +#endif // defined(STARBOARD) /************************************** Includes
diff --git a/src/third_party/mozjs-45/mozglue/build/BionicGlue.cpp b/src/third_party/mozjs-45/mozglue/build/BionicGlue.cpp index eb8eb71..80efacb 100644 --- a/src/third_party/mozjs-45/mozglue/build/BionicGlue.cpp +++ b/src/third_party/mozjs-45/mozglue/build/BionicGlue.cpp
@@ -156,7 +156,7 @@ char *ev; pthread_mutex_lock(&_pr_envLock); - ev = getenv(var); + ev = js_sb_getenv(var); pthread_mutex_unlock(&_pr_envLock); return ev; }
diff --git a/src/third_party/mozjs-45/mozglue/build/Nuwa.cpp b/src/third_party/mozjs-45/mozglue/build/Nuwa.cpp index 42d9bad..d04628b 100644 --- a/src/third_party/mozjs-45/mozglue/build/Nuwa.cpp +++ b/src/third_party/mozjs-45/mozglue/build/Nuwa.cpp
@@ -1795,7 +1795,7 @@ } else { // in the child sIsNuwaChildProcess = true; - if (getenv("MOZ_DEBUG_CHILD_PROCESS")) { + if (js_sb_getenv("MOZ_DEBUG_CHILD_PROCESS")) { printf("\n\nNUWA CHILDCHILDCHILDCHILD\n debug me @ %d\n\n", getpid()); sleep(30); }
diff --git a/src/third_party/mozjs-45/mozglue/misc/TimeStamp.cpp b/src/third_party/mozjs-45/mozglue/misc/TimeStamp.cpp index 932b75c..3ff4af4 100644 --- a/src/third_party/mozjs-45/mozglue/misc/TimeStamp.cpp +++ b/src/third_party/mozjs-45/mozglue/misc/TimeStamp.cpp
@@ -52,7 +52,7 @@ aIsInconsistent = false; if (sInitOnce.mProcessCreation.IsNull()) { - char* mozAppRestart = getenv("MOZ_APP_RESTART"); + char* mozAppRestart = js_sb_getenv("MOZ_APP_RESTART"); TimeStamp ts; /* When calling PR_SetEnv() with an empty value the existing variable may
diff --git a/src/third_party/mozjs-45/mozglue/misc/TimeStamp_starboard.cpp b/src/third_party/mozjs-45/mozglue/misc/TimeStamp_starboard.cpp new file mode 100644 index 0000000..6a089fd --- /dev/null +++ b/src/third_party/mozjs-45/mozglue/misc/TimeStamp_starboard.cpp
@@ -0,0 +1,145 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// +// Port "TimeStamp_posix.cpp" to starboard. +// + +#include "mozilla/Snprintf.h" +#include "mozilla/TimeStamp.h" + +#include "starboard/time.h" + +// Estimate of the smallest duration of time we can measure. +static uint64_t sResolution; +static uint64_t sResolutionSigDigs; + +static const uint16_t kNsPerUs = 1000; +static const uint64_t kNsPerMs = 1000000; +static const uint64_t kNsPerSec = 1000000000; +static const double kNsPerMsd = 1000000.0; +static const double kNsPerSecd = 1000000000.0; + +static uint64_t +ClockTimeNs() +{ + return SbTimeGetMonotonicNow() * kSbTimeMillisecond; +} + +static uint64_t +ClockResolutionNs() +{ + // NB: why not rely on clock_getres()? Two reasons: (i) it might + // lie, and (ii) it might return an "ideal" resolution that while + // theoretically true, could never be measured in practice. Since + // clock_gettime() likely involves a system call on your platform, + // the "actual" timing resolution shouldn't be lower than syscall + // overhead. + + uint64_t start = ClockTimeNs(); + uint64_t end = ClockTimeNs(); + uint64_t minres = (end - start); + + // 10 total trials is arbitrary: what we're trying to avoid by + // looping is getting unlucky and being interrupted by a context + // switch or signal, or being bitten by paging/cache effects + for (int i = 0; i < 9; ++i) { + start = ClockTimeNs(); + end = ClockTimeNs(); + + uint64_t candidate = (start - end); + if (candidate < minres) { + minres = candidate; + } + } + + if (0 == minres) { + // clock_getres probably failed. fall back on NSPR's resolution + // assumption + minres = 1 * kNsPerMs; + } + + return minres; +} + +namespace mozilla { + +double +BaseTimeDurationPlatformUtils::ToSeconds(int64_t aTicks) +{ + return double(aTicks) / kNsPerSecd; +} + +double +BaseTimeDurationPlatformUtils::ToSecondsSigDigits(int64_t aTicks) +{ + // don't report a value < mResolution ... + int64_t valueSigDigs = sResolution * (aTicks / sResolution); + // and chop off insignificant digits + valueSigDigs = sResolutionSigDigs * (valueSigDigs / sResolutionSigDigs); + return double(valueSigDigs) / kNsPerSecd; +} + +int64_t +BaseTimeDurationPlatformUtils::TicksFromMilliseconds(double aMilliseconds) +{ + double result = aMilliseconds * kNsPerMsd; + if (result > INT64_MAX) { + return INT64_MAX; + } else if (result < INT64_MIN) { + return INT64_MIN; + } + + return result; +} + +int64_t +BaseTimeDurationPlatformUtils::ResolutionInTicks() +{ + return static_cast<int64_t>(sResolution); +} + +static bool gInitialized = false; + +void +TimeStamp::Startup() +{ + if (gInitialized) { + return; + } + + sResolution = ClockResolutionNs(); + + // find the number of significant digits in sResolution, for the + // sake of ToSecondsSigDigits() + for (sResolutionSigDigs = 1; + !(sResolutionSigDigs == sResolution || + 10 * sResolutionSigDigs > sResolution); + sResolutionSigDigs *= 10); + + gInitialized = true; + + return; +} + +void +TimeStamp::Shutdown() +{ +} + +TimeStamp +TimeStamp::Now(bool aHighResolution) +{ + return TimeStamp(ClockTimeNs()); +} + +uint64_t +TimeStamp::ComputeProcessUptime() +{ + return 0; +} + +} // namespace mozilla
diff --git a/src/third_party/mozjs-45/mozjs-45.gyp b/src/third_party/mozjs-45/mozjs-45.gyp index d082045..3b09dfc 100644 --- a/src/third_party/mozjs-45/mozjs-45.gyp +++ b/src/third_party/mozjs-45/mozjs-45.gyp
@@ -17,54 +17,134 @@ ], 'variables': { 'generated_include_directory': '<(SHARED_INTERMEDIATE_DIR)/mozjs-45/include', - }, - 'target_defaults': { + + 'common_cflags': [ + '-include <(DEPTH)/third_party/mozjs-45/cobalt_config/include/js-confdefs.h', + '-Wno-inline-new-delete', + '-Wno-invalid-offsetof', + '-Wno-unused-function', + ], + 'common_defines': [ + # Do not export symbols that are declare with JS_PUBLIC_[API|DATA]. + 'STATIC_JS_API=1', + # Do not use the default js_xxx allocator function implementations, but + # include "jscustomallocator.h", which should implement them. + 'JS_USE_CUSTOM_ALLOCATOR=1', + # See vm/Probes.h for different values. This was the value set by the + # configure script when building for linux-release. + 'JS_DEFAULT_JITREPORT_GRANULARITY=3', + ], + 'common_include_dirs': [ + '<(DEPTH)/third_party/mozjs-45/js/src', + '<(generated_include_directory)', + 'cobalt_config/include', + '<(DEPTH)/third_party/icu/source/common', + ], + 'conditions': [ + ['target_arch == "x86"', { + 'common_defines': [ + 'JS_CPU_X86=1', + 'JS_NUNBOX32=1', + ], + }], ['target_arch == "x64"', { - 'defines': [ - 'JS_CODEGEN_X64=1', + 'common_defines': [ 'JS_CPU_X64=1', 'JS_PUNBOX64=1', ], }], + ['target_arch == "arm"', { + 'common_defines': [ + 'JS_CPU_ARM=1', + 'JS_NUNBOX32=1', + ], + }], + ['target_arch == "arm64"', { + 'common_defines': [ + 'JS_CPU_ARM64=1', + 'JS_PUNBOX64=1', + ], + }], ['target_arch == "mips"', { - 'defines': [ - 'JS_CODEGEN_MIPS32=1', + 'common_defines': [ 'JS_CPU_MIPS=1', 'JS_NUNBOX32=1', ], }], - ['cobalt_config == "debug"', { - 'defines': [ - 'DEBUG', - 'JS_DEBUG', + ['target_arch == "mips64"', { + 'common_defines': [ + 'JS_CPU_MIPS=1', + 'JS_PUNBOX64=1', ], }], + # TODO: Remove once ps4 configuration todos are addressed. + ['target_arch == "ps4" or actual_target_arch == "ps4" or sb_target_platform == "ps4"', { + 'common_defines': [ + 'JS_CPU_X64=1', + 'JS_PUNBOX64=1', + ], + }], + + ['cobalt_enable_jit == 0', { + 'common_defines': [ + 'JS_CODEGEN_NONE=1', + ], + }], + ['target_arch == "x86" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_X86=1', + ], + }], + ['target_arch == "x64" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_X64=1', + ], + }], + ['target_arch == "arm" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_ARM=1', + ], + }], + ['target_arch == "arm64" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_ARM64=1', + ], + }], + ['target_arch == "mips" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_MIPS32=1', + ], + }], + ['target_arch == "mips64" and cobalt_enable_jit == 1', { + 'common_defines': [ + 'JS_CODEGEN_MIPS64=1', + ], + }], + ['cobalt_config != "gold"', { - 'defines': [ + 'common_defines': [ 'JS_TRACE_LOGGING=1', ], }], - ['cobalt_config == "debug" and cobalt_enable_jit == 1', { - 'defines': [ + ['cobalt_config == "debug"', { + 'common_defines': [ 'JS_JITSPEW=1', + 'JS_METHODJIT_SPEW=1', ], - }], - ], - 'defines': [ - 'JS_DEFAULT_JITREPORT_GRANULARITY=3', + }] ], }, + + 'target_defaults': { + 'defines': [ '<@(common_defines)', ], + }, + 'targets': [ { 'target_name': 'mozjs-45_lib', 'type': 'static_library', - 'cflags': [ - '-Wno-invalid-offsetof', - '-Wno-undefined-var-template', - '-Wno-unused-function', - '-include <(DEPTH)/third_party/mozjs-45/cobalt_config/include/js-confdefs.h', - ], + 'cflags': ['<@(common_cflags)'], 'dependencies': [ 'build_include_directory', '<(DEPTH)/starboard/client_porting/pr_starboard/pr_starboard.gyp:pr_starboard', @@ -73,50 +153,41 @@ '<(DEPTH)/third_party/zlib/zlib.gyp:zlib', ], 'direct_dependent_settings': { - 'include_dirs': [ - '<(DEPTH)/third_party/mozjs-45/js/src', - '<(generated_include_directory)', - ], - 'cflags': [ - '-Wno-invalid-offsetof', - '-Wno-undefined-var-template', - '-Wno-unused-function', - '-include <(DEPTH)/third_party/mozjs-45/cobalt_config/include/js-confdefs.h', - ], - 'defines': [ - 'STATIC_JS_API=1', - ], - 'conditions': [ - ['target_arch == "x64"', { - 'defines': [ - 'JS_CODEGEN_X64=1', - 'JS_CPU_X64=1', - 'JS_PUNBOX64=1', - ], - }], - ['target_arch == "mips"', { - 'defines': [ - 'JS_CODEGEN_MIPS32=1', - 'JS_CPU_MIPS=1', - 'JS_NUNBOX32=1', - ], - }], - ['cobalt_config != "gold"', { - 'defines': [ - 'JS_TRACE_LOGGING=1', - ], - }], - ], + 'include_dirs': [ '<@(common_include_dirs)' ], + 'cflags': ['<@(common_cflags)'], + 'defines': ['<@(common_defines)'], }, 'include_dirs': [ '<(DEPTH)/third_party/mozjs-45/js/src', - '<(DEPTH)/third_party/icu/source/common', - '<(generated_include_directory)', + '<@(common_include_dirs)', ], 'sources': [ '<@(mozjs-45_sources)', ], 'conditions': [ + ['target_arch == "x86" and cobalt_enable_jit == 1', { + 'sources': [ + 'js/src/jit/x86-shared/Architecture-x86-shared.cpp', + 'js/src/jit/x86-shared/Assembler-x86-shared.cpp', + 'js/src/jit/x86-shared/AssemblerBuffer-x86-shared.cpp', + 'js/src/jit/x86-shared/BaselineCompiler-x86-shared.cpp', + 'js/src/jit/x86-shared/BaselineIC-x86-shared.cpp', + 'js/src/jit/x86-shared/CodeGenerator-x86-shared.cpp', + 'js/src/jit/x86-shared/Disassembler-x86-shared.cpp', + 'js/src/jit/x86-shared/Lowering-x86-shared.cpp', + 'js/src/jit/x86-shared/MacroAssembler-x86-shared.cpp', + 'js/src/jit/x86-shared/MoveEmitter-x86-shared.cpp', + 'js/src/jit/x86/Assembler-x86.cpp', + 'js/src/jit/x86/Bailouts-x86.cpp', + 'js/src/jit/x86/BaselineCompiler-x86.cpp', + 'js/src/jit/x86/BaselineIC-x86.cpp', + 'js/src/jit/x86/CodeGenerator-x86.cpp', + 'js/src/jit/x86/Lowering-x86.cpp', + 'js/src/jit/x86/MacroAssembler-x86.cpp', + 'js/src/jit/x86/SharedIC-x86.cpp', + 'js/src/jit/x86/Trampoline-x86.cpp', + ], + }], ['target_arch == "x64" and cobalt_enable_jit == 1', { 'sources': [ 'js/src/jit/x64/Assembler-x64.cpp', @@ -138,12 +209,80 @@ 'js/src/jit/x86-shared/Lowering-x86-shared.cpp', 'js/src/jit/x86-shared/MacroAssembler-x86-shared.cpp', 'js/src/jit/x86-shared/MoveEmitter-x86-shared.cpp', - '<@(mozjs-45_jit_sources)', - ], - }, - ], + ], + }], + ['target_arch == "arm" and cobalt_enable_jit == 1', { + 'sources': [ + 'js/src/jit/arm/Architecture-arm.cpp', + 'js/src/jit/arm/Architecture-arm.h', + 'js/src/jit/arm/Assembler-arm.cpp', + 'js/src/jit/arm/Assembler-arm.h', + 'js/src/jit/arm/AtomicOperations-arm.h', + 'js/src/jit/arm/Bailouts-arm.cpp', + 'js/src/jit/arm/BaselineCompiler-arm.cpp', + 'js/src/jit/arm/BaselineCompiler-arm.h', + 'js/src/jit/arm/BaselineIC-arm.cpp', + 'js/src/jit/arm/CodeGenerator-arm.cpp', + 'js/src/jit/arm/CodeGenerator-arm.h', + 'js/src/jit/arm/disasm/Constants-arm.cpp', + 'js/src/jit/arm/disasm/Constants-arm.h', + 'js/src/jit/arm/disasm/Disasm-arm.cpp', + 'js/src/jit/arm/disasm/Disasm-arm.h', + 'js/src/jit/arm/LIR-arm.h', + 'js/src/jit/arm/LOpcodes-arm.h', + 'js/src/jit/arm/Lowering-arm.cpp', + 'js/src/jit/arm/Lowering-arm.h', + 'js/src/jit/arm/MacroAssembler-arm-inl.h', + 'js/src/jit/arm/MacroAssembler-arm.cpp', + 'js/src/jit/arm/MacroAssembler-arm.h', + 'js/src/jit/arm/MoveEmitter-arm.cpp', + 'js/src/jit/arm/MoveEmitter-arm.h', + 'js/src/jit/arm/SharedIC-arm.cpp', + 'js/src/jit/arm/SharedICHelpers-arm.h', + 'js/src/jit/arm/SharedICRegisters-arm.h', + 'js/src/jit/arm/Trampoline-arm.cpp', + ], + }], + ['target_arch == "arm64" and cobalt_enable_jit == 1', { + 'sources': [ + 'js/src/jit/arm64/Architecture-arm64.cpp', + 'js/src/jit/arm64/Architecture-arm64.h', + 'js/src/jit/arm64/Assembler-arm64.cpp', + 'js/src/jit/arm64/Assembler-arm64.h', + 'js/src/jit/arm64/AtomicOperations-arm64.h', + 'js/src/jit/arm64/Bailouts-arm64.cpp', + 'js/src/jit/arm64/BaselineCompiler-arm64.h', + 'js/src/jit/arm64/BaselineIC-arm64.cpp', + 'js/src/jit/arm64/CodeGenerator-arm64.cpp', + 'js/src/jit/arm64/CodeGenerator-arm64.h', + 'js/src/jit/arm64/DoubleEntryTable.tbl', + 'js/src/jit/arm64/gen-double-encoder-table.py', + 'js/src/jit/arm64/LIR-arm64.h', + 'js/src/jit/arm64/LOpcodes-arm64.h', + 'js/src/jit/arm64/Lowering-arm64.cpp', + 'js/src/jit/arm64/Lowering-arm64.h', + 'js/src/jit/arm64/MacroAssembler-arm64-inl.h', + 'js/src/jit/arm64/MacroAssembler-arm64.cpp', + 'js/src/jit/arm64/MacroAssembler-arm64.h', + 'js/src/jit/arm64/MoveEmitter-arm64.cpp', + 'js/src/jit/arm64/MoveEmitter-arm64.h', + 'js/src/jit/arm64/SharedIC-arm64.cpp', + 'js/src/jit/arm64/SharedICHelpers-arm64.h', + 'js/src/jit/arm64/SharedICRegisters-arm64.h', + 'js/src/jit/arm64/Trampoline-arm64.cpp', + ], + }], ['target_arch == "mips" and cobalt_enable_jit == 1', { 'sources': [ + 'js/src/jit/mips-shared/Architecture-mips-shared.cpp', + 'js/src/jit/mips-shared/Assembler-mips-shared.cpp', + 'js/src/jit/mips-shared/Bailouts-mips-shared.cpp', + 'js/src/jit/mips-shared/BaselineCompiler-mips-shared.cpp', + 'js/src/jit/mips-shared/BaselineIC-mips-shared.cpp', + 'js/src/jit/mips-shared/CodeGenerator-mips-shared.cpp', + 'js/src/jit/mips-shared/Lowering-mips-shared.cpp', + 'js/src/jit/mips-shared/MacroAssembler-mips-shared.cpp', + 'js/src/jit/mips-shared/MoveEmitter-mips-shared.cpp', 'js/src/jit/mips32/Architecture-mips32.cpp', 'js/src/jit/mips32/Assembler-mips32.cpp', 'js/src/jit/mips32/Bailouts-mips32.cpp', @@ -155,6 +294,10 @@ 'js/src/jit/mips32/MoveEmitter-mips32.cpp', 'js/src/jit/mips32/SharedIC-mips32.cpp', 'js/src/jit/mips32/Trampoline-mips32.cpp', + ], + }], + ['target_arch == "mips64" and cobalt_enable_jit == 1', { + 'sources': [ 'js/src/jit/mips-shared/Architecture-mips-shared.cpp', 'js/src/jit/mips-shared/Assembler-mips-shared.cpp', 'js/src/jit/mips-shared/Bailouts-mips-shared.cpp', @@ -164,7 +307,22 @@ 'js/src/jit/mips-shared/Lowering-mips-shared.cpp', 'js/src/jit/mips-shared/MacroAssembler-mips-shared.cpp', 'js/src/jit/mips-shared/MoveEmitter-mips-shared.cpp', - '<@(mozjs-45_jit_sources)', + 'js/src/jit/mips64/Architecture-mips64.cpp', + 'js/src/jit/mips64/Assembler-mips64.cpp', + 'js/src/jit/mips64/Bailouts-mips64.cpp', + 'js/src/jit/mips64/BaselineCompiler-mips64.cpp', + 'js/src/jit/mips64/BaselineIC-mips64.cpp', + 'js/src/jit/mips64/CodeGenerator-mips64.cpp', + 'js/src/jit/mips64/Lowering-mips64.cpp', + 'js/src/jit/mips64/MacroAssembler-mips64.cpp', + 'js/src/jit/mips64/MoveEmitter-mips64.cpp', + 'js/src/jit/mips64/SharedIC-mips64.cpp', + 'js/src/jit/mips64/Trampoline-mips64.cpp', + ], + }], + ['cobalt_enable_jit == 0', { + 'sources': [ + 'js/src/jit/none/Trampoline-none.cpp', ], }], ],
diff --git a/src/third_party/mozjs-45/mozjs-45.gypi b/src/third_party/mozjs-45/mozjs-45.gypi index 3ee9045..f3a9b1e 100644 --- a/src/third_party/mozjs-45/mozjs-45.gypi +++ b/src/third_party/mozjs-45/mozjs-45.gypi
@@ -14,6 +14,14 @@ { 'variables': { 'mozjs-45_sources': [ + 'js/src/asmjs/AsmJSFrameIterator.cpp', + 'js/src/asmjs/AsmJSLink.cpp', + 'js/src/asmjs/AsmJSModule.cpp', + 'js/src/asmjs/AsmJSSignalHandlersStarboard.cpp', + 'js/src/asmjs/AsmJSValidate.cpp', + 'js/src/asmjs/WasmGenerator.cpp', + 'js/src/asmjs/WasmIonCompile.cpp', + 'js/src/asmjs/WasmStubs.cpp', 'js/src/builtin/AtomicsObject.cpp', 'js/src/builtin/Eval.cpp', 'js/src/builtin/Intl.cpp', @@ -61,6 +69,68 @@ 'js/src/irregexp/RegExpMacroAssembler.cpp', 'js/src/irregexp/RegExpParser.cpp', 'js/src/irregexp/RegExpStack.cpp', + 'js/src/jit/AliasAnalysis.cpp', + 'js/src/jit/AlignmentMaskAnalysis.cpp', + 'js/src/jit/BacktrackingAllocator.cpp', + 'js/src/jit/Bailouts.cpp', + 'js/src/jit/BaselineBailouts.cpp', + 'js/src/jit/BaselineCompiler.cpp', + 'js/src/jit/BaselineDebugModeOSR.cpp', + 'js/src/jit/BaselineFrame.cpp', + 'js/src/jit/BaselineFrameInfo.cpp', + 'js/src/jit/BaselineIC.cpp', + 'js/src/jit/BaselineInspector.cpp', + 'js/src/jit/BaselineJIT.cpp', + 'js/src/jit/BitSet.cpp', + 'js/src/jit/BytecodeAnalysis.cpp', + 'js/src/jit/C1Spewer.cpp', + 'js/src/jit/CodeGenerator.cpp', + 'js/src/jit/CompileWrappers.cpp', + 'js/src/jit/Disassembler.cpp', + 'js/src/jit/EagerSimdUnbox.cpp', + 'js/src/jit/EdgeCaseAnalysis.cpp', + 'js/src/jit/EffectiveAddressAnalysis.cpp', + 'js/src/jit/ExecutableAllocator.cpp', + 'js/src/jit/ExecutableAllocatorPosix.cpp', + 'js/src/jit/InstructionReordering.cpp', + 'js/src/jit/Ion.cpp', + 'js/src/jit/IonAnalysis.cpp', + 'js/src/jit/IonBuilder.cpp', + 'js/src/jit/IonCaches.cpp', + 'js/src/jit/IonOptimizationLevels.cpp', + 'js/src/jit/JitcodeMap.cpp', + 'js/src/jit/JitFrames.cpp', + 'js/src/jit/JitOptions.cpp', + 'js/src/jit/JitSpewer.cpp', + 'js/src/jit/JSONSpewer.cpp', + 'js/src/jit/LICM.cpp', + 'js/src/jit/LIR.cpp', + 'js/src/jit/LoopUnroller.cpp', + 'js/src/jit/Lowering.cpp', + 'js/src/jit/MacroAssembler.cpp', + 'js/src/jit/MCallOptimize.cpp', + 'js/src/jit/MIR.cpp', + 'js/src/jit/MIRGraph.cpp', + 'js/src/jit/MoveResolver.cpp', + 'js/src/jit/OptimizationTracking.cpp', + 'js/src/jit/PerfSpewer.cpp', + 'js/src/jit/RangeAnalysis.cpp', + 'js/src/jit/Recover.cpp', + 'js/src/jit/RegisterAllocator.cpp', + 'js/src/jit/RematerializedFrame.cpp', + 'js/src/jit/Safepoints.cpp', + 'js/src/jit/ScalarReplacement.cpp', + 'js/src/jit/shared/BaselineCompiler-shared.cpp', + 'js/src/jit/shared/CodeGenerator-shared.cpp', + 'js/src/jit/shared/Lowering-shared.cpp', + 'js/src/jit/SharedIC.cpp', + 'js/src/jit/Sink.cpp', + 'js/src/jit/Snapshots.cpp', + 'js/src/jit/StupidAllocator.cpp', + 'js/src/jit/TypedObjectPrediction.cpp', + 'js/src/jit/TypePolicy.cpp', + 'js/src/jit/ValueNumbering.cpp', + 'js/src/jit/VMFunctions.cpp', 'js/src/jsalloc.cpp', 'js/src/jsapi.cpp', 'js/src/jsarray.cpp', @@ -89,7 +159,7 @@ 'js/src/jswatchpoint.cpp', 'js/src/jsweakmap.cpp', 'js/src/perf/jsperf.cpp', - 'js/src/perf/pm_linux.cpp', + 'js/src/perf/pm_stub.cpp', 'js/src/proxy/BaseProxyHandler.cpp', 'js/src/proxy/CrossCompartmentWrapper.cpp', 'js/src/proxy/DeadObjectProxy.cpp', @@ -157,11 +227,6 @@ 'js/src/vm/Value.cpp', 'js/src/vm/WeakMapPtr.cpp', 'js/src/vm/Xdr.cpp', - 'memory/build/jemalloc_config.cpp', - 'memory/fallible/fallible.cpp', - 'memory/mozalloc/mozalloc.cpp', - 'memory/mozalloc/mozalloc_abort.cpp', - 'memory/mozalloc/mozalloc_oom.cpp', 'mfbt/decimal/Decimal.cpp', 'mfbt/double-conversion/bignum-dtoa.cc', 'mfbt/double-conversion/bignum.cc', @@ -173,84 +238,14 @@ 'mfbt/double-conversion/strtod.cc', 'mfbt/FloatingPoint.cpp', 'mfbt/HashFunctions.cpp', + 'mfbt/TaggedAnonymousMemory.cpp', # Note that this file was renamed from 'mfbt/Compression.cpp'. Some # build systems, e.g. MSVC08, cannot handle several files with the # same basename. 'mfbt/mfbt_Compression.cpp', 'mfbt/unused.cpp', 'mozglue/misc/TimeStamp.cpp', - ], - 'mozjs-45_jit_sources': [ - 'js/src/asmjs/AsmJSFrameIterator.cpp', - 'js/src/asmjs/AsmJSLink.cpp', - 'js/src/asmjs/AsmJSModule.cpp', - 'js/src/asmjs/AsmJSSignalHandlersStarboard.cpp', - 'js/src/asmjs/AsmJSValidate.cpp', - 'js/src/asmjs/WasmGenerator.cpp', - 'js/src/asmjs/WasmIonCompile.cpp', - 'js/src/asmjs/WasmStubs.cpp', - 'js/src/jit/AliasAnalysis.cpp', - 'js/src/jit/AlignmentMaskAnalysis.cpp', - 'js/src/jit/BacktrackingAllocator.cpp', - 'js/src/jit/Bailouts.cpp', - 'js/src/jit/BaselineBailouts.cpp', - 'js/src/jit/BaselineCompiler.cpp', - 'js/src/jit/BaselineDebugModeOSR.cpp', - 'js/src/jit/BaselineFrame.cpp', - 'js/src/jit/BaselineFrameInfo.cpp', - 'js/src/jit/BaselineIC.cpp', - 'js/src/jit/BaselineInspector.cpp', - 'js/src/jit/BaselineJIT.cpp', - 'js/src/jit/BitSet.cpp', - 'js/src/jit/BytecodeAnalysis.cpp', - 'js/src/jit/C1Spewer.cpp', - 'js/src/jit/CodeGenerator.cpp', - 'js/src/jit/CompileWrappers.cpp', - 'js/src/jit/Disassembler.cpp', - 'js/src/jit/EagerSimdUnbox.cpp', - 'js/src/jit/EdgeCaseAnalysis.cpp', - 'js/src/jit/EffectiveAddressAnalysis.cpp', - 'js/src/jit/ExecutableAllocator.cpp', - 'js/src/jit/ExecutableAllocatorPosix.cpp', - 'js/src/jit/InstructionReordering.cpp', - 'js/src/jit/Ion.cpp', - 'js/src/jit/IonAnalysis.cpp', - 'js/src/jit/IonBuilder.cpp', - 'js/src/jit/IonCaches.cpp', - 'js/src/jit/IonOptimizationLevels.cpp', - 'js/src/jit/JitcodeMap.cpp', - 'js/src/jit/JitFrames.cpp', - 'js/src/jit/JitOptions.cpp', - 'js/src/jit/JitSpewer.cpp', - 'js/src/jit/JSONSpewer.cpp', - 'js/src/jit/LICM.cpp', - 'js/src/jit/LIR.cpp', - 'js/src/jit/LoopUnroller.cpp', - 'js/src/jit/Lowering.cpp', - 'js/src/jit/MacroAssembler.cpp', - 'js/src/jit/MCallOptimize.cpp', - 'js/src/jit/MIR.cpp', - 'js/src/jit/MIRGraph.cpp', - 'js/src/jit/MoveResolver.cpp', - 'js/src/jit/OptimizationTracking.cpp', - 'js/src/jit/PerfSpewer.cpp', - 'js/src/jit/RangeAnalysis.cpp', - 'js/src/jit/Recover.cpp', - 'js/src/jit/RegisterAllocator.cpp', - 'js/src/jit/RematerializedFrame.cpp', - 'js/src/jit/Safepoints.cpp', - 'js/src/jit/ScalarReplacement.cpp', - 'js/src/jit/shared/BaselineCompiler-shared.cpp', - 'js/src/jit/shared/CodeGenerator-shared.cpp', - 'js/src/jit/shared/Lowering-shared.cpp', - 'js/src/jit/SharedIC.cpp', - 'js/src/jit/Sink.cpp', - 'js/src/jit/Snapshots.cpp', - 'js/src/jit/StupidAllocator.cpp', - 'js/src/jit/TypedObjectPrediction.cpp', - 'js/src/jit/TypePolicy.cpp', - 'js/src/jit/ValueNumbering.cpp', - 'js/src/jit/VMFunctions.cpp', + 'mozglue/misc/TimeStamp_starboard.cpp', ], }, }
diff --git a/src/third_party/mozjs/cobalt_config/include/jscustomallocator.h b/src/third_party/mozjs/cobalt_config/include/jscustomallocator.h index 34bb062..108d538 100644 --- a/src/third_party/mozjs/cobalt_config/include/jscustomallocator.h +++ b/src/third_party/mozjs/cobalt_config/include/jscustomallocator.h
@@ -22,6 +22,7 @@ #include "nb/memory_scope.h" #include "starboard/memory.h" #include "starboard/string.h" +#include "starboard/types.h" #define JS_OOM_POSSIBLY_FAIL() do {} while(0) #define JS_OOM_POSSIBLY_FAIL_REPORT(cx) do {} while(0)
diff --git a/src/third_party/mozjs/js/public/Utility.h b/src/third_party/mozjs/js/public/Utility.h index dbc5764..c582728 100644 --- a/src/third_party/mozjs/js/public/Utility.h +++ b/src/third_party/mozjs/js/public/Utility.h
@@ -21,6 +21,7 @@ #endif #include "jstypes.h" +#include "js-confdefs.h" #include "js/TemplateLib.h"
diff --git a/src/third_party/mozjs/js/src/gc/Memory.cpp b/src/third_party/mozjs/js/src/gc/Memory.cpp index 9c55ba1..1d62f69 100644 --- a/src/third_party/mozjs/js/src/gc/Memory.cpp +++ b/src/third_party/mozjs/js/src/gc/Memory.cpp
@@ -11,6 +11,10 @@ #include "js/HeapAPI.h" +#if defined(STARBOARD) +#include "starboard/types.h" +#endif + using namespace js; using namespace js::gc;
diff --git a/src/third_party/mozjs/js/src/jsgc.cpp b/src/third_party/mozjs/js/src/jsgc.cpp index 78d3d57..6b1c7e3 100644 --- a/src/third_party/mozjs/js/src/jsgc.cpp +++ b/src/third_party/mozjs/js/src/jsgc.cpp
@@ -75,16 +75,14 @@ #include "gc/FindSCCs-inl.h" #include "vm/String-inl.h" -#ifdef XP_WIN +#if defined(STARBOARD) +#include "starboard/system.h" +#elif defined(XP_WIN) # include "jswin.h" #else # include <unistd.h> #endif -#if defined(STARBOARD) -#include "starboard/system.h" -#endif // defined(STARBOARD) - #if JS_TRACE_LOGGING #include "TraceLogging.h" #endif
diff --git a/src/third_party/mozjs/mfbt/Assertions.h b/src/third_party/mozjs/mfbt/Assertions.h index 003b058..a520892 100644 --- a/src/third_party/mozjs/mfbt/Assertions.h +++ b/src/third_party/mozjs/mfbt/Assertions.h
@@ -18,6 +18,7 @@ #if defined(STARBOARD) #include "starboard/configuration.h" +#include "starboard/system.h" #endif #if defined(STARBOARD) @@ -153,7 +154,13 @@ * in release builds as well as debug builds. But if the failure is one that * should be debugged and fixed, MOZ_ASSERT is generally preferable. */ -#if defined(_MSC_VER) +#if defined(STARBOARD) && (SB_API_VERSION >= 4) +# define MOZ_CRASH() \ + do { \ + *((volatile int*) NULL) = 123; \ + ::SbSystemBreakIntoDebugger(); \ + } while (0) +#elif defined(_MSC_VER) /* * On MSVC use the __debugbreak compiler intrinsic, which produces an inline * (not nested in a system function) breakpoint. This distinctively invokes
diff --git a/src/third_party/mozjs/mfbt/Types.h b/src/third_party/mozjs/mfbt/Types.h index 1ba98e5..0ebd430 100644 --- a/src/third_party/mozjs/mfbt/Types.h +++ b/src/third_party/mozjs/mfbt/Types.h
@@ -43,7 +43,9 @@ * These macros are designed for use by library interfaces -- not for normal * methods or data used cross-file. */ -#if defined(WIN32) || defined(XP_OS2) +#if defined(STARBOARD) +# define MOZ_EXPORT /* nothing */ +#elif defined(WIN32) || defined(XP_OS2) # define MOZ_EXPORT __declspec(dllexport) #else /* Unix */ # ifdef HAVE_VISIBILITY_ATTRIBUTE @@ -63,7 +65,9 @@ * the export or import version of the macro, depending upon the compilation * mode. */ -#ifdef _WIN32 +#if defined(STARBOARD) +# define MOZ_IMPORT_API MOZ_EXPORT +#elif defined(_WIN32) # if defined(__MWERKS__) # define MOZ_IMPORT_API /* nothing */ # else
diff --git a/src/third_party/openssl/openssl_workaround_starboard_dependency.gyp b/src/third_party/openssl/openssl_workaround_starboard_dependency.gyp new file mode 100644 index 0000000..98bf92e --- /dev/null +++ b/src/third_party/openssl/openssl_workaround_starboard_dependency.gyp
@@ -0,0 +1,29 @@ +# Copyright 2017 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +{ + 'targets': [ + # TODO: Eliminate cyclic dependency between Widevine, OpenSSL, and Starboard + # and get rid of this target in favor of 'openssl.gyp:openssl'. + { + 'target_name': 'openssl_workaround_starboard_dependency', + 'type': '<(library)', + 'direct_dependent_settings': { + 'include_dirs': [ + '<(DEPTH)/third_party/openssl/config/starboard', + '<(DEPTH)/third_party/openssl/openssl/include', + ], + }, + }, + ], +}
diff --git a/src/third_party/protobuf/src/google/protobuf/stubs/common.cc b/src/third_party/protobuf/src/google/protobuf/stubs/common.cc index fa68ceb..c54b821 100644 --- a/src/third_party/protobuf/src/google/protobuf/stubs/common.cc +++ b/src/third_party/protobuf/src/google/protobuf/stubs/common.cc
@@ -323,7 +323,38 @@ // =================================================================== // emulates google3/base/mutex.cc -#ifdef _WIN32 +#if defined(STARBOARD) + +struct Mutex::Internal { + SbMutex mutex; +}; + +Mutex::Mutex() : mInternal(new Internal) { + SbMutexCreate(&mInternal->mutex); +} + +Mutex::~Mutex() { + SbMutexDestroy(&mInternal->mutex); + delete mInternal; +} + +void Mutex::Lock() { + if (!SbMutexIsSuccess(SbMutexAcquire(&mInternal->mutex))) { + GOOGLE_LOG(FATAL) << "SbMutexAcquire failed."; + } +} + +void Mutex::Unlock() { + if (!SbMutexRelease(&mInternal->mutex)) { + GOOGLE_LOG(FATAL) << "SbMutexRelease failed."; + } +} + +void Mutex::AssertHeld() { + // Starboard doesn't provide a way to check which thread holds the mutex. +} + +#elif defined(_WIN32) struct Mutex::Internal { CRITICAL_SECTION mutex; @@ -363,37 +394,6 @@ #endif } -#elif defined(STARBOARD) - -struct Mutex::Internal { - SbMutex mutex; -}; - -Mutex::Mutex() : mInternal(new Internal) { - SbMutexCreate(&mInternal->mutex); -} - -Mutex::~Mutex() { - SbMutexDestroy(&mInternal->mutex); - delete mInternal; -} - -void Mutex::Lock() { - if (!SbMutexIsSuccess(SbMutexAcquire(&mInternal->mutex))) { - GOOGLE_LOG(FATAL) << "SbMutexAcquire failed."; - } -} - -void Mutex::Unlock() { - if (!SbMutexRelease(&mInternal->mutex)) { - GOOGLE_LOG(FATAL) << "SbMutexRelease failed."; - } -} - -void Mutex::AssertHeld() { - // Starboard doesn't provide a way to check which thread holds the mutex. -} - #elif defined(HAVE_PTHREAD) struct Mutex::Internal {
diff --git a/src/tools/gyp/pylib/gyp/MSVSVersion.py b/src/tools/gyp/pylib/gyp/MSVSVersion.py index 97caf66..ad05788 100644 --- a/src/tools/gyp/pylib/gyp/MSVSVersion.py +++ b/src/tools/gyp/pylib/gyp/MSVSVersion.py
@@ -197,6 +197,15 @@ if path: path = os.path.normpath(path) versions = { + '2017': VisualStudioVersion('2017', + 'Visual Studio 2017', + solution_version='12.0', + project_version='14.0', + flat_sln=False, + uses_vcxproj=True, + path=path, + sdk_based=sdk_based, + default_toolset='v141'), '2012': VisualStudioVersion('2012', 'Visual Studio 2012', solution_version='12.00', @@ -291,9 +300,19 @@ Where (e) is e for express editions of MSVS and blank otherwise. """ version_to_year = { - '8.0': '2005', '9.0': '2008', '10.0': '2010', '11.0': '2012'} + '8.0': '2005', '9.0': '2008', '10.0': '2010', '11.0': '2012', + '14.0': '2015', '15.0': '2017'} versions = [] for version in versions_to_check: + if version == '15.0': + # Version 15 does not include registry entries. + path = r'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE' + path = _ConvertToCygpath(path) + full_path = os.path.join(path, 'devenv.exe') + if os.path.exists(full_path): + versions.append(_CreateVersion(version_to_year[version], + os.path.join(path, '..', '..'))) + continue # Old method of searching for which VS version is installed # We don't use the 2010-encouraged-way because we also want to get the # path to the binaries, which it doesn't offer. @@ -345,7 +364,7 @@ if version == 'auto': version = os.environ.get('GYP_MSVS_VERSION', 'auto') version_map = { - 'auto': ('10.0', '9.0', '8.0', '11.0'), + 'auto': ('10.0', '9.0', '8.0', '11.0', '12.0'), '2005': ('8.0',), '2005e': ('8.0',), '2008': ('9.0',), @@ -354,7 +373,9 @@ '2010e': ('10.0',), '2012': ('11.0',), '2012e': ('11.0',), + '2017': ('15.0',), } + version = str(version) versions = _DetectVisualStudioVersions(version_map[version], 'e' in version) if not versions:
diff --git a/src/tools/gyp/pylib/gyp/generator/ninja.py b/src/tools/gyp/pylib/gyp/generator/ninja.py index f05c6a9..e4eaa84 100755 --- a/src/tools/gyp/pylib/gyp/generator/ninja.py +++ b/src/tools/gyp/pylib/gyp/generator/ninja.py
@@ -548,9 +548,6 @@ if 'copies' in spec: outputs += self.WriteCopies(spec['copies'], prebuild, mac_bundle_depends) - if 'sources' in spec and self.flavor in ('win', 'xb1'): - outputs += self.WriteWinIdlFiles(spec, prebuild) - stamp = self.WriteCollapsedDependencies('actions_rules_copies', outputs) if self.is_mac_bundle: @@ -1670,7 +1667,6 @@ ar_flags = '' if flavor in ['win', 'xb1']: master_ninja.variable('ld', ld) - master_ninja.variable('idl', 'midl.exe') master_ninja.variable('ar', os.environ.get('AR', 'ar')) master_ninja.variable('rc', 'rc.exe') master_ninja.variable('asm', 'ml.exe') @@ -1800,12 +1796,6 @@ rspfile_content='$defines $includes $cflags $cflags_cc') master_ninja.rule( - 'idl', - description='IDL $in', - command=('%s gyp-win-tool midl-wrapper $arch $outdir ' - '$tlb $h $dlldata $iid $proxy $in ' - '$idlflags' % python_exec)) - master_ninja.rule( 'rc', description='RC $in', # Note: $in must be last otherwise rc.exe complains.
diff --git a/src/tools/gyp/pylib/gyp/msvs_emulation.py b/src/tools/gyp/pylib/gyp/msvs_emulation.py index cf81dc9..ba20472 100755 --- a/src/tools/gyp/pylib/gyp/msvs_emulation.py +++ b/src/tools/gyp/pylib/gyp/msvs_emulation.py
@@ -645,7 +645,7 @@ ('proxy', proxy)] if config.startswith('xb1'): metadata_dir = '"%s%s"' % ('C:\\Program Files (x86)\\Windows Kits\\10\\', - 'UnionMetadata') + 'UnionMetadata') flags = ['/env', 'x64', '/W1', '/char', 'signed', '/enum_class', '/metadata_dir', metadata_dir, '/notlb', '/winrt'] else: @@ -823,18 +823,9 @@ path.""" arch = 'x64' - vs_args = [ - os.path.join( - os.path.dirname(__file__), '..', '..', '..', '..', '..', - 'lbshell', 'build', 'platforms', 'DurangoVars.cmd'), - 'ADK' - ] # Get the dos environment via set: # Use cmd /c to execute under native windows command - args_cmd = 'cmd /c ' - args_set = '\"set\"' - - args = args_cmd + args_set + args = 'set' popen = subprocess.Popen( args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
diff --git a/src/tools/gyp/pylib/gyp/win_tool.py b/src/tools/gyp/pylib/gyp/win_tool.py index be8910b..9477cab 100755 --- a/src/tools/gyp/pylib/gyp/win_tool.py +++ b/src/tools/gyp/pylib/gyp/win_tool.py
@@ -101,22 +101,10 @@ quietable via command line flags. """ env = self._GetEnv(arch) - if 'DURANGOXDK' in env: - # midl seems to want an absolute path here. - outdir = os.path.abspath(outdir) - args = ['midl', '/nologo'] + list(flags) + [ + args = ['midl', '/nologo'] + list(flags) + [ '/out', outdir, '/h', h, idl] - else: - args = ['midl', '/nologo'] + list(flags) + [ - '/out', outdir, - '/tlb', tlb, - '/h', h, - '/dlldata', dlldata, - '/iid', iid, - '/proxy', proxy, - idl] popen = subprocess.Popen(args, shell=True, env=env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out, _ = popen.communicate()