diff --git a/.circleci/config.yml b/.circleci/config.yml index 5609def78ca..0adb441c36e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -550,4 +550,11 @@ jobs: name: Trigger SLA performance tests command: | sha=$(git rev-parse HEAD) - curl --location --request POST 'https://circleci.com/api/v2/project/github/mapbox/mapbox-gl-js-performance-internal/pipeline' --header 'Content-Type: application/json' -u $CIRCLECI_API_TOKEN: -d "{ \"parameters\": { \"setup_sha\": \"$sha\", \"setup_source_branch\": \"internal\" } }" + response_code=$(curl --location --write-out "%{http_code}" --output /dev/stderr --request POST 'https://circleci.com/api/v2/project/github/mapbox/mapbox-gl-js-performance-internal/pipeline' --header 'Content-Type: application/json' -u $CIRCLECI_API_TOKEN: -d "{ \"parameters\": { \"setup_sha\": \"$sha\", \"setup_source_branch\": \"internal\" } }") + + if [[ "$response_code" =~ ^2 ]]; then + echo "Success: HTTP 2xx response" + else + echo "Error: Non-2xx response code - $response_code" + exit 1 + fi \ No newline at end of file diff --git a/3d-style/render/draw_model.js b/3d-style/render/draw_model.js index 7ad796006ec..4b3d2c6fd8b 100644 --- a/3d-style/render/draw_model.js +++ b/3d-style/render/draw_model.js @@ -147,6 +147,8 @@ function drawMesh(sortedMesh: SortedMesh, painter: Painter, layer: ModelStyleLay const normalMatrix = mat4.invert([], lightingMatrix); mat4.transpose(normalMatrix, normalMatrix); + const emissiveStrength = layer.paint.get('model-emissive-strength').constantOr(0.0); + const uniformValues = modelUniformValues( new Float32Array(sortedMesh.worldViewProjection), new Float32Array(lightingMatrix), @@ -158,6 +160,7 @@ function drawMesh(sortedMesh: SortedMesh, painter: Painter, layer: ModelStyleLay pbr.metallicFactor, pbr.roughnessFactor, material, + emissiveStrength, layer); const programOptions: CreateProgramParams = { @@ -604,6 +607,8 @@ function drawInstancedNode(painter: Painter, layer: ModelStyleLayer, node: Node, const pbr = material.pbrMetallicRoughness; const layerOpacity = layer.paint.get('model-opacity'); + const emissiveStrength = layer.paint.get('model-emissive-strength').constantOr(0.0); + uniformValues = modelUniformValues( coord.expandedProjMatrix, Float32Array.from(node.matrix), @@ -615,8 +620,10 @@ function drawInstancedNode(painter: Painter, layer: ModelStyleLayer, node: Node, pbr.metallicFactor, pbr.roughnessFactor, material, + emissiveStrength, layer, - cameraPos); + cameraPos + ); if (shadowRenderer) { if (!renderData.shadowUniformsInitialized) { shadowRenderer.setupShadows(coord.toUnwrapped(), program, 'model-tile', coord.overscaledZ); @@ -814,6 +821,8 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt pbr.metallicFactor = 0.9; pbr.roughnessFactor = 0.5; + // Set emissive strength to zero for landmarks, as it is already used embedded in the PBR buffer. + const emissiveStrength = 0.0; const uniformValues = modelUniformValues( new Float32Array(worldViewProjection), new Float32Array(lightingMatrix), @@ -825,6 +834,7 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt pbr.metallicFactor, pbr.roughnessFactor, material, + emissiveStrength, layer ); diff --git a/3d-style/render/program/model_program.js b/3d-style/render/program/model_program.js index b6d1dbef74a..e33ebe00ed6 100644 --- a/3d-style/render/program/model_program.js +++ b/3d-style/render/program/model_program.js @@ -39,7 +39,8 @@ export type ModelUniformsType = { 'u_occlusionTexture': Uniform1i, 'u_emissionTexture': Uniform1i, 'u_color_mix': Uniform4f, - 'u_aoIntensity': Uniform1f + 'u_aoIntensity': Uniform1f, + 'u_emissive_strength': Uniform1f }; const modelUniforms = (context: Context): ModelUniformsType => ({ @@ -64,7 +65,8 @@ const modelUniforms = (context: Context): ModelUniformsType => ({ 'u_occlusionTexture': new Uniform1i(context), 'u_emissionTexture': new Uniform1i(context), 'u_color_mix': new Uniform4f(context), - 'u_aoIntensity': new Uniform1f(context) + 'u_aoIntensity': new Uniform1f(context), + 'u_emissive_strength' : new Uniform1f(context) }); @@ -79,8 +81,10 @@ const modelUniformValues = ( metallicFactor: number, roughnessFactor: number, material: Material, + emissiveStrength: number, layer: ModelStyleLayer, - cameraPos: [number, number, number] = [0, 0, 0]): UniformValues => { + cameraPos: [number, number, number] = [0, 0, 0] +): UniformValues => { const light = painter.style.light; const _lp = light.properties.get('position'); @@ -96,7 +100,7 @@ const modelUniformValues = ( const lightColor = light.properties.get('color'); - const aoIntensity = layer.paint.get('model-ambient-occlusion-intensity'); + const aoIntensity = layer.paint.get('model-ambient-occlusion-intensity'); const colorMix = layer.paint.get('model-color').constantOr(Color.white); const colorMixIntensity = layer.paint.get('model-color-mix-intensity').constantOr(0.0); @@ -122,7 +126,8 @@ const modelUniformValues = ( 'u_occlusionTexture': TextureSlots.Occlusion, 'u_emissionTexture': TextureSlots.Emission, 'u_color_mix': [colorMix.r, colorMix.g, colorMix.b, colorMixIntensity], - 'u_aoIntensity': aoIntensity + 'u_aoIntensity': aoIntensity, + 'u_emissive_strength': emissiveStrength }; return uniformValues; diff --git a/3d-style/shaders/_prelude_shadow.fragment.glsl b/3d-style/shaders/_prelude_shadow.fragment.glsl index ab4e1078997..617dc89e84b 100644 --- a/3d-style/shaders/_prelude_shadow.fragment.glsl +++ b/3d-style/shaders/_prelude_shadow.fragment.glsl @@ -1,9 +1,5 @@ #ifdef RENDER_SHADOWS -#if defined(NATIVE) && __VERSION__ >= 300 -#define TEXTURE_GATHER -#endif - #ifdef DEPTH_TEXTURE uniform highp sampler2D u_shadowmap_0; uniform highp sampler2D u_shadowmap_1; @@ -23,9 +19,9 @@ uniform highp vec3 u_shadow_bias; highp float shadow_sample_1(highp vec2 uv, highp float compare) { highp float shadow_depth; #ifdef DEPTH_TEXTURE - shadow_depth = texture2D(u_shadowmap_1, uv).r; + shadow_depth = texture(u_shadowmap_1, uv).r; #else - shadow_depth = unpack_depth(texture2D(u_shadowmap_1, uv)) * 0.5 + 0.5; + shadow_depth = unpack_depth(texture(u_shadowmap_1, uv)) * 0.5 + 0.5; #endif return step(shadow_depth, compare); } @@ -33,9 +29,9 @@ highp float shadow_sample_1(highp vec2 uv, highp float compare) { highp float shadow_sample_0(highp vec2 uv, highp float compare) { highp float shadow_depth; #ifdef DEPTH_TEXTURE - shadow_depth = texture2D(u_shadowmap_0, uv).r; + shadow_depth = texture(u_shadowmap_0, uv).r; #else - shadow_depth = unpack_depth(texture2D(u_shadowmap_0, uv)) * 0.5 + 0.5; + shadow_depth = unpack_depth(texture(u_shadowmap_0, uv)) * 0.5 + 0.5; #endif return step(shadow_depth, compare); } @@ -50,7 +46,7 @@ float shadow_occlusion_0(highp vec4 pos, highp float bias) { // Perform percentage-closer filtering with a 2x2 sample grid. // Edge tap smoothing is used to weight each sample based on their contribution in the overall PCF kernel -#ifdef TEXTURE_GATHER +#ifdef NATIVE highp vec2 uv = pos.xy; highp vec4 samples = textureGather(u_shadowmap_0, uv, 0); lowp vec4 stepSamples = step(samples, vec4(compare0)); diff --git a/3d-style/shaders/fill_extrusion_depth.fragment.glsl b/3d-style/shaders/fill_extrusion_depth.fragment.glsl index d34d726eac6..534eff9e3c3 100644 --- a/3d-style/shaders/fill_extrusion_depth.fragment.glsl +++ b/3d-style/shaders/fill_extrusion_depth.fragment.glsl @@ -1,7 +1,7 @@ -varying highp float v_depth; +in highp float v_depth; void main() { #ifndef DEPTH_TEXTURE - gl_FragColor = pack_depth(v_depth); + glFragColor = pack_depth(v_depth); #endif } diff --git a/3d-style/shaders/fill_extrusion_depth.vertex.glsl b/3d-style/shaders/fill_extrusion_depth.vertex.glsl index 33d1b92fd5b..b34e8cd57d1 100644 --- a/3d-style/shaders/fill_extrusion_depth.vertex.glsl +++ b/3d-style/shaders/fill_extrusion_depth.vertex.glsl @@ -4,13 +4,13 @@ uniform mat4 u_matrix; uniform float u_edge_radius; uniform float u_vertical_scale; -attribute vec4 a_pos_normal_ed; -attribute vec2 a_centroid_pos; +in vec4 a_pos_normal_ed; +in vec2 a_centroid_pos; #pragma mapbox: define highp float base #pragma mapbox: define highp float height -varying highp float v_depth; +out highp float v_depth; void main() { #pragma mapbox: initialize highp float base diff --git a/3d-style/shaders/ground_shadow.fragment.glsl b/3d-style/shaders/ground_shadow.fragment.glsl index 162f6b17108..556e827e0fa 100644 --- a/3d-style/shaders/ground_shadow.fragment.glsl +++ b/3d-style/shaders/ground_shadow.fragment.glsl @@ -1,17 +1,15 @@ #include "_prelude_shadow.fragment.glsl" -#ifdef GL_ES precision highp float; -#endif uniform vec3 u_ground_shadow_factor; -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth; +in vec4 v_pos_light_view_0; +in vec4 v_pos_light_view_1; +in float v_depth; #ifdef FOG -varying float v_fog_opacity; +in float v_fog_opacity; #endif void main() { @@ -29,5 +27,5 @@ void main() { shadow = mix(shadow, vec3(1.0), 1.0 - applyCutout(vec4(1.0)).r); #endif - gl_FragColor = vec4(shadow, 1.0); + glFragColor = vec4(shadow, 1.0); } diff --git a/3d-style/shaders/ground_shadow.vertex.glsl b/3d-style/shaders/ground_shadow.vertex.glsl index 2d94dc1fe8d..e4329b7e7ee 100644 --- a/3d-style/shaders/ground_shadow.vertex.glsl +++ b/3d-style/shaders/ground_shadow.vertex.glsl @@ -4,14 +4,14 @@ uniform mat4 u_matrix; uniform mat4 u_light_matrix_0; uniform mat4 u_light_matrix_1; -attribute vec2 a_pos; +in vec2 a_pos; -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth; +out vec4 v_pos_light_view_0; +out vec4 v_pos_light_view_1; +out float v_depth; #ifdef FOG -varying float v_fog_opacity; +out float v_fog_opacity; #endif void main() { diff --git a/3d-style/shaders/model.fragment.glsl b/3d-style/shaders/model.fragment.glsl index 3d53dc36f0b..8faa1ab6fea 100644 --- a/3d-style/shaders/model.fragment.glsl +++ b/3d-style/shaders/model.fragment.glsl @@ -15,13 +15,13 @@ uniform float u_roughnessFactor; uniform float u_emissive_strength; -varying highp vec4 v_position_height; -varying lowp vec4 v_color_mix; +in highp vec4 v_position_height; +in lowp vec4 v_color_mix; #ifdef RENDER_SHADOWS -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth_shadows; +in vec4 v_pos_light_view_0; +in vec4 v_pos_light_view_1; +in float v_depth_shadows; #endif #pragma mapbox: define-attribute highp vec3 normal_3f @@ -35,8 +35,8 @@ varying float v_depth_shadows; #pragma mapbox: initialize-attribute highp vec2 uv_2f #ifdef HAS_ATTRIBUTE_a_pbr -varying lowp vec4 v_roughness_metallic_emissive_alpha; -varying mediump vec4 v_height_based_emission_params; +in lowp vec4 v_roughness_metallic_emissive_alpha; +in mediump vec4 v_height_based_emission_params; #endif #ifdef HAS_TEXTURE_u_baseColorTexture @@ -61,22 +61,27 @@ uniform sampler2D u_emissionTexture; #endif #ifdef TERRAIN_FRAGMENT_OCCLUSION -varying highp float v_depth; +in highp float v_depth; uniform sampler2D u_depthTexture; uniform vec2 u_inv_depth_size; bool isOccluded() { vec2 coord = gl_FragCoord.xy * u_inv_depth_size; - highp float depth = unpack_depth(texture2D(u_depthTexture, coord)); + highp float depth = unpack_depth(texture(u_depthTexture, coord)); // Add some marging to avoid depth precision issues return v_depth > depth + 0.0005; } #endif -const float M_PI = 3.141592653589793; - #define saturate(_x) clamp(_x, 0., 1.) +// linear to sRGB approximation +vec3 linearTosRGB(vec3 color) { + return pow(color, vec3(1./2.2)); +} +vec3 sRGBToLinear(vec3 srgbIn) { + return pow(srgbIn, vec3(2.2)); +} float calculate_NdotL(vec3 normal, vec3 lightDir) { // Use slightly modified dot product for lambertian diffuse shading. This increase the range of NdotL to cover surfaces facing up to 45 degrees away from the light source. @@ -125,7 +130,7 @@ vec4 getBaseColor() { // texture Color #if defined (HAS_TEXTURE_u_baseColorTexture) && defined (HAS_ATTRIBUTE_a_uv_2f) - vec4 texColor = texture2D(u_baseColorTexture, uv_2f); + vec4 texColor = texture(u_baseColorTexture, uv_2f); if(u_alphaMask) { if (texColor.w < u_alphaCutoff) { discard; @@ -198,7 +203,7 @@ highp vec3 getNormal(){ #if defined(HAS_TEXTURE_u_normalTexture) && defined(HAS_ATTRIBUTE_a_uv_2f) // Perturb normal - vec3 nMap = texture2D( u_normalTexture, uv_2f).xyz; + vec3 nMap = texture( u_normalTexture, uv_2f).xyz; nMap = normalize(2.0* nMap - vec3(1.0)); highp vec3 v = normalize(-v_position_height.xyz); highp mat3 TBN = cotangentFrame(n, v, uv_2f); @@ -230,7 +235,7 @@ Material getPBRMaterial() { mat.baseColor.w *= v_roughness_metallic_emissive_alpha.w; #endif #if defined(HAS_TEXTURE_u_metallicRoughnessTexture) && defined(HAS_ATTRIBUTE_a_uv_2f) - vec4 mrSample = texture2D(u_metallicRoughnessTexture, uv_2f); + vec4 mrSample = texture(u_metallicRoughnessTexture, uv_2f); mat.perceptualRoughness *= mrSample.g; mat.metallic *= mrSample.b; #endif @@ -294,7 +299,7 @@ float D_GGX(highp float NdotH, float alphaRoughness) { highp float a4 = alphaRoughness * alphaRoughness; highp float f = (NdotH * a4 -NdotH) * NdotH + 1.0; - return a4 / (M_PI * f * f); + return a4 / (PI * f * f); } // Disney Implementation of diffuse from Physically-Based Shading at Disney by Brent Burley. See Section 5.3. @@ -303,7 +308,7 @@ vec3 diffuseBurley(Material mat, float LdotH, float NdotL, float NdotV) { float f90 = 2.0 * LdotH * LdotH * mat.alphaRoughness - 0.5; - return (mat.diffuseColor / M_PI) * (1.0 + f90 * pow((1.0 - NdotL), 5.0)) * (1.0 + f90 * pow((1.0 - NdotV), 5.0)); + return (mat.diffuseColor / PI) * (1.0 + f90 * pow((1.0 - NdotL), 5.0)) * (1.0 + f90 * pow((1.0 - NdotV), 5.0)); } vec3 diffuseLambertian(Material mat) @@ -313,7 +318,7 @@ vec3 diffuseLambertian(Material mat) // remove the PI division to achieve more integrated colors return mat.diffuseColor; #else - return mat.diffuseColor / M_PI; + return mat.diffuseColor / PI; #endif } @@ -429,7 +434,7 @@ vec4 finalColor; // For b3dm tiles where models contains occlusion textures we interpret them similarly to how // we handle baseColorTexture as an alpha mask (i.e one channel). // This is why we read the alpha component here (refer to getBaseColor to see how baseColorTexture.w is used to implement alpha masking). - float ao = (texture2D(u_occlusionTexture, uv_2f).r - 1.0) * u_aoIntensity + 1.0; + float ao = (texture(u_occlusionTexture, uv_2f).r - 1.0) * u_aoIntensity + 1.0; diffuse *= ao; #endif finalColor = vec4(diffuse, 1.0) * u_opacity; @@ -440,14 +445,14 @@ vec4 finalColor; // Ambient Occlusion float ao = 1.0; #if defined (HAS_TEXTURE_u_occlusionTexture) && defined(HAS_ATTRIBUTE_a_uv_2f) - ao = (texture2D(u_occlusionTexture, uv_2f).x - 1.0) * u_aoIntensity + 1.0; + ao = (texture(u_occlusionTexture, uv_2f).x - 1.0) * u_aoIntensity + 1.0; color *= ao; #endif // Emission vec4 emissive = u_emissiveFactor; #if defined(HAS_TEXTURE_u_emissionTexture) && defined(HAS_ATTRIBUTE_a_uv_2f) - emissive.rgb *= sRGBToLinear(texture2D(u_emissionTexture, uv_2f).rgb); + emissive.rgb *= sRGBToLinear(texture(u_emissionTexture, uv_2f).rgb); #endif color += emissive.rgb; @@ -488,10 +493,10 @@ vec4 finalColor; finalColor = applyCutout(finalColor); #endif - gl_FragColor = finalColor; + glFragColor = finalColor; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/3d-style/shaders/model.vertex.glsl b/3d-style/shaders/model.vertex.glsl index 5cd221b217a..4b2b34a1759 100644 --- a/3d-style/shaders/model.vertex.glsl +++ b/3d-style/shaders/model.vertex.glsl @@ -1,7 +1,7 @@ #include "_prelude_fog.vertex.glsl" #include "_prelude_shadow.vertex.glsl" -attribute vec3 a_pos_3f; +in vec3 a_pos_3f; #pragma mapbox: define-attribute highp vec3 normal_3f #pragma mapbox: define-attribute highp vec2 uv_2f @@ -27,10 +27,10 @@ uniform vec3 u_camera_pos; uniform vec4 u_color_mix; #ifdef INSTANCED_ARRAYS -attribute vec4 a_normal_matrix0; -attribute vec4 a_normal_matrix1; -attribute vec4 a_normal_matrix2; -attribute vec4 a_normal_matrix3; +in vec4 a_normal_matrix0; +in vec4 a_normal_matrix1; +in vec4 a_normal_matrix2; +in vec4 a_normal_matrix3; #else uniform highp mat4 u_normal_matrix; #endif @@ -38,27 +38,32 @@ uniform highp mat4 u_normal_matrix; #ifdef RENDER_SHADOWS uniform mat4 u_light_matrix_0; uniform mat4 u_light_matrix_1; -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth_shadows; +out vec4 v_pos_light_view_0; +out vec4 v_pos_light_view_1; +out float v_depth_shadows; #endif -varying vec4 v_position_height; -varying lowp vec4 v_color_mix; +out vec4 v_position_height; +out lowp vec4 v_color_mix; #ifdef TERRAIN_FRAGMENT_OCCLUSION -varying highp float v_depth; +out highp float v_depth; #endif #ifdef HAS_ATTRIBUTE_a_pbr -varying lowp vec4 v_roughness_metallic_emissive_alpha; -varying mediump vec4 v_height_based_emission_params; +out lowp vec4 v_roughness_metallic_emissive_alpha; +out mediump vec4 v_height_based_emission_params; // .x - height-based interpolation factor // .y - interpolation power // .z - min value // .w - max - min #endif +// sRGB to linear approximation +vec3 sRGBToLinear(vec3 srgbIn) { + return pow(srgbIn, vec3(2.2)); +} + void main() { #pragma mapbox: initialize-attribute highp vec3 normal_3f #pragma mapbox: initialize-attribute highp vec2 uv_2f diff --git a/3d-style/shaders/model_depth.fragment.glsl b/3d-style/shaders/model_depth.fragment.glsl index d34d726eac6..534eff9e3c3 100644 --- a/3d-style/shaders/model_depth.fragment.glsl +++ b/3d-style/shaders/model_depth.fragment.glsl @@ -1,7 +1,7 @@ -varying highp float v_depth; +in highp float v_depth; void main() { #ifndef DEPTH_TEXTURE - gl_FragColor = pack_depth(v_depth); + glFragColor = pack_depth(v_depth); #endif } diff --git a/3d-style/shaders/model_depth.vertex.glsl b/3d-style/shaders/model_depth.vertex.glsl index b516f2fe0ac..4f7cf996bc9 100644 --- a/3d-style/shaders/model_depth.vertex.glsl +++ b/3d-style/shaders/model_depth.vertex.glsl @@ -1,14 +1,14 @@ -attribute vec3 a_pos_3f; +in vec3 a_pos_3f; uniform mat4 u_matrix; -varying highp float v_depth; +out highp float v_depth; #ifdef MODEL_POSITION_ON_GPU #ifdef INSTANCED_ARRAYS -attribute vec4 a_normal_matrix0; -attribute vec4 a_normal_matrix1; -attribute vec4 a_normal_matrix2; -attribute vec4 a_normal_matrix3; +in vec4 a_normal_matrix0; +in vec4 a_normal_matrix1; +in vec4 a_normal_matrix2; +in vec4 a_normal_matrix3; #else uniform highp mat4 u_instance; #endif diff --git a/3d-style/style/lights.js b/3d-style/style/lights.js index 7bb9e9cb74c..0694de5e808 100644 --- a/3d-style/style/lights.js +++ b/3d-style/style/lights.js @@ -1,10 +1,10 @@ // @flow -import type {LightsSpecification} from '../../src/style-spec/types.js'; -import type {Expression} from '../../src/style-spec/expression/expression.js'; import {Evented} from '../../src/util/evented.js'; import {Properties, Transitionable, Transitioning, PossiblyEvaluated} from '../../src/style/properties.js'; -import type {TransitionParameters} from '../../src/style/properties.js'; + +import type {LightsSpecification} from '../../src/style-spec/types.js'; +import type {TransitionParameters, ConfigOptions} from '../../src/style/properties.js'; import type EvaluationParameters from '../../src/style/evaluation_parameters.js'; class Lights extends Evented { @@ -14,7 +14,7 @@ class Lights extends Evented { _transitioning: Transitioning

; _options: LightsSpecification; - constructor(options: LightsSpecification, properties: Properties

, scope: string, configOptions?: ?Map) { + constructor(options: LightsSpecification, properties: Properties

, scope: string, configOptions?: ?ConfigOptions) { super(); this.scope = scope; this._options = options; @@ -25,7 +25,7 @@ class Lights extends Evented { this._transitioning = this._transitionable.untransitioned(); } - updateConfig(configOptions?: ?Map) { + updateConfig(configOptions?: ?ConfigOptions) { this._transitionable.setTransitionOrValue(this._options.properties, new Map(configOptions)); } @@ -46,7 +46,7 @@ class Lights extends Evented { return this._options; } - set(options: LightsSpecification, configOptions?: ?Map) { + set(options: LightsSpecification, configOptions?: ?ConfigOptions) { this._options = options; this._transitionable.setTransitionOrValue(options.properties, configOptions); } diff --git a/3d-style/style/style_layer/model_style_layer.js b/3d-style/style/style_layer/model_style_layer.js index 92bf7e5d375..4d10d1abb10 100644 --- a/3d-style/style/style_layer/model_style_layer.js +++ b/3d-style/style/style_layer/model_style_layer.js @@ -4,19 +4,20 @@ import StyleLayer from '../../../src/style/style_layer.js'; import ModelBucket from '../../data/bucket/model_bucket.js'; import type {LayerSpecification} from '../../../src/style-spec/types.js'; import properties from './model_style_layer_properties.js'; -import type {PaintProps, LayoutProps} from './model_style_layer_properties.js'; -import type {BucketParameters} from '../../../src/data/bucket.js'; import {Transitionable, Transitioning, PossiblyEvaluated, PropertyValue} from '../../../src/style/properties.js'; -import type {Expression} from '../../../src/style-spec/expression/expression.js'; import {ZoomDependentExpression} from '../../../src/style-spec/expression/index.js'; +import type {PaintProps, LayoutProps} from './model_style_layer_properties.js'; +import type {BucketParameters} from '../../../src/data/bucket.js'; +import type {ConfigOptions} from '../../../src/style/properties.js'; + class ModelStyleLayer extends StyleLayer { _transitionablePaint: Transitionable; _transitioningPaint: Transitioning; paint: PossiblyEvaluated; layout: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/CHANGELOG.md b/CHANGELOG.md index ac5cb18bf33..a43630f0d52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 3.1.0-beta.1 +## 3.1.0 ### Features and improvements ✨ @@ -8,6 +8,9 @@ - Add `Map` `getConfigProperty` method for getting current style config values. - Add `config` support in terrain options. - Improve performance for pitched views with many fill extrusions on higher zoom levels. +- Allow turning off the terrain that is defined in the imports on the root-level Style by setting it to `null`. +- Allow the partial terrain exaggeration update without specifying the source. +- Respect style schema restrictions (`minValue`, `maxValue`, `stepValue`, `values`, `type`) when evaluating config options. ### Bug fixes 🐞 @@ -24,6 +27,11 @@ - Fix an issue with tiles sometimes missing in terrain mode on views from a hill down on a valley. - Fix compact attribution style when using global CSS that sets `box-sizing: border-box`. (h/t [@simondriesen](https://github.com/simondriesen)) [#12982](https://github.com/mapbox/mapbox-gl-js/pull/12982) - Remove redundant `aria-label` attribute in attribution control that fails accessibility conformance. (h/t [@maggiewachs](https://github.com/maggiewachs)) [#12981](https://github.com/mapbox/mapbox-gl-js/pull/12981) +- Disable terrain and hillshade when browser fingerprinting protection (e.g. in private browsing mode) prevents it from rendering correctly. +- Fix layer rendering when import requests are failing. +- Fix map `load` event not firing for the sources whose tiles are 404s. +- Require either `url` or `tiles` for tiled sources during validation. +- Validate for empty layer and source IDs in runtime. ## 3.0.1 diff --git a/build/generate-flow-typed-style-spec.js b/build/generate-flow-typed-style-spec.js index d7d9aee6a91..3018392f460 100644 --- a/build/generate-flow-typed-style-spec.js +++ b/build/generate-flow-typed-style-spec.js @@ -1,9 +1,7 @@ - import fs from 'fs'; -import path from 'path'; -import {supportsPropertyExpression, supportsZoomExpression} from '../src/style-spec/util/properties.js'; -import spec from '../src/style-spec/reference/v8.json'; import assert from 'assert'; +import spec from '../src/style-spec/reference/v8.json'; +import {supportsPropertyExpression, supportsZoomExpression} from '../src/style-spec/util/properties.js'; function flowEnum(values) { if (Array.isArray(values)) { @@ -61,7 +59,7 @@ function flowProperty(key, property) { if (key === '*') { return `[_: string]: ${flowType(property)}`; } else { - return `"${key}"${property.required ? '' : '?'}: ${flowType(property)}`; + return `"${key}"${property.required ? '' : '?'}: ${property['optional'] ? '?' : ''}${flowType(property)}`; } } @@ -75,7 +73,7 @@ function flowObject(properties, indent, sealing = '') { ${Object.keys(properties) .map(k => ` ${indent}${flowProperty(k, properties[k])}`) .join(',\n')} -${indent}${sealing}}` +${indent}${sealing}}`; } function flowSourceTypeName(key) { @@ -143,7 +141,7 @@ function flowLight(key) { type: 'enum', values: [key], required: true - } + }; light.properties.type = () => { return flowObject(spec[`properties_light_${key}`], ' ', '|'); diff --git a/buildspec.yml b/buildspec.yml index ffedd424805..936033074d4 100644 --- a/buildspec.yml +++ b/buildspec.yml @@ -3,11 +3,10 @@ version: 0.2 phases: install: runtime-versions: - nodejs: 14 + nodejs: 18 commands: - echo "//registry.npmjs.org/:_authToken=$NPMAccessToken" > ~/.npmrc - npm whoami - - npm set unsafe-perm true - npm install -g yarn - yarn --ignore-engines build: diff --git a/flow-typed/sinon.js b/flow-typed/sinon.js index be0350bd521..9e90bea602a 100644 --- a/flow-typed/sinon.js +++ b/flow-typed/sinon.js @@ -9,6 +9,7 @@ declare module "sinon" { getCall(i: number): SpyCall }; declare type Stub = { + returns(fn: mixed): Spy, callsFake(fn: mixed): Spy }; declare class FakeServer { diff --git a/package.json b/package.json index 6f757cdae35..0f15bb0992d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mapbox-gl", "description": "A WebGL interactive maps library", - "version": "3.1.0-beta.1", + "version": "3.1.0", "main": "dist/mapbox-gl.js", "style": "dist/mapbox-gl.css", "license": "SEE LICENSE IN LICENSE.txt", @@ -52,7 +52,7 @@ "chalk": "^5.0.1", "chokidar": "^3.5.3", "cross-env": "^7.0.3", - "cssnano": "^6.0.2", + "cssnano": "^6.0.3", "d3-queue": "^3.0.7", "diff": "^5.1.0", "ejs": "^3.1.8", @@ -62,7 +62,7 @@ "eslint-plugin-flowtype": "^7.0.0", "eslint-plugin-html": "^7.1.0", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^47.0.2", + "eslint-plugin-jsdoc": "^48.0.2", "flow-bin": "0.191.0", "gl": "6.0.2", "glob": "^10.3.10", @@ -78,11 +78,11 @@ "npm-run-all": "^4.1.5", "nyc": "^15.1.0", "pixelmatch": "^5.3.0", - "postcss": "^8.4.32", + "postcss": "^8.4.33", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", - "puppeteer-core": "^21.6.1", + "puppeteer-core": "^21.7.0", "qrcode-terminal": "^0.12.0", "rollup": "3.29.4", "rollup-plugin-sourcemaps": "^0.6.3", @@ -95,7 +95,7 @@ "stylelint": "^15.11.0", "stylelint-config-standard": "^34.0.0", "tap": "~16.3.10", - "tape": "^5.7.2", + "tape": "^5.7.3", "tape-filter": "^1.0.4", "testem": "^3.11.0" }, diff --git a/src/render/draw_fill_extrusion.js b/src/render/draw_fill_extrusion.js index 886f8f78248..f5b4a0a0564 100644 --- a/src/render/draw_fill_extrusion.js +++ b/src/render/draw_fill_extrusion.js @@ -325,11 +325,7 @@ function drawExtrusionTiles(painter: Painter, source: SourceCache, layer: FillEx if (painter.terrain) { const terrain = painter.terrain; - if (painter.style.terrainSetForDrapingOnly()) { - terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); - } else { - terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); - } + terrain.setupElevationDraw(tile, program, {useMeterToDem: true}); } if (!bucket.centroidVertexBuffer) { diff --git a/src/render/draw_hillshade.js b/src/render/draw_hillshade.js index a4c3c526040..1248d0a8412 100644 --- a/src/render/draw_hillshade.js +++ b/src/render/draw_hillshade.js @@ -23,6 +23,7 @@ export default drawHillshade; function drawHillshade(painter: Painter, sourceCache: SourceCache, layer: HillshadeStyleLayer, tileIDs: Array) { if (painter.renderPass !== 'offscreen' && painter.renderPass !== 'translucent') return; + if (painter.style.disableElevatedTerrain) return; const context = painter.context; diff --git a/src/render/draw_symbol.js b/src/render/draw_symbol.js index a3377098d98..73246e556dc 100644 --- a/src/render/draw_symbol.js +++ b/src/render/draw_symbol.js @@ -87,6 +87,7 @@ function drawSymbols(painter: Painter, sourceCache: SourceCache, layer: SymbolSt layer.layout.get('icon-rotation-alignment'), layer.layout.get('icon-pitch-alignment'), layer.layout.get('icon-keep-upright'), + layer.paint.get('icon-color-saturation'), stencilMode, colorMode ); } @@ -98,6 +99,7 @@ function drawSymbols(painter: Painter, sourceCache: SourceCache, layer: SymbolSt layer.layout.get('text-rotation-alignment'), layer.layout.get('text-pitch-alignment'), layer.layout.get('text-keep-upright'), + layer.paint.get('icon-color-saturation'), stencilMode, colorMode ); } @@ -268,7 +270,7 @@ function getSymbolProgramName(isSDF: boolean, isText: boolean, bucket: SymbolBuc } } -function drawLayerSymbols(painter: Painter, sourceCache: SourceCache, layer: SymbolStyleLayer, coords: Array, isText: boolean, translate: [number, number], translateAnchor: 'map' | 'viewport', rotationAlignment: Alignment, pitchAlignment: Alignment, keepUpright: boolean, stencilMode: StencilMode, colorMode: ColorMode) { +function drawLayerSymbols(painter: Painter, sourceCache: SourceCache, layer: SymbolStyleLayer, coords: Array, isText: boolean, translate: [number, number], translateAnchor: 'map' | 'viewport', rotationAlignment: Alignment, pitchAlignment: Alignment, keepUpright: boolean, iconSaturation: number, stencilMode: StencilMode, colorMode: ColorMode) { const context = painter.context; const gl = context.gl; const tr = painter.transform; @@ -410,8 +412,11 @@ function drawLayerSymbols(painter: Painter, sourceCache: SourceCache, layer: Sym matrix, uLabelPlaneMatrix, uglCoordMatrix, texSize, texSizeIcon, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection()); } } else { + if (iconSaturation < 1) { + baseDefines.push('SATURATION'); + } uniformValues = symbolIconUniformValues(sizeData.kind, size, rotateInShader, pitchWithMap, painter, matrix, - uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection(), transitionProgress); + uLabelPlaneMatrix, uglCoordMatrix, isText, texSize, coord, globeToMercator, mercatorCenter, invMatrix, cameraUpVector, bucket.getProjection(), iconSaturation, transitionProgress); } const program = painter.getOrCreateProgram(getSymbolProgramName(isSDF, isText, bucket), {config: programConfiguration, defines: baseDefines}); diff --git a/src/render/painter.js b/src/render/painter.js index 5c62d90d217..b02d0db7da4 100644 --- a/src/render/painter.js +++ b/src/render/painter.js @@ -242,6 +242,7 @@ class Painter { updateTerrain(style: Style, adaptCameraAltitude: boolean) { const enabled = !!style && !!style.terrain && this.transform.projection.supportsTerrain; if (!enabled && (!this._terrain || !this._terrain.enabled)) return; + if (!this._terrain) { this._terrain = new Terrain(this, style); } diff --git a/src/render/program.js b/src/render/program.js index da9baec6f47..f276e804fba 100644 --- a/src/render/program.js +++ b/src/render/program.js @@ -49,17 +49,6 @@ type ShaderSource = { fragmentIncludes: Array }; -function getTokenizedAttributes(array: Array): Array { - const result = []; - - for (let i = 0; i < array.length; i++) { - if (array[i] === null) continue; - const token = array[i].split(' '); - result.push(token.pop()); - } - return result; -} - const debugWireframe2DLayerProgramNames = [ 'fill', 'fillOutline', 'fillPattern', 'line', 'linePattern', @@ -114,9 +103,8 @@ class Program { this.name = name; this.fixedDefines = [...fixedDefines]; - const staticAttrInfo = getTokenizedAttributes(source.staticAttributes); const dynamicAttrInfo = configuration ? configuration.getBinderAttributes() : []; - const allAttrInfo = staticAttrInfo.concat(dynamicAttrInfo); + const allAttrInfo = (source.staticAttributes || []).concat(dynamicAttrInfo); let defines = configuration ? configuration.defines() : []; defines = defines.concat(fixedDefines.map((define) => `#define ${define}`)); diff --git a/src/render/program/symbol_program.js b/src/render/program/symbol_program.js index 420e1131f54..d969ae87a5e 100644 --- a/src/render/program/symbol_program.js +++ b/src/render/program/symbol_program.js @@ -43,7 +43,8 @@ export type SymbolIconUniformsType = {| 'u_up_vector': Uniform3f, 'u_ecef_origin': Uniform3f, 'u_texture': Uniform1i, - 'u_icon_transition': Uniform1f + 'u_icon_transition': Uniform1f, + 'u_icon_saturation': Uniform1f |}; export type SymbolSDFUniformsType = {| @@ -124,7 +125,8 @@ const symbolIconUniforms = (context: Context): SymbolIconUniformsType => ({ 'u_up_vector': new Uniform3f(context), 'u_ecef_origin': new Uniform3f(context), 'u_texture': new Uniform1i(context), - 'u_icon_transition': new Uniform1f(context) + 'u_icon_transition': new Uniform1f(context), + 'u_icon_saturation': new Uniform1f(context) }); const symbolSDFUniforms = (context: Context): SymbolSDFUniformsType => ({ @@ -198,7 +200,8 @@ const symbolIconUniformValues = ( invMatrix: Float32Array, upVector: [number, number, number], projection: Projection, - transition: ?number + iconSaturation: number, + transition: ?number, ): UniformValues => { const transform = painter.transform; @@ -226,7 +229,8 @@ const symbolIconUniformValues = ( 'u_ecef_origin': [0, 0, 0], 'u_tile_matrix': identityMatrix, 'u_up_vector': [0, -1, 0], - 'u_icon_transition': transition ? transition : 0.0 + 'u_icon_transition': transition ? transition : 0.0, + 'u_icon_saturation': iconSaturation }; if (projection.name === 'globe') { @@ -264,7 +268,7 @@ const symbolSDFUniformValues = ( ): UniformValues => { return extend(symbolIconUniformValues(functionType, size, rotateInShader, pitchWithMap, painter, matrix, labelPlaneMatrix, glCoordMatrix, isText, - texSize, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection), { + texSize, coord, zoomTransition, mercatorCenter, invMatrix, upVector, projection, 1), { 'u_gamma_scale': pitchWithMap ? painter.transform.getCameraToCenterDistance(projection) * Math.cos(painter.terrain ? 0 : painter.transform._pitch) : 1, 'u_device_pixel_ratio': browser.devicePixelRatio, 'u_is_halo': +isHalo, diff --git a/src/shaders/_prelude.fragment.glsl b/src/shaders/_prelude.fragment.glsl index 61cab6d6921..b8095644e11 100644 --- a/src/shaders/_prelude.fragment.glsl +++ b/src/shaders/_prelude.fragment.glsl @@ -1,23 +1,6 @@ // NOTE: This prelude is injected in the fragment shader only -#if __VERSION__ >= 300 -#define varying in -#define gl_FragColor glFragColor -#define texture2D texture -#define textureCube texture out vec4 glFragColor; -#endif - -highp vec3 hash(highp vec2 p) { - highp vec3 p3 = fract(p.xyx * vec3(443.8975, 397.2973, 491.1871)); - p3 += dot(p3, p3.yxz + 19.19); - return fract((p3.xxy + p3.yzz) * p3.zyx); -} - -vec3 dither(vec3 color, highp vec2 seed) { - vec3 rnd = hash(seed) + hash(seed + 0.59374) - 0.5; - return color + rnd / 255.0; -} highp float unpack_depth(highp vec4 rgba_depth) { @@ -56,7 +39,16 @@ vec4 applyCutout(vec4 color) { #endif } +#ifdef DEBUG_WIREFRAME + // Debug wireframe uses premultiplied alpha blending (alpha channel is left unchanged) + #define HANDLE_WIREFRAME_DEBUG \ + glFragColor = vec4(0.7, 0.0, 0.0, 0.7); \ + gl_FragDepth = gl_FragCoord.z - 0.0001; // Apply depth for wireframe overlay to reduce z-fighting +#else + #define HANDLE_WIREFRAME_DEBUG +#endif + #ifdef RENDER_CUTOFF uniform highp vec4 u_cutoff_params; -varying float v_cutoff_opacity; -#endif \ No newline at end of file +in float v_cutoff_opacity; +#endif diff --git a/src/shaders/_prelude.glsl b/src/shaders/_prelude.glsl index 4357d97b236..cbc468c4696 100644 --- a/src/shaders/_prelude.glsl +++ b/src/shaders/_prelude.glsl @@ -4,46 +4,6 @@ #define EPSILON 0.0000001 #define PI 3.141592653589793 -#define EXTENT 8192.0 -#define HALF_PI PI / 2.0 -#define QUARTER_PI PI / 4.0 -#define RAD_TO_DEG 180.0 / PI -#define DEG_TO_RAD PI / 180.0 -#define GLOBE_RADIUS EXTENT / PI / 2.0 - -// linear to sRGB approximation -vec3 linearTosRGB(vec3 color) -{ - return pow(color, vec3(1./2.2)); -} - -// sRGB to linear approximation -vec3 sRGBToLinear(vec3 srgbIn) -{ - return pow(srgbIn, vec3(2.2)); -} - -// equivalent to linearTosRGB(sRGBToLinear(srgbIn) * k) -vec3 linearProduct(vec3 srgbIn, vec3 k) -{ - return srgbIn * pow(k, vec3(1./2.2)); -} - -// Apply depth for wireframe overlay to reduce z-fighting -#if __VERSION__ >= 300 - #define _HANDLE_WIREFRAME_DEPTH gl_FragDepth = gl_FragCoord.z - 0.0001; -#else - #define _HANDLE_WIREFRAME_DEPTH -#endif - -#ifdef DEBUG_WIREFRAME - // Debug wireframe uses premultiplied alpha blending (alpha channel is left unchanged) - #define HANDLE_WIREFRAME_DEBUG \ - gl_FragColor = vec4(0.7, 0.0, 0.0, 0.7); \ - _HANDLE_WIREFRAME_DEPTH; -#else - #define HANDLE_WIREFRAME_DEBUG -#endif #ifdef RENDER_CUTOFF // Calculates cutoff and fade out based on the supplied params and depth value @@ -57,4 +17,4 @@ float cutoff_opacity(vec4 cutoff_params, float depth) { float linearDepth = (depth - near) / (far - near); return clamp((linearDepth - cutoffStart) / (cutoffEnd - cutoffStart), 0.0, 1.0); } -#endif \ No newline at end of file +#endif diff --git a/src/shaders/_prelude.vertex.glsl b/src/shaders/_prelude.vertex.glsl index a15c3d6199f..4d2d06f6dd1 100644 --- a/src/shaders/_prelude.vertex.glsl +++ b/src/shaders/_prelude.vertex.glsl @@ -1,10 +1,9 @@ // NOTE: This prelude is injected in the vertex shader only -#if __VERSION__ >= 300 -#define attribute in -#define varying out -#define texture2D texture -#endif +#define EXTENT 8192.0 +#define RAD_TO_DEG 180.0 / PI +#define DEG_TO_RAD PI / 180.0 +#define GLOBE_RADIUS EXTENT / PI / 2.0 float wrap(float n, float min, float max) { float d = max - min; @@ -104,7 +103,7 @@ float mercatorXfromLng(float lng) { } float mercatorYfromLat(float lat) { - return (180.0 - (RAD_TO_DEG* log(tan(QUARTER_PI + lat / 2.0 * DEG_TO_RAD)))) / 360.0; + return (180.0 - (RAD_TO_DEG * log(tan(PI / 4.0 + lat / 2.0 * DEG_TO_RAD)))) / 360.0; } vec3 latLngToECEF(vec2 latLng) { @@ -125,7 +124,7 @@ vec3 latLngToECEF(vec2 latLng) { #ifdef RENDER_CUTOFF uniform vec4 u_cutoff_params; -varying float v_cutoff_opacity; +out float v_cutoff_opacity; #endif const vec4 AWAY = vec4(-1000.0, -1000.0, -1000.0, 1); // Normalized device coordinate that is not rendered. diff --git a/src/shaders/_prelude_fog.fragment.glsl b/src/shaders/_prelude_fog.fragment.glsl index cc3d7c48adc..4a5dc474598 100644 --- a/src/shaders/_prelude_fog.fragment.glsl +++ b/src/shaders/_prelude_fog.fragment.glsl @@ -1,3 +1,14 @@ +highp vec3 hash(highp vec2 p) { + highp vec3 p3 = fract(p.xyx * vec3(443.8975, 397.2973, 491.1871)); + p3 += dot(p3, p3.yxz + 19.19); + return fract((p3.xxy + p3.yzz) * p3.zyx); +} + +vec3 dither(vec3 color, highp vec2 seed) { + vec3 rnd = hash(seed) + hash(seed + 0.59374) - 0.5; + return color + rnd / 255.0; +} + #ifdef FOG uniform mediump vec4 u_fog_color; @@ -5,7 +16,7 @@ uniform mediump vec2 u_fog_range; uniform mediump float u_fog_horizon_blend; uniform mediump vec2 u_fog_vertical_limit; uniform mediump float u_fog_temporal_offset; -varying vec3 v_fog_pos; +in vec3 v_fog_pos; uniform highp vec3 u_frustum_tl; uniform highp vec3 u_frustum_tr; diff --git a/src/shaders/_prelude_fog.vertex.glsl b/src/shaders/_prelude_fog.vertex.glsl index 78a9788388c..e73397439e1 100644 --- a/src/shaders/_prelude_fog.vertex.glsl +++ b/src/shaders/_prelude_fog.vertex.glsl @@ -4,7 +4,7 @@ uniform mediump vec4 u_fog_color; uniform mediump vec2 u_fog_range; uniform mediump float u_fog_horizon_blend; uniform mediump mat4 u_fog_matrix; -varying vec3 v_fog_pos; +out vec3 v_fog_pos; float fog_range(float depth) { // Map [near, far] to [0, 1] without clamping diff --git a/src/shaders/_prelude_lighting.glsl b/src/shaders/_prelude_lighting.glsl index 365e3545545..41bf5b11347 100644 --- a/src/shaders/_prelude_lighting.glsl +++ b/src/shaders/_prelude_lighting.glsl @@ -33,6 +33,11 @@ float calculate_ambient_directional_factor(vec3 normal) { return vertical_factor * ambient_directional_factor; } +// equivalent to linearTosRGB(sRGBToLinear(srgbIn) * k) +vec3 linearProduct(vec3 srgbIn, vec3 k) { + return srgbIn * pow(k, vec3(1./2.2)); +} + // BEGIN Used for anisotropic ambient light // BEGIN Use with shadows, pass shadow light factor as dir_factor diff --git a/src/shaders/_prelude_raster_array.glsl b/src/shaders/_prelude_raster_array.glsl index a04f63b1eac..4832b8107e4 100644 --- a/src/shaders/_prelude_raster_array.glsl +++ b/src/shaders/_prelude_raster_array.glsl @@ -28,31 +28,31 @@ vec2 raTexture2D_image0_linear(vec2 texCoord, vec2 texResolution, vec4 colorMix, vec2 fxy; vec4 c = _raTexLinearCoord(texCoord, texResolution, fxy); return _raTexLinearMix(fxy, colorMix, colorOffset, - texture2D(u_image0, c.yz), - texture2D(u_image0, c.xz), - texture2D(u_image0, c.yw), - texture2D(u_image0, c.xw) + texture(u_image0, c.yz), + texture(u_image0, c.xz), + texture(u_image0, c.yw), + texture(u_image0, c.xw) ); } vec2 raTexture2D_image1_linear(vec2 texCoord, vec2 texResolution, vec4 colorMix, float colorOffset) { vec2 fxy; vec4 c = _raTexLinearCoord(texCoord, texResolution, fxy); return _raTexLinearMix(fxy, colorMix, colorOffset, - texture2D(u_image1, c.yz), - texture2D(u_image1, c.xz), - texture2D(u_image1, c.yw), - texture2D(u_image1, c.xw) + texture(u_image1, c.yz), + texture(u_image1, c.xz), + texture(u_image1, c.yw), + texture(u_image1, c.xw) ); } // Decode raster array data and return nearest neighbor sample // Returns: vec2(value, nodata_alpha) vec2 raTexture2D_image0_nearest(vec2 texCoord, vec2 texResolution, vec4 colorMix, float colorOffset) { - vec4 t = texture2D(u_image0, texCoord); + vec4 t = texture(u_image0, texCoord); return t == NODATA ? vec2(0) : vec2(colorOffset + dot(t, colorMix), 1); } vec2 raTexture2D_image1_nearest(vec2 texCoord, vec2 texResolution, vec4 colorMix, float colorOffset) { - vec4 t = texture2D(u_image1, texCoord); + vec4 t = texture(u_image1, texCoord); return t == NODATA ? vec2(0) : vec2(colorOffset + dot(t, colorMix), 1); } diff --git a/src/shaders/_prelude_terrain.vertex.glsl b/src/shaders/_prelude_terrain.vertex.glsl index 07483d88125..7fd8f974f37 100644 --- a/src/shaders/_prelude_terrain.vertex.glsl +++ b/src/shaders/_prelude_terrain.vertex.glsl @@ -115,7 +115,7 @@ highp float unpack_depth(highp vec4 rgba_depth) bool isOccluded(vec4 frag) { vec3 coord = frag.xyz / frag.w; - float depth = unpack_depth(texture2D(u_depth, (coord.xy + 1.0) * 0.5)); + float depth = unpack_depth(texture(u_depth, (coord.xy + 1.0) * 0.5)); return coord.z > depth + 0.0005; } @@ -125,10 +125,10 @@ float occlusionFade(vec4 frag) { vec3 df = vec3(5.0 * u_depth_size_inv, 0.0); vec2 uv = 0.5 * coord.xy + 0.5; vec4 depth = vec4( - unpack_depth(texture2D(u_depth, uv - df.xz)), - unpack_depth(texture2D(u_depth, uv + df.xz)), - unpack_depth(texture2D(u_depth, uv - df.zy)), - unpack_depth(texture2D(u_depth, uv + df.zy)) + unpack_depth(texture(u_depth, uv - df.xz)), + unpack_depth(texture(u_depth, uv + df.xz)), + unpack_depth(texture(u_depth, uv - df.zy)), + unpack_depth(texture(u_depth, uv + df.zy)) ); return dot(vec4(0.25), vec4(1.0) - clamp(300.0 * (vec4(coord.z - 0.001) - depth), 0.0, 1.0)); } @@ -138,17 +138,10 @@ float occlusionFade(vec4 frag) { // This is so that rendering changes are reflected on CPU side for feature querying. vec4 fourSample(vec2 pos, vec2 off) { -#ifdef TERRAIN_DEM_FLOAT_FORMAT float tl = texture(u_dem, pos).r; float tr = texture(u_dem, pos + vec2(off.x, 0.0)).r; float bl = texture(u_dem, pos + vec2(0.0, off.y)).r; float br = texture(u_dem, pos + off).r; -#else - float tl = texture(u_dem, pos).r; - float tr = texture(u_dem, pos + vec2(off.x, 0.0)).r; - float bl = texture(u_dem, pos + vec2(0.0, off.y)).r; - float br = texture(u_dem, pos + off).r; -#endif return vec4(tl, tr, bl, br); } diff --git a/src/shaders/atmosphere.fragment.glsl b/src/shaders/atmosphere.fragment.glsl index f89a5e126b0..ca0375b2f55 100644 --- a/src/shaders/atmosphere.fragment.glsl +++ b/src/shaders/atmosphere.fragment.glsl @@ -10,8 +10,8 @@ uniform vec4 u_space_color; uniform float u_horizon_angle; -varying highp vec3 v_ray_dir; -varying highp vec3 v_horizon_dir; +in highp vec3 v_ray_dir; +in highp vec3 v_horizon_dir; void main() { highp vec3 dir = normalize(v_ray_dir); @@ -26,14 +26,14 @@ void main() { // antialiasing that might be applied from globe_raster.fragment.glsl if (norm_dist_from_center < 0.98) { #ifdef ALPHA_PASS - gl_FragColor = vec4(0, 0, 0, 0); + glFragColor = vec4(0, 0, 0, 0); return; #else #ifdef NATIVE // Needed for render test parity since white canvas is assumed - gl_FragColor = vec4(1, 1, 1, 1); + glFragColor = vec4(1, 1, 1, 1); #else - gl_FragColor = vec4(0, 0, 0, 1); + glFragColor = vec4(0, 0, 0, 1); #endif return; #endif @@ -87,7 +87,7 @@ void main() { float a2 = mix(a0, a1, t); float a = mix(alpha_2, a2, t); - gl_FragColor = vec4(1.0, 1.0, 1.0, a); + glFragColor = vec4(1.0, 1.0, 1.0, a); #else vec3 c0 = mix(color_stop_2, color_stop_1, alpha_1); vec3 c1 = mix(c0, color_stop_0, alpha_0); @@ -103,6 +103,6 @@ void main() { #endif // Blending with background space color - gl_FragColor = vec4(c * t, t); + glFragColor = vec4(c * t, t); #endif } diff --git a/src/shaders/atmosphere.vertex.glsl b/src/shaders/atmosphere.vertex.glsl index a3336b3236b..61edafa1217 100644 --- a/src/shaders/atmosphere.vertex.glsl +++ b/src/shaders/atmosphere.vertex.glsl @@ -1,5 +1,5 @@ -attribute vec3 a_pos; -attribute vec2 a_uv; +in vec3 a_pos; +in vec2 a_uv; // View frustum direction vectors pointing from the camera position to of each the corner points uniform vec3 u_frustum_tl; @@ -8,8 +8,8 @@ uniform vec3 u_frustum_br; uniform vec3 u_frustum_bl; uniform float u_horizon; -varying highp vec3 v_ray_dir; -varying highp vec3 v_horizon_dir; +out highp vec3 v_ray_dir; +out highp vec3 v_horizon_dir; void main() { v_ray_dir = mix( diff --git a/src/shaders/background.fragment.glsl b/src/shaders/background.fragment.glsl index 81a21eab09e..b4d61edae78 100644 --- a/src/shaders/background.fragment.glsl +++ b/src/shaders/background.fragment.glsl @@ -5,7 +5,7 @@ uniform vec4 u_color; uniform float u_opacity; #ifdef LIGHTING_3D_MODE -varying vec4 v_color; +in vec4 v_color; #endif void main() { @@ -19,10 +19,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * u_opacity; + glFragColor = out_color * u_opacity; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/background.vertex.glsl b/src/shaders/background.vertex.glsl index 0901475093b..6cc521bd143 100644 --- a/src/shaders/background.vertex.glsl +++ b/src/shaders/background.vertex.glsl @@ -1,13 +1,13 @@ #include "_prelude_fog.vertex.glsl" #include "_prelude_lighting.glsl" -attribute vec2 a_pos; +in vec2 a_pos; uniform mat4 u_matrix; #ifdef LIGHTING_3D_MODE uniform mediump vec4 u_color; -varying vec4 v_color; +out vec4 v_color; uniform float u_emissive_strength; #endif diff --git a/src/shaders/background_pattern.fragment.glsl b/src/shaders/background_pattern.fragment.glsl index 62601ae0dc1..122b183da0f 100644 --- a/src/shaders/background_pattern.fragment.glsl +++ b/src/shaders/background_pattern.fragment.glsl @@ -9,12 +9,12 @@ uniform float u_emissive_strength; uniform sampler2D u_image; -varying vec2 v_pos; +in vec2 v_pos; void main() { vec2 imagecoord = mod(v_pos, 1.0); vec2 pos = mix(u_pattern_tl / u_texsize, u_pattern_br / u_texsize, imagecoord); - vec4 out_color = texture2D(u_image, pos); + vec4 out_color = texture(u_image, pos); #ifdef LIGHTING_3D_MODE out_color = apply_lighting_with_emission_ground(out_color, u_emissive_strength); @@ -23,10 +23,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * u_opacity; + glFragColor = out_color * u_opacity; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/background_pattern.vertex.glsl b/src/shaders/background_pattern.vertex.glsl index c49cb53c4ba..2cf40e743de 100644 --- a/src/shaders/background_pattern.vertex.glsl +++ b/src/shaders/background_pattern.vertex.glsl @@ -6,9 +6,9 @@ uniform vec2 u_pixel_coord_upper; uniform vec2 u_pixel_coord_lower; uniform float u_tile_units_to_pixels; -attribute vec2 a_pos; +in vec2 a_pos; -varying vec2 v_pos; +out vec2 v_pos; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); diff --git a/src/shaders/circle.fragment.glsl b/src/shaders/circle.fragment.glsl index 34f7cbe0a74..1cc124f5f3a 100644 --- a/src/shaders/circle.fragment.glsl +++ b/src/shaders/circle.fragment.glsl @@ -1,8 +1,8 @@ #include "_prelude_fog.fragment.glsl" #include "_prelude_lighting.glsl" -varying vec3 v_data; -varying float v_visibility; +in vec3 v_data; +in float v_visibility; #pragma mapbox: define highp vec4 color #pragma mapbox: define mediump float radius @@ -45,9 +45,9 @@ void main() { out_color = fog_apply_premultiplied(out_color, v_fog_pos); #endif - gl_FragColor = out_color * (v_visibility * opacity_t); + glFragColor = out_color * (v_visibility * opacity_t); #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif } diff --git a/src/shaders/circle.vertex.glsl b/src/shaders/circle.vertex.glsl index b804295b038..726112780bf 100644 --- a/src/shaders/circle.vertex.glsl +++ b/src/shaders/circle.vertex.glsl @@ -12,11 +12,11 @@ uniform mat2 u_extrude_scale; uniform lowp float u_device_pixel_ratio; uniform highp float u_camera_to_center_distance; -attribute vec2 a_pos; +in vec2 a_pos; #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_pos_3; // Projected position on the globe -attribute vec3 a_pos_normal_3; // Surface normal at the position +in vec3 a_pos_3; // Projected position on the globe +in vec3 a_pos_normal_3; // Surface normal at the position // Uniforms required for transition between globe and mercator uniform mat4 u_inv_rot_matrix; @@ -26,8 +26,8 @@ uniform float u_zoom_transition; uniform vec3 u_up_dir; #endif -varying vec3 v_data; -varying float v_visibility; +out vec3 v_data; +out float v_visibility; #pragma mapbox: define highp vec4 color #pragma mapbox: define mediump float radius diff --git a/src/shaders/clipping_mask.fragment.glsl b/src/shaders/clipping_mask.fragment.glsl index fdd1a9285a6..c453278a792 100644 --- a/src/shaders/clipping_mask.fragment.glsl +++ b/src/shaders/clipping_mask.fragment.glsl @@ -1,3 +1,3 @@ void main() { - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); } diff --git a/src/shaders/clipping_mask.vertex.glsl b/src/shaders/clipping_mask.vertex.glsl index 866c3cd2f39..46f9eaa1244 100644 --- a/src/shaders/clipping_mask.vertex.glsl +++ b/src/shaders/clipping_mask.vertex.glsl @@ -1,4 +1,4 @@ -attribute vec2 a_pos; +in vec2 a_pos; uniform mat4 u_matrix; diff --git a/src/shaders/collision_box.fragment.glsl b/src/shaders/collision_box.fragment.glsl index f53471da06d..63a95b9aa2e 100644 --- a/src/shaders/collision_box.fragment.glsl +++ b/src/shaders/collision_box.fragment.glsl @@ -1,10 +1,10 @@ -varying float v_placed; -varying float v_notUsed; +in float v_placed; +in float v_notUsed; void main() { vec4 red = vec4(1.0, 0.0, 0.0, 1.0); // Red = collision, hide label vec4 blue = vec4(0.0, 0.0, 1.0, 0.5); // Blue = no collision, label is showing - gl_FragColor = mix(red, blue, step(0.5, v_placed)) * 0.5; - gl_FragColor *= mix(1.0, 0.1, step(0.5, v_notUsed)); -} \ No newline at end of file + glFragColor = mix(red, blue, step(0.5, v_placed)) * 0.5; + glFragColor *= mix(1.0, 0.1, step(0.5, v_notUsed)); +} diff --git a/src/shaders/collision_box.vertex.glsl b/src/shaders/collision_box.vertex.glsl index e3dcc9fe33c..12e2718fe87 100644 --- a/src/shaders/collision_box.vertex.glsl +++ b/src/shaders/collision_box.vertex.glsl @@ -1,20 +1,20 @@ #include "_prelude_terrain.vertex.glsl" -attribute vec3 a_pos; -attribute vec2 a_anchor_pos; -attribute vec2 a_extrude; -attribute vec2 a_placed; -attribute vec2 a_shift; -attribute float a_size_scale; -attribute vec2 a_padding; -attribute float a_z_offset; +in vec3 a_pos; +in vec2 a_anchor_pos; +in vec2 a_extrude; +in vec2 a_placed; +in vec2 a_shift; +in float a_size_scale; +in vec2 a_padding; +in float a_z_offset; uniform mat4 u_matrix; uniform vec2 u_extrude_scale; uniform float u_camera_to_center_distance; -varying float v_placed; -varying float v_notUsed; +out float v_placed; +out float v_notUsed; void main() { vec4 projectedPoint = u_matrix * vec4(a_pos + elevationVector(a_anchor_pos) * (a_z_offset + elevation(a_anchor_pos)), 1); diff --git a/src/shaders/collision_circle.fragment.glsl b/src/shaders/collision_circle.fragment.glsl index 3cd66b1155e..67bd43a0815 100644 --- a/src/shaders/collision_circle.fragment.glsl +++ b/src/shaders/collision_circle.fragment.glsl @@ -1,7 +1,7 @@ -varying float v_radius; -varying vec2 v_extrude; -varying float v_perspective_ratio; -varying float v_collision; +in float v_radius; +in vec2 v_extrude; +in float v_perspective_ratio; +in float v_collision; void main() { float alpha = 0.5 * min(v_perspective_ratio, 1.0); @@ -13,5 +13,5 @@ void main() { vec4 color = mix(vec4(0.0, 0.0, 1.0, 0.5), vec4(1.0, 0.0, 0.0, 1.0), v_collision); - gl_FragColor = color * alpha * opacity_t; + glFragColor = color * alpha * opacity_t; } diff --git a/src/shaders/collision_circle.vertex.glsl b/src/shaders/collision_circle.vertex.glsl index 764dd900aa6..1af105a127b 100644 --- a/src/shaders/collision_circle.vertex.glsl +++ b/src/shaders/collision_circle.vertex.glsl @@ -1,16 +1,16 @@ -attribute vec2 a_pos_2f; -attribute float a_radius; -attribute vec2 a_flags; +in vec2 a_pos_2f; +in float a_radius; +in vec2 a_flags; uniform mat4 u_matrix; uniform mat4 u_inv_matrix; uniform vec2 u_viewport_size; uniform float u_camera_to_center_distance; -varying float v_radius; -varying vec2 v_extrude; -varying float v_perspective_ratio; -varying float v_collision; +out float v_radius; +out vec2 v_extrude; +out float v_perspective_ratio; +out float v_collision; vec3 toTilePosition(vec2 screenPos) { // Shoot a ray towards the ground to reconstruct the depth-value diff --git a/src/shaders/debug.fragment.glsl b/src/shaders/debug.fragment.glsl index c15a694bd1b..f337ad66c26 100644 --- a/src/shaders/debug.fragment.glsl +++ b/src/shaders/debug.fragment.glsl @@ -1,9 +1,9 @@ uniform highp vec4 u_color; uniform sampler2D u_overlay; -varying vec2 v_uv; +in vec2 v_uv; void main() { - vec4 overlay_color = texture2D(u_overlay, v_uv); - gl_FragColor = mix(u_color, overlay_color, overlay_color.a); + vec4 overlay_color = texture(u_overlay, v_uv); + glFragColor = mix(u_color, overlay_color, overlay_color.a); } diff --git a/src/shaders/debug.vertex.glsl b/src/shaders/debug.vertex.glsl index 570a4a76782..ef8b6ed9661 100644 --- a/src/shaders/debug.vertex.glsl +++ b/src/shaders/debug.vertex.glsl @@ -1,10 +1,10 @@ #include "_prelude_terrain.vertex.glsl" -attribute vec2 a_pos; +in vec2 a_pos; #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_pos_3; +in vec3 a_pos_3; #endif -varying vec2 v_uv; +out vec2 v_uv; uniform mat4 u_matrix; uniform float u_overlay_scale; diff --git a/src/shaders/fill.fragment.glsl b/src/shaders/fill.fragment.glsl index a6462013962..ded717f1e52 100644 --- a/src/shaders/fill.fragment.glsl +++ b/src/shaders/fill.fragment.glsl @@ -19,10 +19,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * opacity; + glFragColor = out_color * opacity; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/fill.vertex.glsl b/src/shaders/fill.vertex.glsl index 5b140beb0e2..fa497509e78 100644 --- a/src/shaders/fill.vertex.glsl +++ b/src/shaders/fill.vertex.glsl @@ -1,6 +1,6 @@ #include "_prelude_fog.vertex.glsl" -attribute vec2 a_pos; +in vec2 a_pos; uniform mat4 u_matrix; diff --git a/src/shaders/fill_extrusion.fragment.glsl b/src/shaders/fill_extrusion.fragment.glsl index 45317b306eb..ff3a79075db 100644 --- a/src/shaders/fill_extrusion.fragment.glsl +++ b/src/shaders/fill_extrusion.fragment.glsl @@ -2,28 +2,28 @@ #include "_prelude_shadow.fragment.glsl" #include "_prelude_lighting.glsl" -varying vec4 v_color; -varying vec4 v_flat; +in vec4 v_color; +in vec4 v_flat; #ifdef RENDER_SHADOWS -varying highp vec4 v_pos_light_view_0; -varying highp vec4 v_pos_light_view_1; -varying float v_depth; +in highp vec4 v_pos_light_view_0; +in highp vec4 v_pos_light_view_1; +in float v_depth; #endif uniform lowp float u_opacity; #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec2 v_ao; +in vec2 v_ao; #endif #if defined(ZERO_ROOF_RADIUS) && !defined(LIGHTING_3D_MODE) -varying vec4 v_roof_color; +in vec4 v_roof_color; #endif #if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS) || defined(LIGHTING_3D_MODE) -varying highp vec3 v_normal; +in highp vec3 v_normal; #endif uniform vec3 u_flood_light_color; @@ -32,13 +32,13 @@ uniform float u_flood_light_intensity; uniform vec3 u_ground_shadow_factor; #if defined(LIGHTING_3D_MODE) && defined(FLOOD_LIGHT) -varying float v_flood_radius; -varying float v_has_floodlight; +in float v_flood_radius; +in float v_has_floodlight; #endif uniform float u_emissive_strength; -varying float v_height; +in float v_height; void main() { @@ -129,10 +129,10 @@ float flood_radiance = 0.0; color = applyCutout(color); #endif - gl_FragColor = color; + glFragColor = color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/fill_extrusion.vertex.glsl b/src/shaders/fill_extrusion.vertex.glsl index 1189d9497bc..66e1c352a8e 100644 --- a/src/shaders/fill_extrusion.vertex.glsl +++ b/src/shaders/fill_extrusion.vertex.glsl @@ -3,11 +3,9 @@ #include "_prelude_shadow.vertex.glsl" #include "_prelude_lighting.glsl" -#if __VERSION__ >= 300 #ifdef RENDER_CUTOFF invariant gl_Position; #endif -#endif uniform mat4 u_matrix; uniform vec3 u_lightcolor; @@ -17,12 +15,12 @@ uniform float u_vertical_gradient; uniform lowp float u_opacity; uniform float u_edge_radius; -attribute vec4 a_pos_normal_ed; -attribute vec2 a_centroid_pos; +in vec4 a_pos_normal_ed; +in vec2 a_centroid_pos; #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_pos_3; // Projected position on the globe -attribute vec3 a_pos_normal_3; // Surface normal at the position +in vec3 a_pos_3; // Projected position on the globe +in vec3 a_pos_normal_3; // Surface normal at the position uniform mat4 u_inv_rot_matrix; uniform vec2 u_merc_center; @@ -34,37 +32,37 @@ uniform float u_height_lift; uniform highp float u_vertical_scale; -varying vec4 v_color; -varying vec4 v_flat; +out vec4 v_color; +out vec4 v_flat; #ifdef RENDER_SHADOWS uniform mat4 u_light_matrix_0; uniform mat4 u_light_matrix_1; -varying highp vec4 v_pos_light_view_0; -varying highp vec4 v_pos_light_view_1; -varying float v_depth; +out highp vec4 v_pos_light_view_0; +out highp vec4 v_pos_light_view_1; +out float v_depth; #endif #if defined(ZERO_ROOF_RADIUS) && !defined(LIGHTING_3D_MODE) -varying vec4 v_roof_color; +out vec4 v_roof_color; #endif #if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS) || defined(LIGHTING_3D_MODE) -varying highp vec3 v_normal; +out highp vec3 v_normal; #endif #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec2 v_ao; +out vec2 v_ao; #endif #if defined(LIGHTING_3D_MODE) && defined(FLOOD_LIGHT) -varying float v_flood_radius; -varying float v_has_floodlight; +out float v_flood_radius; +out float v_has_floodlight; #endif -varying float v_height; +out float v_height; #pragma mapbox: define highp float base #pragma mapbox: define highp float height diff --git a/src/shaders/fill_extrusion_ground_effect.fragment.glsl b/src/shaders/fill_extrusion_ground_effect.fragment.glsl index a753363ca02..07aa9e36e09 100644 --- a/src/shaders/fill_extrusion_ground_effect.fragment.glsl +++ b/src/shaders/fill_extrusion_ground_effect.fragment.glsl @@ -10,10 +10,10 @@ uniform sampler2D u_fb; uniform float u_fb_size; #ifdef SDF_SUBPASS -varying highp vec2 v_pos; -varying highp vec4 v_line_segment; -varying highp float v_flood_light_radius_tile; -varying highp vec2 v_ao; +in highp vec2 v_pos; +in highp vec4 v_line_segment; +in highp float v_flood_light_radius_tile; +in highp vec2 v_ao; float line_df(highp vec2 a, highp vec2 b, highp vec2 p) { highp vec2 ba = b - a; @@ -23,7 +23,7 @@ float line_df(highp vec2 a, highp vec2 b, highp vec2 p) { } #ifdef FOG -varying highp float v_fog; +in highp float v_fog; #endif // FOG #endif // SDF_SUBPASS @@ -36,9 +36,9 @@ void main() { #ifdef CLEAR_SUBPASS vec4 color = vec4(1.0); #ifdef CLEAR_FROM_TEXTURE - color = texture2D(u_fb, gl_FragCoord.xy / vec2(u_fb_size)); + color = texture(u_fb, gl_FragCoord.xy / vec2(u_fb_size)); #endif // CLEAR_FROM_TEXTURE - gl_FragColor = color; + glFragColor = color; #else // CLEAR_SUBPASS #ifdef SDF_SUBPASS highp float d = line_df(v_line_segment.xy, v_line_segment.zw, v_pos); @@ -54,13 +54,13 @@ void main() { #ifdef RENDER_CUTOFF fog *= v_cutoff_opacity; #endif // RENDER_CUTOFF - gl_FragColor = vec4(vec3(0.0), mix(1.0, d, effect_intensity * u_opacity * fog)); + glFragColor = vec4(vec3(0.0), mix(1.0, d, effect_intensity * u_opacity * fog)); #else // SDF_SUBPASS vec4 color = mix(vec4(u_flood_light_color, 1.0), vec4(vec3(0.0), 1.0), u_ao_pass); #ifdef OVERDRAW_INSPECTOR color = vec4(1.0); #endif - gl_FragColor = color; + glFragColor = color; HANDLE_WIREFRAME_DEBUG; #endif // !SDF_SUBPASS #endif // !CLEAR_SUBPASS diff --git a/src/shaders/fill_extrusion_ground_effect.vertex.glsl b/src/shaders/fill_extrusion_ground_effect.vertex.glsl index 276fe4ea536..84b29def4a3 100644 --- a/src/shaders/fill_extrusion_ground_effect.vertex.glsl +++ b/src/shaders/fill_extrusion_ground_effect.vertex.glsl @@ -1,16 +1,16 @@ #include "_prelude_fog.vertex.glsl" -attribute highp vec4 a_pos_end; -attribute highp float a_angular_offset_factor; -attribute highp float a_hidden_by_landmark; +in highp vec4 a_pos_end; +in highp float a_angular_offset_factor; +in highp float a_hidden_by_landmark; #ifdef SDF_SUBPASS -varying highp vec2 v_pos; -varying highp vec4 v_line_segment; -varying highp float v_flood_light_radius_tile; -varying highp vec2 v_ao; +out highp vec2 v_pos; +out highp vec4 v_line_segment; +out highp float v_flood_light_radius_tile; +out highp vec2 v_ao; #ifdef FOG -varying highp float v_fog; +out highp float v_fog; #endif #endif diff --git a/src/shaders/fill_extrusion_pattern.fragment.glsl b/src/shaders/fill_extrusion_pattern.fragment.glsl index d72ba3f452f..59cad9018e5 100644 --- a/src/shaders/fill_extrusion_pattern.fragment.glsl +++ b/src/shaders/fill_extrusion_pattern.fragment.glsl @@ -7,15 +7,15 @@ uniform sampler2D u_image; #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec3 v_ao; +in vec3 v_ao; #endif #ifdef LIGHTING_3D_MODE -varying vec3 v_normal; +in vec3 v_normal; #endif -varying vec2 v_pos; -varying vec4 v_lighting; +in vec2 v_pos; +in vec4 v_lighting; uniform lowp float u_opacity; @@ -35,7 +35,7 @@ void main() { vec2 imagecoord = mod(v_pos, 1.0); vec2 pos = mix(pattern_tl / u_texsize, pattern_br / u_texsize, imagecoord); - vec4 out_color = texture2D(u_image, pos); + vec4 out_color = texture(u_image, pos); #ifdef LIGHTING_3D_MODE out_color = apply_lighting(out_color, normalize(v_normal)) * u_opacity; @@ -63,10 +63,10 @@ void main() { out_color = applyCutout(out_color); #endif - gl_FragColor = out_color; + glFragColor = out_color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/fill_extrusion_pattern.vertex.glsl b/src/shaders/fill_extrusion_pattern.vertex.glsl index e748f5959e3..3fde3697bf2 100644 --- a/src/shaders/fill_extrusion_pattern.vertex.glsl +++ b/src/shaders/fill_extrusion_pattern.vertex.glsl @@ -14,12 +14,12 @@ uniform vec3 u_lightcolor; uniform lowp vec3 u_lightpos; uniform lowp float u_lightintensity; -attribute vec4 a_pos_normal_ed; -attribute vec2 a_centroid_pos; +in vec4 a_pos_normal_ed; +in vec2 a_centroid_pos; #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_pos_3; // Projected position on the globe -attribute vec3 a_pos_normal_3; // Surface normal at the position +in vec3 a_pos_3; // Projected position on the globe +in vec3 a_pos_normal_3; // Surface normal at the position uniform mat4 u_inv_rot_matrix; uniform vec2 u_merc_center; @@ -29,16 +29,16 @@ uniform vec3 u_up_dir; uniform float u_height_lift; #endif -varying vec2 v_pos; -varying vec4 v_lighting; +out vec2 v_pos; +out vec4 v_lighting; #ifdef FAUX_AO uniform lowp vec2 u_ao; -varying vec3 v_ao; +out vec3 v_ao; #endif #ifdef LIGHTING_3D_MODE -varying vec3 v_normal; +out vec3 v_normal; #endif #pragma mapbox: define highp float base diff --git a/src/shaders/fill_outline.fragment.glsl b/src/shaders/fill_outline.fragment.glsl index af7c5e3c873..27b60491f13 100644 --- a/src/shaders/fill_outline.fragment.glsl +++ b/src/shaders/fill_outline.fragment.glsl @@ -1,7 +1,7 @@ #include "_prelude_fog.fragment.glsl" #include "_prelude_lighting.glsl" -varying vec2 v_pos; +in vec2 v_pos; uniform float u_emissive_strength; @@ -23,10 +23,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * (alpha * opacity); + glFragColor = out_color * (alpha * opacity); #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; } diff --git a/src/shaders/fill_outline.vertex.glsl b/src/shaders/fill_outline.vertex.glsl index a5b27a2c4f8..fcb45a05eeb 100644 --- a/src/shaders/fill_outline.vertex.glsl +++ b/src/shaders/fill_outline.vertex.glsl @@ -1,11 +1,11 @@ #include "_prelude_fog.vertex.glsl" -attribute vec2 a_pos; +in vec2 a_pos; uniform mat4 u_matrix; uniform vec2 u_world; -varying vec2 v_pos; +out vec2 v_pos; #pragma mapbox: define highp vec4 outline_color #pragma mapbox: define lowp float opacity diff --git a/src/shaders/fill_outline_pattern.fragment.glsl b/src/shaders/fill_outline_pattern.fragment.glsl index e7d1134097d..e5173561b3d 100644 --- a/src/shaders/fill_outline_pattern.fragment.glsl +++ b/src/shaders/fill_outline_pattern.fragment.glsl @@ -5,8 +5,8 @@ uniform vec2 u_texsize; uniform sampler2D u_image; uniform float u_emissive_strength; -varying vec2 v_pos; -varying vec2 v_pos_world; +in vec2 v_pos; +in vec2 v_pos_world; #pragma mapbox: define lowp float opacity #pragma mapbox: define lowp vec4 pattern @@ -26,7 +26,7 @@ void main() { float dist = length(v_pos_world - gl_FragCoord.xy); float alpha = 1.0 - smoothstep(0.0, 1.0, dist); - vec4 out_color = texture2D(u_image, pos); + vec4 out_color = texture(u_image, pos); #ifdef LIGHTING_3D_MODE out_color = apply_lighting_with_emission_ground(out_color, u_emissive_strength); @@ -35,10 +35,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * (alpha * opacity); + glFragColor = out_color * (alpha * opacity); #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/fill_outline_pattern.vertex.glsl b/src/shaders/fill_outline_pattern.vertex.glsl index 3c3d7b74a57..b0f696904c8 100644 --- a/src/shaders/fill_outline_pattern.vertex.glsl +++ b/src/shaders/fill_outline_pattern.vertex.glsl @@ -6,10 +6,10 @@ uniform vec2 u_pixel_coord_upper; uniform vec2 u_pixel_coord_lower; uniform float u_tile_units_to_pixels; -attribute vec2 a_pos; +in vec2 a_pos; -varying vec2 v_pos; -varying vec2 v_pos_world; +out vec2 v_pos; +out vec2 v_pos_world; #pragma mapbox: define lowp float opacity #pragma mapbox: define lowp vec4 pattern diff --git a/src/shaders/fill_pattern.fragment.glsl b/src/shaders/fill_pattern.fragment.glsl index 0c80d0828ac..7c75dd323dd 100644 --- a/src/shaders/fill_pattern.fragment.glsl +++ b/src/shaders/fill_pattern.fragment.glsl @@ -5,7 +5,7 @@ uniform vec2 u_texsize; uniform sampler2D u_image; -varying vec2 v_pos; +in vec2 v_pos; uniform float u_emissive_strength; @@ -21,7 +21,7 @@ void main() { vec2 imagecoord = mod(v_pos, 1.0); vec2 pos = mix(pattern_tl / u_texsize, pattern_br / u_texsize, imagecoord); - vec4 out_color = texture2D(u_image, pos); + vec4 out_color = texture(u_image, pos); #ifdef LIGHTING_3D_MODE out_color = apply_lighting_with_emission_ground(out_color, u_emissive_strength); @@ -30,10 +30,10 @@ void main() { out_color = fog_dither(fog_apply_premultiplied(out_color, v_fog_pos)); #endif - gl_FragColor = out_color * opacity; + glFragColor = out_color * opacity; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/fill_pattern.vertex.glsl b/src/shaders/fill_pattern.vertex.glsl index 3436ee9c7ec..714dfac8b14 100644 --- a/src/shaders/fill_pattern.vertex.glsl +++ b/src/shaders/fill_pattern.vertex.glsl @@ -5,9 +5,9 @@ uniform vec2 u_pixel_coord_upper; uniform vec2 u_pixel_coord_lower; uniform float u_tile_units_to_pixels; -attribute vec2 a_pos; +in vec2 a_pos; -varying vec2 v_pos; +out vec2 v_pos; #pragma mapbox: define lowp float opacity #pragma mapbox: define lowp vec4 pattern diff --git a/src/shaders/globe_raster.fragment.glsl b/src/shaders/globe_raster.fragment.glsl index 952aaad578a..248c9220b74 100644 --- a/src/shaders/globe_raster.fragment.glsl +++ b/src/shaders/globe_raster.fragment.glsl @@ -2,7 +2,7 @@ #include "_prelude_lighting.glsl" uniform sampler2D u_image0; -varying vec2 v_pos0; +in vec2 v_pos0; #ifndef FOG uniform highp vec3 u_frustum_tl; @@ -33,7 +33,7 @@ void main() { float antialias_factor = antialias_pixel * fwidth(norm_dist_from_center); float antialias = smoothstep(0.0, antialias_factor, norm_dist_from_center); - vec4 raster = texture2D(u_image0, v_pos0); + vec4 raster = texture(u_image0, v_pos0); #ifdef LIGHTING_3D_MODE #ifdef LIGHTING_3D_ALPHA_EMISSIVENESS raster = apply_lighting_with_emission_ground(raster, raster.a); @@ -46,7 +46,7 @@ void main() { color = vec4(raster.rgb * antialias, raster.a * antialias); #endif // !LIGHTING_3D_MODE #else // CUSTOM_ANTIALIASING - color = texture2D(u_image0, v_pos0); + color = texture(u_image0, v_pos0); #ifdef LIGHTING_3D_MODE #ifdef LIGHTING_3D_ALPHA_EMISSIVENESS color = apply_lighting_with_emission_ground(color, color.a); @@ -59,9 +59,9 @@ void main() { #ifdef FOG color = fog_dither(fog_apply_premultiplied(color, v_fog_pos)); #endif - gl_FragColor = color; + glFragColor = color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; } diff --git a/src/shaders/globe_raster.vertex.glsl b/src/shaders/globe_raster.vertex.glsl index 8099ec6e3c2..b54e0c7cc68 100644 --- a/src/shaders/globe_raster.vertex.glsl +++ b/src/shaders/globe_raster.vertex.glsl @@ -11,13 +11,13 @@ uniform mat3 u_grid_matrix; uniform float u_skirt_height; #ifdef GLOBE_POLES -attribute vec3 a_globe_pos; -attribute vec2 a_uv; +in vec3 a_globe_pos; +in vec2 a_uv; #else -attribute vec2 a_pos; // .xy - grid coords, .z - 1 - skirt, 0 - grid +in vec2 a_pos; // .xy - grid coords, .z - 1 - skirt, 0 - grid #endif -varying vec2 v_pos0; +out vec2 v_pos0; void main() { #ifdef GLOBE_POLES diff --git a/src/shaders/heatmap.fragment.glsl b/src/shaders/heatmap.fragment.glsl index 5d2d215ceee..3c2c0452b0a 100644 --- a/src/shaders/heatmap.fragment.glsl +++ b/src/shaders/heatmap.fragment.glsl @@ -2,7 +2,7 @@ uniform highp float u_intensity; -varying vec2 v_extrude; +in vec2 v_extrude; #pragma mapbox: define highp float weight @@ -16,7 +16,7 @@ void main() { float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude); float val = weight * u_intensity * GAUSS_COEF * exp(d); - gl_FragColor = vec4(val, 1.0, 1.0, 1.0); + glFragColor = vec4(val, 1.0, 1.0, 1.0); #ifdef FOG // Globe uses a fixed range and heatmaps preserve @@ -26,12 +26,12 @@ void main() { // Heatmaps work differently than other layers, so we operate on the accumulated // density rather than a final color. The power is chosen so that the density // fades into the fog at a reasonable rate. - gl_FragColor.r *= pow(1.0 - fog_opacity(v_fog_pos), 2.0); + glFragColor.r *= pow(1.0 - fog_opacity(v_fog_pos), 2.0); } #endif #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/heatmap.vertex.glsl b/src/shaders/heatmap.vertex.glsl index 15b493be158..2ab30120661 100644 --- a/src/shaders/heatmap.vertex.glsl +++ b/src/shaders/heatmap.vertex.glsl @@ -6,11 +6,11 @@ uniform float u_extrude_scale; uniform float u_opacity; uniform float u_intensity; -attribute vec2 a_pos; +in vec2 a_pos; #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_pos_3; // Projected position on the globe -attribute vec3 a_pos_normal_3; // Surface normal at the position +in vec3 a_pos_3; // Projected position on the globe +in vec3 a_pos_normal_3; // Surface normal at the position // Uniforms required for transition between globe and mercator uniform mat4 u_inv_rot_matrix; @@ -20,7 +20,7 @@ uniform float u_zoom_transition; uniform vec3 u_up_dir; #endif -varying vec2 v_extrude; +out vec2 v_extrude; #pragma mapbox: define highp float weight #pragma mapbox: define mediump float radius @@ -43,7 +43,7 @@ void main(void) { // This 'extrude' comes in ranging from [-1, -1], to [1, 1]. We'll use // it to produce the vertices of a square mesh framing the point feature // we're adding to the kernel density texture. We'll also pass it as - // a varying, so that the fragment shader can determine the distance of + // a out, so that the fragment shader can determine the distance of // each fragment from the point feature. // Before we do so, we need to scale it up sufficiently so that the // kernel falls effectively to zero at the edge of the mesh. @@ -53,7 +53,7 @@ void main(void) { // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0 float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0; - // Pass the varying in units of radius + // Pass the out in units of radius v_extrude = S * unscaled_extrude; // Scale by radius and the zoom-based scale factor to produce actual diff --git a/src/shaders/heatmap_texture.fragment.glsl b/src/shaders/heatmap_texture.fragment.glsl index 5a564bbfe9d..ce2d3e05221 100644 --- a/src/shaders/heatmap_texture.fragment.glsl +++ b/src/shaders/heatmap_texture.fragment.glsl @@ -1,16 +1,16 @@ uniform sampler2D u_image; uniform sampler2D u_color_ramp; uniform float u_opacity; -varying vec2 v_pos; +in vec2 v_pos; void main() { - float t = texture2D(u_image, v_pos).r; - vec4 color = texture2D(u_color_ramp, vec2(t, 0.5)); + float t = texture(u_image, v_pos).r; + vec4 color = texture(u_color_ramp, vec2(t, 0.5)); - gl_FragColor = color * u_opacity; + glFragColor = color * u_opacity; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(0.0); + glFragColor = vec4(0.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/heatmap_texture.vertex.glsl b/src/shaders/heatmap_texture.vertex.glsl index 439877b6e7a..03fdf59482e 100644 --- a/src/shaders/heatmap_texture.vertex.glsl +++ b/src/shaders/heatmap_texture.vertex.glsl @@ -1,5 +1,5 @@ -attribute vec2 a_pos; -varying vec2 v_pos; +in vec2 a_pos; +out vec2 v_pos; void main() { gl_Position = vec4(a_pos, 0, 1); diff --git a/src/shaders/hillshade.fragment.glsl b/src/shaders/hillshade.fragment.glsl index dfe7e85d891..f4c18e8b80f 100644 --- a/src/shaders/hillshade.fragment.glsl +++ b/src/shaders/hillshade.fragment.glsl @@ -2,7 +2,7 @@ #include "_prelude_lighting.glsl" uniform sampler2D u_image; -varying vec2 v_pos; +in vec2 v_pos; uniform vec2 u_latrange; uniform vec2 u_light; @@ -12,7 +12,7 @@ uniform vec4 u_accent; uniform float u_emissive_strength; void main() { - vec4 pixel = texture2D(u_image, v_pos); + vec4 pixel = texture(u_image, v_pos); vec2 deriv = ((pixel.rg * 2.0) - 1.0); @@ -46,17 +46,17 @@ void main() { vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0); float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0); vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0); - gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color; + glFragColor = accent_color * (1.0 - shade_color.a) + shade_color; #ifdef LIGHTING_3D_MODE - gl_FragColor = apply_lighting_with_emission_ground(gl_FragColor, u_emissive_strength); + glFragColor = apply_lighting_with_emission_ground(glFragColor, u_emissive_strength); #endif #ifdef FOG - gl_FragColor = fog_dither(fog_apply_premultiplied(gl_FragColor, v_fog_pos)); + glFragColor = fog_dither(fog_apply_premultiplied(glFragColor, v_fog_pos)); #endif #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/hillshade.vertex.glsl b/src/shaders/hillshade.vertex.glsl index 69e8cdb2a9c..44ed6c806bf 100644 --- a/src/shaders/hillshade.vertex.glsl +++ b/src/shaders/hillshade.vertex.glsl @@ -2,10 +2,10 @@ uniform mat4 u_matrix; -attribute vec2 a_pos; -attribute vec2 a_texture_pos; +in vec2 a_pos; +in vec2 a_texture_pos; -varying vec2 v_pos; +out vec2 v_pos; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); diff --git a/src/shaders/hillshade_prepare.fragment.glsl b/src/shaders/hillshade_prepare.fragment.glsl index 2272f926c73..9ab1d905abc 100644 --- a/src/shaders/hillshade_prepare.fragment.glsl +++ b/src/shaders/hillshade_prepare.fragment.glsl @@ -1,9 +1,7 @@ -#ifdef GL_ES precision highp float; -#endif uniform sampler2D u_image; -varying vec2 v_pos; +in vec2 v_pos; uniform vec2 u_dimension; uniform float u_zoom; @@ -58,7 +56,7 @@ void main() { (f + g + g + h) - (a + b + b + c) ) / pow(2.0, exaggeration + (19.2562 - u_zoom)); - gl_FragColor = clamp(vec4( + glFragColor = clamp(vec4( deriv.x / 2.0 + 0.5, deriv.y / 2.0 + 0.5, 1.0, diff --git a/src/shaders/hillshade_prepare.vertex.glsl b/src/shaders/hillshade_prepare.vertex.glsl index 582397d6df0..4133d46a575 100644 --- a/src/shaders/hillshade_prepare.vertex.glsl +++ b/src/shaders/hillshade_prepare.vertex.glsl @@ -1,10 +1,10 @@ uniform mat4 u_matrix; uniform vec2 u_dimension; -attribute vec2 a_pos; -attribute vec2 a_texture_pos; +in vec2 a_pos; +in vec2 a_texture_pos; -varying vec2 v_pos; +out vec2 v_pos; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); diff --git a/src/shaders/line.fragment.glsl b/src/shaders/line.fragment.glsl index 7b4dba196af..e84f22f2182 100644 --- a/src/shaders/line.fragment.glsl +++ b/src/shaders/line.fragment.glsl @@ -5,14 +5,14 @@ uniform lowp float u_device_pixel_ratio; uniform float u_alpha_discard_threshold; uniform highp vec2 u_trim_offset; -varying vec2 v_width2; -varying vec2 v_normal; -varying float v_gamma_scale; -varying highp vec4 v_uv; +in vec2 v_width2; +in vec2 v_normal; +in float v_gamma_scale; +in highp vec4 v_uv; #ifdef RENDER_LINE_DASH uniform sampler2D u_dash_image; -varying vec2 v_tex; +in vec2 v_tex; #endif #ifdef RENDER_LINE_GRADIENT @@ -56,7 +56,7 @@ void main() { float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); #ifdef RENDER_LINE_DASH - float sdfdist = texture2D(u_dash_image, v_tex).a; + float sdfdist = texture(u_dash_image, v_tex).a; float sdfgamma = 1.0 / (2.0 * u_device_pixel_ratio) / dash.z; alpha *= linearstep(0.5 - sdfgamma / floorwidth, 0.5 + sdfgamma / floorwidth, sdfdist); #endif @@ -64,7 +64,7 @@ void main() { highp vec4 out_color; #ifdef RENDER_LINE_GRADIENT // For gradient lines, v_uv.xy are the coord specify where the texture will be simpled. - out_color = texture2D(u_gradient_image, v_uv.xy); + out_color = texture(u_gradient_image, v_uv.xy); #else out_color = color; #endif @@ -133,10 +133,10 @@ void main() { out_color = applyCutout(out_color); #endif - gl_FragColor = out_color; + glFragColor = out_color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/line.vertex.glsl b/src/shaders/line.vertex.glsl index 8fab8328b10..2abc326aee1 100644 --- a/src/shaders/line.vertex.glsl +++ b/src/shaders/line.vertex.glsl @@ -8,17 +8,17 @@ // #define scale 63.0 #define EXTRUDE_SCALE 0.015873016 -attribute vec2 a_pos_normal; -attribute vec4 a_data; +in vec2 a_pos_normal; +in vec4 a_data; // Includes in order: a_uv_x, a_split_index, a_clip_start, a_clip_end // to reduce attribute count on older devices. // Only line-gradient and line-trim-offset will requires a_packed info. #if defined(RENDER_LINE_GRADIENT) || defined(RENDER_LINE_TRIM_OFFSET) -attribute highp vec4 a_packed; +in highp vec4 a_packed; #endif #ifdef RENDER_LINE_DASH -attribute float a_linesofar; +in float a_linesofar; #endif uniform mat4 u_matrix; @@ -26,15 +26,15 @@ uniform mat2 u_pixels_to_tile_units; uniform vec2 u_units_to_pixels; uniform lowp float u_device_pixel_ratio; -varying vec2 v_normal; -varying vec2 v_width2; -varying float v_gamma_scale; -varying highp vec4 v_uv; +out vec2 v_normal; +out vec2 v_width2; +out float v_gamma_scale; +out highp vec4 v_uv; #ifdef RENDER_LINE_DASH uniform vec2 u_texsize; uniform float u_tile_units_to_pixels; -varying vec2 v_tex; +out vec2 v_tex; #endif #ifdef RENDER_LINE_GRADIENT diff --git a/src/shaders/line_pattern.fragment.glsl b/src/shaders/line_pattern.fragment.glsl index 5f9e0ff4bab..2902e307fe3 100644 --- a/src/shaders/line_pattern.fragment.glsl +++ b/src/shaders/line_pattern.fragment.glsl @@ -7,11 +7,11 @@ uniform float u_tile_units_to_pixels; uniform sampler2D u_image; -varying vec2 v_normal; -varying vec2 v_width2; -varying float v_linesofar; -varying float v_gamma_scale; -varying float v_width; +in vec2 v_normal; +in vec2 v_width2; +in float v_linesofar; +in float v_gamma_scale; +in float v_width; #pragma mapbox: define lowp vec4 pattern #pragma mapbox: define lowp float pixel_ratio @@ -50,7 +50,7 @@ void main() { vec2 texel_size = 1.0 / u_texsize; vec2 pos = mix(pattern_tl * texel_size - texel_size, pattern_br * texel_size + texel_size, vec2(x, y)); - vec4 color = texture2D(u_image, pos); + vec4 color = texture(u_image, pos); #ifdef LIGHTING_3D_MODE color = apply_lighting_ground(color); @@ -65,10 +65,10 @@ void main() { color = applyCutout(color); #endif - gl_FragColor = color; + glFragColor = color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/line_pattern.vertex.glsl b/src/shaders/line_pattern.vertex.glsl index c9147cc66d9..059ffe22f96 100644 --- a/src/shaders/line_pattern.vertex.glsl +++ b/src/shaders/line_pattern.vertex.glsl @@ -8,20 +8,20 @@ // #define scale 63.0 #define scale 0.015873016 -attribute vec2 a_pos_normal; -attribute vec4 a_data; -attribute float a_linesofar; +in vec2 a_pos_normal; +in vec4 a_data; +in float a_linesofar; uniform mat4 u_matrix; uniform vec2 u_units_to_pixels; uniform mat2 u_pixels_to_tile_units; uniform lowp float u_device_pixel_ratio; -varying vec2 v_normal; -varying vec2 v_width2; -varying float v_linesofar; -varying float v_gamma_scale; -varying float v_width; +out vec2 v_normal; +out vec2 v_width2; +out float v_linesofar; +out float v_gamma_scale; +out float v_width; #pragma mapbox: define lowp float blur #pragma mapbox: define lowp float opacity diff --git a/src/shaders/raster.fragment.glsl b/src/shaders/raster.fragment.glsl index f428de72a44..bd5bb57f1d3 100644 --- a/src/shaders/raster.fragment.glsl +++ b/src/shaders/raster.fragment.glsl @@ -6,9 +6,9 @@ uniform float u_fade_t; uniform float u_opacity; uniform highp float u_raster_elevation; -varying vec2 v_pos0; -varying vec2 v_pos1; -varying float v_depth; +in vec2 v_pos0; +in vec2 v_pos1; +in float v_depth; uniform float u_brightness_low; uniform float u_brightness_high; @@ -59,11 +59,11 @@ void main() { // Divide the scalar value by "alpha" to smoothly fade to no data if (value.y > 0.0) value.x /= value.y; #else - color = mix(texture2D(u_image0, v_pos0), texture2D(u_image1, v_pos1), u_fade_t); + color = mix(texture(u_image0, v_pos0), texture(u_image1, v_pos1), u_fade_t); value = vec2(u_colorization_offset + dot(color.rgb, u_colorization_mix.rgb), color.a); #endif - color = texture2D(u_color_ramp, vec2(value.x, 0.5)); + color = texture(u_color_ramp, vec2(value.x, 0.5)); // Apply input alpha on top of color ramp alpha if (color.a > 0.0) color.rgb /= color.a; @@ -72,8 +72,8 @@ void main() { #else // read and cross-fade colors from the main and parent tiles - color0 = texture2D(u_image0, v_pos0); - color1 = texture2D(u_image1, v_pos1); + color0 = texture(u_image0, v_pos0); + color1 = texture(u_image1, v_pos1); if (color0.a > 0.0) color0.rgb /= color0.a; if (color1.a > 0.0) color1.rgb /= color1.a; @@ -106,20 +106,20 @@ void main() { out_color = apply_lighting_with_emission_ground(vec4(out_color, 1.0), u_emissive_strength).rgb; #endif #ifdef FOG - float fog_limit_high_meters = 1000000.0; - float fog_limit_low_meters = 600000.0; + highp float fog_limit_high_meters = 1000000.0; + highp float fog_limit_low_meters = 600000.0; float fog_limit = 1.0 - smoothstep(fog_limit_low_meters, fog_limit_high_meters, u_raster_elevation); out_color = fog_dither(fog_apply(out_color, v_fog_pos, fog_limit)); #endif - gl_FragColor = vec4(out_color * color.a, color.a); + glFragColor = vec4(out_color * color.a, color.a); #ifdef RENDER_CUTOFF - gl_FragColor = gl_FragColor * cutoff_opacity(u_cutoff_params, v_depth); + glFragColor = glFragColor * cutoff_opacity(u_cutoff_params, v_depth); #endif #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/raster.vertex.glsl b/src/shaders/raster.vertex.glsl index 02e00536449..bfd8e294e4a 100644 --- a/src/shaders/raster.vertex.glsl +++ b/src/shaders/raster.vertex.glsl @@ -14,31 +14,27 @@ uniform vec4 u_tl_br; uniform float u_zoom_transition; uniform vec2 u_merc_center; +#define GLOBE_UPSCALE GLOBE_RADIUS / 6371008.8; + #ifdef GLOBE_POLES -attribute vec3 a_globe_pos; -attribute vec2 a_uv; +in vec3 a_globe_pos; +in vec2 a_uv; #elif defined(PROJECTION_GLOBE_VIEW) -attribute vec2 a_pos; +in vec2 a_pos; #else -attribute vec2 a_pos; -attribute vec2 a_texture_pos; +in vec2 a_pos; +in vec2 a_texture_pos; #endif -varying vec2 v_pos0; -varying vec2 v_pos1; -varying float v_depth; - -float getGlobeUpScale() { - float earth_radius = 6371008.8; - float globe_radius = EXTENT / HALF_PI; - return globe_radius / earth_radius; -} +out vec2 v_pos0; +out vec2 v_pos1; +out float v_depth; void main() { vec2 uv; #ifdef GLOBE_POLES vec3 globe_pos = a_globe_pos; - globe_pos += normalize(globe_pos) * u_raster_elevation * getGlobeUpScale(); + globe_pos += normalize(globe_pos) * u_raster_elevation * GLOBE_UPSCALE; gl_Position = u_matrix * u_globe_matrix * vec4(globe_pos , 1.0); uv = a_uv; #ifdef FOG @@ -61,7 +57,7 @@ void main() { vec2 merc_pos = vec2(mercatorX, mercatorY); uv = vec2(uvX, uvY); - globe_pos += normalize(globe_pos) * u_raster_elevation * getGlobeUpScale(); + globe_pos += normalize(globe_pos) * u_raster_elevation * GLOBE_UPSCALE; vec4 globe_world_pos = u_globe_matrix * vec4(globe_pos, 1.0); vec4 merc_world_pos = vec4(0.0); diff --git a/src/shaders/shaders.js b/src/shaders/shaders.js index 3638cb8cdce..7431e51908f 100644 --- a/src/shaders/shaders.js +++ b/src/shaders/shaders.js @@ -114,42 +114,8 @@ export const prelude = compile(preludeFrag, preludeVert); export const preludeCommonSource = preludeCommon; export const preludeLightingSource = preludeLighting; -export const preludeVertPrecisionQualifiers = ` -#ifdef GL_ES -precision highp float; -#else - -#if !defined(lowp) -#define lowp -#endif - -#if !defined(mediump) -#define mediump -#endif - -#if !defined(highp) -#define highp -#endif - -#endif`; -export const preludeFragPrecisionQualifiers = ` -#ifdef GL_ES -precision mediump float; -#else - -#if !defined(lowp) -#define lowp -#endif - -#if !defined(mediump) -#define mediump -#endif - -#if !defined(highp) -#define highp -#endif - -#endif`; +export const preludeVertPrecisionQualifiers = `precision highp float;`; +export const preludeFragPrecisionQualifiers = `precision mediump float;`; export default { background: compile(backgroundFrag, backgroundVert), @@ -216,15 +182,18 @@ export function parseUsedPreprocessorDefines(source, defines) { export function compile(fragmentSource, vertexSource) { const includeRegex = /#include\s+"([^"]+)"/g; const pragmaRegex = /#pragma mapbox: ([\w\-]+) ([\w]+) ([\w]+) ([\w]+)/g; - const attributeRegex = /attribute(\S*) (highp |mediump |lowp )?([\w]+) ([\w]+)/g; + const attributeRegex = /(attribute(\S*)|(^\s*|;)in) (highp |mediump |lowp )?([\w]+) ([\w]+)/gm; let staticAttributes = vertexSource.match(attributeRegex); - // remove duplicates as Safari does not support lookbehind in regex - // so we need to get rid of initialize-* expressions + if (staticAttributes) { - staticAttributes = staticAttributes.filter((element, index) => { - return staticAttributes.indexOf(element) === index; + staticAttributes = staticAttributes.map((str) => { + const tokens = str.split(' '); + return tokens[tokens.length - 1]; }); + // remove duplicates as Safari does not support lookbehind in regex + // so we need to get rid of initialize-* expressions + staticAttributes = [...new Set(staticAttributes)]; } const fragmentPragmas = {}; @@ -258,7 +227,7 @@ export function compile(fragmentSource, vertexSource) { if (operation === 'define') { return ` #ifndef HAS_UNIFORM_u_${name} -varying ${precision} ${type} ${name}; +in ${precision} ${type} ${name}; #else uniform ${precision} ${type} u_${name}; #endif @@ -272,7 +241,7 @@ uniform ${precision} ${type} u_${name}; } else if (operation === 'define-attribute') { return ` #ifdef HAS_ATTRIBUTE_a_${name} - varying ${precision} ${type} ${name}; + in ${precision} ${type} ${name}; #endif `; } else if (operation === 'initialize-attribute') { @@ -288,7 +257,7 @@ uniform ${precision} ${type} u_${name}; if (operation === 'define-attribute-vertex-shader-only') { return ` #ifdef HAS_ATTRIBUTE_a_${name} -attribute ${precision} ${type} a_${name}; +in ${precision} ${type} a_${name}; #endif `; } else if (fragmentPragmas[name]) { @@ -296,8 +265,8 @@ attribute ${precision} ${type} a_${name}; return ` #ifndef HAS_UNIFORM_u_${name} uniform lowp float u_${name}_t; -attribute ${precision} ${attrType} a_${name}; -varying ${precision} ${type} ${name}; +in ${precision} ${attrType} a_${name}; +out ${precision} ${type} ${name}; #else uniform ${precision} ${type} u_${name}; #endif @@ -324,8 +293,8 @@ uniform ${precision} ${type} u_${name}; } else if (operation === 'define-attribute') { return ` #ifdef HAS_ATTRIBUTE_a_${name} - attribute ${precision} ${type} a_${name}; - varying ${precision} ${type} ${name}; + in ${precision} ${type} a_${name}; + out ${precision} ${type} ${name}; #endif `; } else if (operation === 'initialize-attribute') { @@ -340,7 +309,7 @@ uniform ${precision} ${type} u_${name}; return ` #ifndef HAS_UNIFORM_u_${name} uniform lowp float u_${name}_t; -attribute ${precision} ${attrType} a_${name}; +in ${precision} ${attrType} a_${name}; #else uniform ${precision} ${type} u_${name}; #endif @@ -349,10 +318,10 @@ uniform ${precision} ${type} u_${name}; if (unpackType === 'mat4') { return ` #ifdef INSTANCED_ARRAYS -attribute vec4 a_${name}0; -attribute vec4 a_${name}1; -attribute vec4 a_${name}2; -attribute vec4 a_${name}3; +in vec4 a_${name}0; +in vec4 a_${name}1; +in vec4 a_${name}2; +in vec4 a_${name}3; #else uniform ${precision} ${type} u_${name}; #endif @@ -360,7 +329,7 @@ uniform ${precision} ${type} u_${name}; } else { return ` #ifdef INSTANCED_ARRAYS -attribute ${precision} ${attrType} a_${name}; +in ${precision} ${attrType} a_${name}; #else uniform ${precision} ${type} u_${name}; #endif diff --git a/src/shaders/skybox.fragment.glsl b/src/shaders/skybox.fragment.glsl index 9e603832143..d3bbf803d10 100644 --- a/src/shaders/skybox.fragment.glsl +++ b/src/shaders/skybox.fragment.glsl @@ -2,7 +2,7 @@ // [1] Banding in games http://loopit.dk/banding_in_games.pdf -varying lowp vec3 v_uv; +in lowp vec3 v_uv; uniform lowp samplerCube u_cubemap; uniform lowp float u_opacity; @@ -42,7 +42,7 @@ void main() { // (0.0,1.0) to (-1.0,1.0) on y. The inverse operation is applied when generating. uv.y = map(uv.y, 0.0, 1.0, -1.0, 1.0); - vec3 sky_color = textureCube(u_cubemap, uv).rgb; + vec3 sky_color = texture(u_cubemap, uv).rgb; #ifdef FOG // Apply fog contribution if enabled @@ -55,9 +55,9 @@ void main() { // Add sun disk sky_color += 0.1 * sun_disk(v_uv, u_sun_direction); - gl_FragColor = vec4(sky_color * u_opacity, u_opacity); + glFragColor = vec4(sky_color * u_opacity, u_opacity); #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif } diff --git a/src/shaders/skybox.vertex.glsl b/src/shaders/skybox.vertex.glsl index b4d4cfb8932..e2e3afc274c 100644 --- a/src/shaders/skybox.vertex.glsl +++ b/src/shaders/skybox.vertex.glsl @@ -1,8 +1,8 @@ -attribute highp vec3 a_pos_3f; +in highp vec3 a_pos_3f; uniform lowp mat4 u_matrix; -varying highp vec3 v_uv; +out highp vec3 v_uv; void main() { const mat3 half_neg_pi_around_x = mat3(1.0, 0.0, 0.0, diff --git a/src/shaders/skybox_capture.fragment.glsl b/src/shaders/skybox_capture.fragment.glsl index da483aff7b5..92ca1d11fd5 100644 --- a/src/shaders/skybox_capture.fragment.glsl +++ b/src/shaders/skybox_capture.fragment.glsl @@ -2,7 +2,7 @@ // [2] Earth Fact Sheet https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html // [3] Tonemapping Operators http://filmicworlds.com/blog/filmic-tonemapping-operators -varying highp vec3 v_position; +in highp vec3 v_position; uniform highp float u_sun_intensity; uniform highp float u_luminance; @@ -10,9 +10,7 @@ uniform lowp vec3 u_sun_direction; uniform highp vec4 u_color_tint_r; uniform highp vec4 u_color_tint_m; -#ifdef GL_ES precision highp float; -#endif // [1] equation (1) section 2.1. for λ = (680, 550, 440) nm, // which corresponds to scattering coefficients at sea level @@ -137,5 +135,5 @@ void main() { float white_scale = 1.0748724675633854; // 1.0 / uncharted2_tonemap(1000.0) color = uncharted2_tonemap((log2(2.0 / pow(u_luminance, 4.0))) * color) * white_scale; - gl_FragColor = vec4(color, 1.0); + glFragColor = vec4(color, 1.0); } diff --git a/src/shaders/skybox_capture.vertex.glsl b/src/shaders/skybox_capture.vertex.glsl index 6427e8c1951..202f0a42bb6 100644 --- a/src/shaders/skybox_capture.vertex.glsl +++ b/src/shaders/skybox_capture.vertex.glsl @@ -1,8 +1,8 @@ -attribute highp vec3 a_pos_3f; +in highp vec3 a_pos_3f; uniform mat3 u_matrix_3f; -varying highp vec3 v_position; +out highp vec3 v_position; float map(float value, float start, float end, float new_start, float new_end) { return ((value - start) * (new_end - new_start)) / (end - start) + new_start; diff --git a/src/shaders/skybox_gradient.fragment.glsl b/src/shaders/skybox_gradient.fragment.glsl index 63105808542..422cefefe8e 100644 --- a/src/shaders/skybox_gradient.fragment.glsl +++ b/src/shaders/skybox_gradient.fragment.glsl @@ -1,6 +1,6 @@ #include "_prelude_fog.fragment.glsl" -varying highp vec3 v_uv; +in highp vec3 v_uv; uniform lowp sampler2D u_color_ramp; uniform highp vec3 u_center_direction; @@ -10,7 +10,7 @@ uniform highp float u_temporal_offset; void main() { float progress = acos(dot(normalize(v_uv), u_center_direction)) / u_radius; - vec4 color = texture2D(u_color_ramp, vec2(progress, 0.5)); + vec4 color = texture(u_color_ramp, vec2(progress, 0.5)); #ifdef FOG // Apply fog contribution if enabled, make sure to un/post multiply alpha before/after @@ -24,9 +24,9 @@ void main() { // Dither color.rgb = dither(color.rgb, gl_FragCoord.xy + u_temporal_offset); - gl_FragColor = color; + glFragColor = color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif } diff --git a/src/shaders/stars.fragment.glsl b/src/shaders/stars.fragment.glsl index 19c36c57add..54519b95edf 100644 --- a/src/shaders/stars.fragment.glsl +++ b/src/shaders/stars.fragment.glsl @@ -1,5 +1,5 @@ -varying highp vec2 v_uv; -varying mediump float v_intensity; +in highp vec2 v_uv; +in mediump float v_intensity; // TODO: // - check other shapes compared to circle, e.g. astroid @@ -30,7 +30,7 @@ void main() { float alpha = shapeCircle(v_uv); vec3 color = vec3(1.0, 1.0, 1.0); alpha *= v_intensity; - gl_FragColor = vec4(color * alpha, alpha); + glFragColor = vec4(color * alpha, alpha); HANDLE_WIREFRAME_DEBUG; } diff --git a/src/shaders/stars.vertex.glsl b/src/shaders/stars.vertex.glsl index e72dddbbc92..0266e1e6252 100644 --- a/src/shaders/stars.vertex.glsl +++ b/src/shaders/stars.vertex.glsl @@ -1,11 +1,11 @@ // Position -attribute vec3 a_pos_3f; +in vec3 a_pos_3f; // Offset from center ([-1, -1], ...) -attribute vec2 a_uv; +in vec2 a_uv; // Per-star size multiplier -attribute float a_size_scale; +in float a_size_scale; // Per-star transparency multiplier -attribute float a_fade_opacity; +in float a_fade_opacity; // mvp uniform mat4 u_matrix; @@ -17,8 +17,8 @@ uniform vec3 u_right; // Global stars transparency multiplier uniform float u_intensity_multiplier; -varying highp vec2 v_uv; -varying mediump float v_intensity; +out highp vec2 v_uv; +out mediump float v_intensity; void main() { v_uv = a_uv; diff --git a/src/shaders/symbol_icon.fragment.glsl b/src/shaders/symbol_icon.fragment.glsl index f7189427ce3..63c3492e5b3 100644 --- a/src/shaders/symbol_icon.fragment.glsl +++ b/src/shaders/symbol_icon.fragment.glsl @@ -5,12 +5,14 @@ uniform sampler2D u_texture; uniform float u_icon_transition; #endif -varying float v_fade_opacity; -varying vec2 v_tex_a; +in float v_fade_opacity; +in vec2 v_tex_a; #ifdef ICON_TRANSITION -varying vec2 v_tex_b; +in vec2 v_tex_b; #endif +uniform mediump float u_icon_saturation; + #pragma mapbox: define lowp float opacity #pragma mapbox: define lowp float emissive_strength @@ -22,21 +24,24 @@ void main() { vec4 out_color; #ifdef ICON_TRANSITION - vec4 a = texture2D(u_texture, v_tex_a) * (1.0 - u_icon_transition); - vec4 b = texture2D(u_texture, v_tex_b) * u_icon_transition; + vec4 a = texture(u_texture, v_tex_a) * (1.0 - u_icon_transition); + vec4 b = texture(u_texture, v_tex_b) * u_icon_transition; out_color = (a + b) * alpha; #else - out_color = texture2D(u_texture, v_tex_a) * alpha; + out_color = texture(u_texture, v_tex_a) * alpha; +#endif +#ifdef SATURATION + vec3 luma = vec3(dot(out_color.rgb, vec3(0.2126, 0.7152, 0.0722))); + out_color.rgb = mix(luma, out_color.rgb, u_icon_saturation); #endif - #ifdef LIGHTING_3D_MODE out_color = apply_lighting_with_emission_ground(out_color, emissive_strength); #endif - gl_FragColor = out_color; + glFragColor = out_color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/symbol_icon.vertex.glsl b/src/shaders/symbol_icon.vertex.glsl index 715415935aa..7e734f1df8f 100644 --- a/src/shaders/symbol_icon.vertex.glsl +++ b/src/shaders/symbol_icon.vertex.glsl @@ -1,19 +1,19 @@ #include "_prelude_terrain.vertex.glsl" -attribute vec4 a_pos_offset; -attribute vec4 a_tex_size; -attribute vec4 a_pixeloffset; -attribute vec4 a_projected_pos; -attribute float a_fade_opacity; +in vec4 a_pos_offset; +in vec4 a_tex_size; +in vec4 a_pixeloffset; +in vec4 a_projected_pos; +in float a_fade_opacity; #ifdef Z_OFFSET -attribute float a_z_offset; +in float a_z_offset; #endif #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_globe_anchor; -attribute vec3 a_globe_normal; +in vec3 a_globe_anchor; +in vec3 a_globe_normal; #endif #ifdef ICON_TRANSITION -attribute vec2 a_texb; +in vec2 a_texb; #endif uniform bool u_is_size_zoom_constant; @@ -45,11 +45,11 @@ uniform vec3 u_ecef_origin; uniform mat4 u_tile_matrix; #endif -varying vec2 v_tex_a; +out vec2 v_tex_a; #ifdef ICON_TRANSITION -varying vec2 v_tex_b; +out vec2 v_tex_b; #endif -varying float v_fade_opacity; +out float v_fade_opacity; #pragma mapbox: define lowp float opacity #pragma mapbox: define lowp float emissive_strength diff --git a/src/shaders/symbol_sdf.fragment.glsl b/src/shaders/symbol_sdf.fragment.glsl index d6165acec27..13b1a8a7aba 100644 --- a/src/shaders/symbol_sdf.fragment.glsl +++ b/src/shaders/symbol_sdf.fragment.glsl @@ -8,11 +8,9 @@ uniform lowp float u_device_pixel_ratio; uniform bool u_is_text; uniform bool u_is_halo; -#if __VERSION__ >= 300 -flat varying float v_draw_halo; -#endif -varying vec2 v_data0; -varying vec3 v_data1; +flat in float v_draw_halo; +in vec2 v_data0; +in vec3 v_data1; #pragma mapbox: define highp vec4 fill_color #pragma mapbox: define highp vec4 halo_color @@ -42,19 +40,14 @@ void main() { highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); lowp float buff = (256.0 - 64.0) / 256.0; - bool draw_halo; -#if __VERSION__ >= 300 - draw_halo = v_draw_halo > 0.0; -#else - draw_halo = u_is_halo; -#endif + bool draw_halo = v_draw_halo > 0.0; if (draw_halo) { color = halo_color; gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); buff = (6.0 - halo_width / fontScale) / SDF_PX; } - lowp float dist = texture2D(u_texture, tex).a; + lowp float dist = texture(u_texture, tex).a; highp float gamma_scaled = gamma * gamma_scale; highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); @@ -64,10 +57,10 @@ void main() { out_color = apply_lighting_with_emission_ground(out_color, emissive_strength); #endif - gl_FragColor = out_color; + glFragColor = out_color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/symbol_sdf.vertex.glsl b/src/shaders/symbol_sdf.vertex.glsl index 5629aa16a1a..c1ba4f11a5f 100644 --- a/src/shaders/symbol_sdf.vertex.glsl +++ b/src/shaders/symbol_sdf.vertex.glsl @@ -1,16 +1,16 @@ #include "_prelude_terrain.vertex.glsl" -attribute vec4 a_pos_offset; -attribute vec4 a_tex_size; -attribute vec4 a_pixeloffset; -attribute vec4 a_projected_pos; -attribute float a_fade_opacity; +in vec4 a_pos_offset; +in vec4 a_tex_size; +in vec4 a_pixeloffset; +in vec4 a_projected_pos; +in float a_fade_opacity; #ifdef Z_OFFSET -attribute float a_z_offset; +in float a_z_offset; #endif #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_globe_anchor; -attribute vec3 a_globe_normal; +in vec3 a_globe_anchor; +in vec3 a_globe_normal; #endif // contents of a_size vary based on the type of property value @@ -47,11 +47,9 @@ uniform vec3 u_ecef_origin; uniform mat4 u_tile_matrix; #endif -#if __VERSION__ >= 300 -flat varying float v_draw_halo; -#endif -varying vec2 v_data0; -varying vec3 v_data1; +flat out float v_draw_halo; +out vec2 v_data0; +out vec3 v_data1; #pragma mapbox: define highp vec4 fill_color #pragma mapbox: define highp vec4 halo_color @@ -196,10 +194,8 @@ void main() { #endif float gamma_scale = gl_Position.w; -#if __VERSION__ >= 300 // Cast to float is required to fix a rendering error in Swiftshader v_draw_halo = (u_is_halo && float(gl_InstanceID) == 0.0) ? 1.0 : 0.0; -#endif v_data0 = a_tex / u_texsize; v_data1 = vec3(gamma_scale, size, out_fade_opacity); diff --git a/src/shaders/symbol_text_and_icon.fragment.glsl b/src/shaders/symbol_text_and_icon.fragment.glsl index 266ceb35177..7654498c48c 100644 --- a/src/shaders/symbol_text_and_icon.fragment.glsl +++ b/src/shaders/symbol_text_and_icon.fragment.glsl @@ -11,11 +11,9 @@ uniform highp float u_gamma_scale; uniform lowp float u_device_pixel_ratio; uniform bool u_is_halo; -#if __VERSION__ >= 300 -flat varying float v_draw_halo; -#endif -varying vec4 v_data0; -varying vec4 v_data1; +flat in float v_draw_halo; +in vec4 v_data0; +in vec4 v_data1; #pragma mapbox: define highp vec4 fill_color #pragma mapbox: define highp vec4 halo_color @@ -37,10 +35,10 @@ void main() { if (v_data1.w == ICON) { vec2 tex_icon = v_data0.zw; lowp float alpha = opacity * fade_opacity; - gl_FragColor = texture2D(u_texture_icon, tex_icon) * alpha; + glFragColor = texture(u_texture_icon, tex_icon) * alpha; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif return; } @@ -58,19 +56,14 @@ void main() { highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale); lowp float buff = (256.0 - 64.0) / 256.0; - bool draw_halo; -#if __VERSION__ >= 300 - draw_halo = v_draw_halo > 0.0; -#else - draw_halo = u_is_halo; -#endif + bool draw_halo = v_draw_halo > 0.0; if (draw_halo) { color = halo_color; gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale); buff = (6.0 - halo_width / fontScale) / SDF_PX; } - lowp float dist = texture2D(u_texture, tex).a; + lowp float dist = texture(u_texture, tex).a; highp float gamma_scaled = gamma * gamma_scale; highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist); @@ -80,10 +73,10 @@ void main() { out_color = apply_lighting_with_emission_ground(out_color, emissive_strength); #endif - gl_FragColor = out_color; + glFragColor = out_color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/symbol_text_and_icon.vertex.glsl b/src/shaders/symbol_text_and_icon.vertex.glsl index 7ef283181a5..ecb9dde6587 100644 --- a/src/shaders/symbol_text_and_icon.vertex.glsl +++ b/src/shaders/symbol_text_and_icon.vertex.glsl @@ -1,15 +1,15 @@ #include "_prelude_terrain.vertex.glsl" -attribute vec4 a_pos_offset; -attribute vec4 a_tex_size; -attribute vec4 a_projected_pos; -attribute float a_fade_opacity; +in vec4 a_pos_offset; +in vec4 a_tex_size; +in vec4 a_projected_pos; +in float a_fade_opacity; #ifdef Z_OFFSET -attribute float a_z_offset; +in float a_z_offset; #endif #ifdef PROJECTION_GLOBE_VIEW -attribute vec3 a_globe_anchor; -attribute vec3 a_globe_normal; +in vec3 a_globe_anchor; +in vec3 a_globe_normal; #endif // contents of a_size vary based on the type of property value @@ -47,11 +47,9 @@ uniform vec3 u_ecef_origin; uniform mat4 u_tile_matrix; #endif -#if __VERSION__ >= 300 -flat varying float v_draw_halo; -#endif -varying vec4 v_data0; -varying vec4 v_data1; +flat out float v_draw_halo; +out vec4 v_data0; +out vec4 v_data1; #pragma mapbox: define highp vec4 fill_color #pragma mapbox: define highp vec4 halo_color @@ -190,10 +188,8 @@ void main() { #endif float gamma_scale = gl_Position.w; -#if __VERSION__ >= 300 // Cast to float is required to fix a rendering error in Swiftshader v_draw_halo = (u_is_halo && float(gl_InstanceID) == 0.0) ? 1.0 : 0.0; -#endif v_data0.xy = a_tex / u_texsize; v_data0.zw = a_tex / u_texsize_icon; diff --git a/src/shaders/terrain_depth.fragment.glsl b/src/shaders/terrain_depth.fragment.glsl index 064ef75ff7a..004bce42d48 100644 --- a/src/shaders/terrain_depth.fragment.glsl +++ b/src/shaders/terrain_depth.fragment.glsl @@ -1,9 +1,7 @@ -#ifdef GL_ES precision highp float; -#endif -varying float v_depth; +in float v_depth; void main() { - gl_FragColor = pack_depth(v_depth); + glFragColor = pack_depth(v_depth); } diff --git a/src/shaders/terrain_depth.vertex.glsl b/src/shaders/terrain_depth.vertex.glsl index 3c87f9a65fd..f2ebb5cdc73 100644 --- a/src/shaders/terrain_depth.vertex.glsl +++ b/src/shaders/terrain_depth.vertex.glsl @@ -1,12 +1,12 @@ #include "_prelude_terrain.vertex.glsl" uniform mat4 u_matrix; -attribute vec2 a_pos; +in vec2 a_pos; -varying float v_depth; +out float v_depth; void main() { float elevation = elevation(a_pos); gl_Position = u_matrix * vec4(a_pos, elevation, 1.0); v_depth = gl_Position.z / gl_Position.w; -} \ No newline at end of file +} diff --git a/src/shaders/terrain_raster.fragment.glsl b/src/shaders/terrain_raster.fragment.glsl index 86f5e066508..48729e5b386 100644 --- a/src/shaders/terrain_raster.fragment.glsl +++ b/src/shaders/terrain_raster.fragment.glsl @@ -3,22 +3,22 @@ #include "_prelude_lighting.glsl" uniform sampler2D u_image0; -varying vec2 v_pos0; +in vec2 v_pos0; #ifdef FOG -varying float v_fog_opacity; +in float v_fog_opacity; #endif #ifdef RENDER_SHADOWS -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth; +in vec4 v_pos_light_view_0; +in vec4 v_pos_light_view_1; +in float v_depth; #endif uniform vec3 u_ground_shadow_factor; void main() { - vec4 image_color = texture2D(u_image0, v_pos0); + vec4 image_color = texture(u_image0, v_pos0); vec4 color; #ifdef LIGHTING_3D_MODE @@ -68,9 +68,9 @@ void main() { color = fog_dither(fog_apply_from_vert(color, v_fog_opacity)); #endif #endif - gl_FragColor = color; + glFragColor = color; #ifdef OVERDRAW_INSPECTOR - gl_FragColor = vec4(1.0); + glFragColor = vec4(1.0); #endif HANDLE_WIREFRAME_DEBUG; diff --git a/src/shaders/terrain_raster.vertex.glsl b/src/shaders/terrain_raster.vertex.glsl index b92cfb0528e..40e319158fb 100644 --- a/src/shaders/terrain_raster.vertex.glsl +++ b/src/shaders/terrain_raster.vertex.glsl @@ -4,20 +4,20 @@ uniform mat4 u_matrix; uniform float u_skirt_height; -attribute vec2 a_pos; +in vec2 a_pos; -varying vec2 v_pos0; +out vec2 v_pos0; #ifdef FOG -varying float v_fog_opacity; +out float v_fog_opacity; #endif #ifdef RENDER_SHADOWS uniform mat4 u_light_matrix_0; uniform mat4 u_light_matrix_1; -varying vec4 v_pos_light_view_0; -varying vec4 v_pos_light_view_1; -varying float v_depth; +out vec4 v_pos_light_view_0; +out vec4 v_pos_light_view_1; +out float v_depth; #endif void main() { diff --git a/src/source/raster_tile_source.js b/src/source/raster_tile_source.js index a0262d01ea8..eb3b2e77734 100644 --- a/src/source/raster_tile_source.js +++ b/src/source/raster_tile_source.js @@ -98,7 +98,7 @@ class RasterTileSource extends Evented implements Source { postTurnstileEvent(tileJSON.tiles); - // `content` is included here to prevent a race condition where `Style#_updateSources` is called + // `content` is included here to prevent a race condition where `Style#updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'})); diff --git a/src/source/source_cache.js b/src/source/source_cache.js index 03921f14bb5..9250bc78dcb 100644 --- a/src/source/source_cache.js +++ b/src/source/source_cache.js @@ -259,8 +259,19 @@ class SourceCache extends Evented { if (err) { tile.state = 'errored'; if ((err: any).status !== 404) this._source.fire(new ErrorEvent(err, {tile})); + // If the requested tile is missing, try to load the parent tile + // to use it as an overscaled tile instead of the missing one. else { - // continue to try loading parent/children tiles if a tile doesn't exist (404) + const hasParent = tile.tileID.key in this._loadedParentTiles; + // If there are no parent tiles to load, fire a `data` event to trigger map render + if (!hasParent) { + // We are firing an `error` source type event instead of `content` here because + // the `content` event will reload all tiles and trigger redundant source cache updates + this._source.fire(new Event('data', {dataType: 'source', sourceDataType: 'error', sourceId: this._source.id})); + return; + } + + // Otherwise, continue trying to load the parent tile until we find one that loads successfully const updateForTerrain = this._source.type === 'raster-dem' && this.usedForTerrain; if (updateForTerrain && this.map.painter.terrain) { const terrain = this.map.painter.terrain; diff --git a/src/source/vector_tile_source.js b/src/source/vector_tile_source.js index 7f534ddb1f3..b055e573513 100644 --- a/src/source/vector_tile_source.js +++ b/src/source/vector_tile_source.js @@ -122,7 +122,7 @@ class VectorTileSource extends Evented implements Source { if (tileJSON.bounds) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom); postTurnstileEvent(tileJSON.tiles, this.map._requestManager._customAccessToken); - // `content` is included here to prevent a race condition where `Style#_updateSources` is called + // `content` is included here to prevent a race condition where `Style#updateSources` is called // before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives // ref: https://github.com/mapbox/mapbox-gl-js/pull/4347#discussion_r104418088 this.fire(new Event('data', {dataType: 'source', sourceDataType: 'metadata'})); diff --git a/src/source/vector_tile_worker_source.js b/src/source/vector_tile_worker_source.js index 7eed1d87dcb..ed929bc83e9 100644 --- a/src/source/vector_tile_worker_source.js +++ b/src/source/vector_tile_worker_source.js @@ -277,6 +277,8 @@ class VectorTileWorkerSource extends Evented implements WorkerSource { done(); } } + } else { + callback(null, undefined); } } diff --git a/src/source/worker.js b/src/source/worker.js index d5d88679c21..f4442bdc6a4 100644 --- a/src/source/worker.js +++ b/src/source/worker.js @@ -26,7 +26,7 @@ import type { import type {WorkerGlobalScopeInterface} from '../util/web_worker.js'; import type {Callback} from '../types/callback.js'; import type {LayerSpecification, ProjectionSpecification} from '../style-spec/types.js'; -import type {Expression} from '../style-spec/expression/expression.js'; +import type {ConfigOptions} from '../style/properties.js'; import type {PluginState} from './rtl_text_plugin.js'; import type Projection from '../geo/projection/projection.js'; @@ -157,12 +157,12 @@ export default class Worker { callback(); } - setLayers(mapId: string, params: {layers: Array, scope: string, options: Map}, callback: WorkerTileCallback) { + setLayers(mapId: string, params: {layers: Array, scope: string, options: ConfigOptions}, callback: WorkerTileCallback) { this.getLayerIndex(mapId, params.scope).replace(params.layers, params.options); callback(); } - updateLayers(mapId: string, params: {layers: Array, scope: string, removedIds: Array, options: Map}, callback: WorkerTileCallback) { + updateLayers(mapId: string, params: {layers: Array, scope: string, removedIds: Array, options: ConfigOptions}, callback: WorkerTileCallback) { this.getLayerIndex(mapId, params.scope).update(params.layers, params.removedIds, params.options); callback(); } diff --git a/src/source/worker_tile.js b/src/source/worker_tile.js index d29b9b61b57..144a5304e0e 100644 --- a/src/source/worker_tile.js +++ b/src/source/worker_tile.js @@ -199,6 +199,7 @@ class WorkerTile { const maybePrepare = () => { if (error) { + this.status = 'done'; return callback(error); } else if (this.extraShadowCaster) { const m = PerformanceUtils.beginMeasure('parseTile2'); diff --git a/src/style-spec/expression/compound_expression.js b/src/style-spec/expression/compound_expression.js index 3232e9af5b2..f046091ca3d 100644 --- a/src/style-spec/expression/compound_expression.js +++ b/src/style-spec/expression/compound_expression.js @@ -21,17 +21,23 @@ class CompoundExpression implements Expression { type: Type; _evaluate: Evaluate; args: Array; + _overloadIndex: number; static definitions: {[_: string]: Definition }; - constructor(name: string, type: Type, evaluate: Evaluate, args: Array) { + constructor(name: string, type: Type, evaluate: Evaluate, args: Array, overloadIndex: number) { this.name = name; this.type = type; this._evaluate = evaluate; this.args = args; + this._overloadIndex = overloadIndex; } evaluate(ctx: EvaluationContext): Value { + if (!this._evaluate) { // restore evaluate function after transfer between threads + const definition = CompoundExpression.definitions[this.name]; + this._evaluate = Array.isArray(definition) ? definition[2] : definition.overloads[this._overloadIndex][1]; + } return this._evaluate(ctx, this.args); } @@ -62,14 +68,18 @@ class CompoundExpression implements Expression { [[definition[1], definition[2]]] : definition.overloads; - const overloads = availableOverloads.filter(([signature]) => ( - !Array.isArray(signature) || // varags - signature.length === args.length - 1 // correct param count - )); + const overloadParams = []; let signatureContext: ParsingContext = (null: any); - for (const [params, evaluate] of overloads) { + let overloadIndex = -1; + + for (const [params, evaluate] of availableOverloads) { + if (Array.isArray(params) && params.length !== args.length - 1) continue; // param count doesn't match + + overloadParams.push(params); + overloadIndex++; + // Use a fresh context for each attempted signature so that, if // we eventually succeed, we haven't polluted `context.errors`. signatureContext = new ParsingContext(context.registry, context.path, null, context.scope, undefined, context.options); @@ -111,19 +121,17 @@ class CompoundExpression implements Expression { } if (signatureContext.errors.length === 0) { - return new CompoundExpression(op, type, evaluate, parsedArgs); + return new CompoundExpression(op, type, evaluate, parsedArgs, overloadIndex); } } assert(!signatureContext || signatureContext.errors.length > 0); - if (overloads.length === 1) { + if (overloadParams.length === 1) { context.errors.push(...signatureContext.errors); } else { - const expected = overloads.length ? overloads : availableOverloads; - const signatures = expected - .map(([params]) => stringifySignature(params)) - .join(' | '); + const expected = overloadParams.length ? overloadParams : availableOverloads.map(([params]) => params); + const signatures = expected.map(stringifySignature).join(' | '); const actualTypes = []; // For error message, re-parse arguments without trying to diff --git a/src/style-spec/expression/definitions/index.js b/src/style-spec/expression/definitions/index.js index e8b9d137266..eb3ef860075 100644 --- a/src/style-spec/expression/definitions/index.js +++ b/src/style-spec/expression/definitions/index.js @@ -145,12 +145,57 @@ function get(key: string, obj: {[string]: any}) { return typeof v === 'undefined' ? null : v; } +function coerceValue(type: 'string' | 'number' | 'boolean' | 'color', value: any): any { + switch (type) { + case 'string': return String(value); + case 'number': return +value; + case 'boolean': return !!value; + case 'color': return Color.parse(value); + } + return value; +} + +function clampToAllowedNumber(value: number, min: number | void, max: number | void, step: number | void): number { + if (step !== undefined) { + value = step * Math.round(value / step); + } + if (min !== undefined && value < min) { + value = min; + } + if (max !== undefined && value > max) { + value = max; + } + return value; +} + function getConfig(ctx: EvaluationContext, key: string, scope: string) { if (scope.length) { key += `\u{1f}${scope}`; } - const v = ctx.getConfig(key); - return v ? v.evaluate(ctx) : null; + const config = ctx.getConfig(key); + if (!config) return null; + + const {type, value, values, minValue, maxValue, stepValue} = config; + + const defaultValue = config.default.evaluate(ctx); + let result = value ? value.evaluate(ctx) : defaultValue; + + if (type) result = coerceValue(type, result); + + if (value !== undefined && result !== undefined && values && !values.includes(result)) { + result = defaultValue; + if (type) result = coerceValue(type, result); + } + + if (result !== undefined && (minValue !== undefined || maxValue !== undefined || stepValue !== undefined)) { + if (typeof result === 'number') { + result = clampToAllowedNumber(result, minValue, maxValue, stepValue); + } else if (Array.isArray(result)) { + result = result.map((item) => typeof item === 'number' ? clampToAllowedNumber(item, minValue, maxValue, stepValue) : item); + } + } + + return result; } function binarySearch(v: any, a: {[number]: any}, i: number, j: number) { diff --git a/src/style-spec/expression/evaluation_context.js b/src/style-spec/expression/evaluation_context.js index 7a2ed3bc65e..1c0da6b9cfe 100644 --- a/src/style-spec/expression/evaluation_context.js +++ b/src/style-spec/expression/evaluation_context.js @@ -1,13 +1,13 @@ // @flow import {Color} from './values.js'; -import type {Expression} from './expression.js'; import type Point from '@mapbox/point-geometry'; import type {FormattedSection} from './types/formatted.js'; import type {GlobalProperties, Feature, FeatureState} from './index.js'; import type {CanonicalTileID} from '../../source/tile_id.js'; import type {FeatureDistanceData} from '../feature_filter/index.js'; +import type {ConfigOptions, ConfigOptionValue} from '../../style/properties.js'; const geometryTypes = ['Unknown', 'Point', 'LineString', 'Polygon']; @@ -20,11 +20,11 @@ class EvaluationContext { canonical: null | CanonicalTileID; featureTileCoord: ?Point; featureDistanceData: ?FeatureDistanceData; - options: ?Map; + options: ?ConfigOptions; _parseColorCache: {[_: string]: ?Color}; - constructor(options?: ?Map) { + constructor(options?: ?ConfigOptions) { this.globals = (null: any); this.feature = null; this.featureState = null; @@ -92,7 +92,7 @@ class EvaluationContext { return cached; } - getConfig(id: string): ?Expression { + getConfig(id: string): ?ConfigOptionValue { return this.options ? this.options.get(id) : null; } } diff --git a/src/style-spec/expression/index.js b/src/style-spec/expression/index.js index 6d7b2f83944..34176c310d6 100644 --- a/src/style-spec/expression/index.js +++ b/src/style-spec/expression/index.js @@ -33,6 +33,7 @@ import type {FormattedSection} from './types/formatted.js'; import type Point from '@mapbox/point-geometry'; import type {CanonicalTileID} from '../../source/tile_id.js'; import type {FeatureDistanceData} from '../feature_filter/index.js'; +import type {ConfigOptions} from '../../style/properties.js'; export interface Feature { +type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon'; @@ -64,7 +65,7 @@ export class StyleExpression { _warningHistory: {[key: string]: boolean}; _enumValues: ?{[_: string]: any}; - constructor(expression: Expression, propertySpec: ?StylePropertySpecification, options?: ?Map) { + constructor(expression: Expression, propertySpec: ?StylePropertySpecification, options?: ?ConfigOptions) { this.expression = expression; this._warningHistory = {}; this._evaluator = new EvaluationContext(options); @@ -131,7 +132,7 @@ export function isExpression(expression: mixed): boolean { * * @private */ -export function createExpression(expression: mixed, propertySpec: ?StylePropertySpecification, options?: ?Map): Result> { +export function createExpression(expression: mixed, propertySpec: ?StylePropertySpecification, options?: ?ConfigOptions): Result> { const parser = new ParsingContext(definitions, [], propertySpec ? getExpectedType(propertySpec) : undefined, undefined, undefined, options); // For string-valued properties, coerce to string at the top level rather than asserting. @@ -248,7 +249,7 @@ export type StylePropertyExpression = | CameraExpression | CompositeExpression; -export function createPropertyExpression(expression: mixed, propertySpec: StylePropertySpecification, options?: ?Map): Result> { +export function createPropertyExpression(expression: mixed, propertySpec: StylePropertySpecification, options?: ?ConfigOptions): Result> { expression = createExpression(expression, propertySpec, options); if (expression.result === 'error') { return expression; @@ -330,7 +331,7 @@ export class StylePropertyFunction { } } -export function normalizePropertyExpression(value: PropertyValueSpecification, specification: StylePropertySpecification, options?: ?Map): StylePropertyExpression { +export function normalizePropertyExpression(value: PropertyValueSpecification, specification: StylePropertySpecification, options?: ?ConfigOptions): StylePropertyExpression { if (isFunction(value)) { return (new StylePropertyFunction(value, specification): any); diff --git a/src/style-spec/expression/parsing_context.js b/src/style-spec/expression/parsing_context.js index 7a52c7e2664..ae99780dcec 100644 --- a/src/style-spec/expression/parsing_context.js +++ b/src/style-spec/expression/parsing_context.js @@ -16,6 +16,7 @@ import Var from './definitions/var.js'; import type {Expression, ExpressionRegistry} from './expression.js'; import type {Type} from './types.js'; +import type {ConfigOptions} from '../../style/properties.js'; /** * State associated parsing at a given point in an expression tree. @@ -27,7 +28,7 @@ class ParsingContext { key: string; scope: Scope; errors: Array; - options: ?Map; + options: ?ConfigOptions; // The expected type of this expression. Provided only to allow Expression // implementations to infer argument types: Expression#parse() need not @@ -41,7 +42,7 @@ class ParsingContext { expectedType: ?Type, scope: Scope = new Scope(), errors: Array = [], - options?: ?Map + options?: ?ConfigOptions ) { this.registry = registry; this.path = path; diff --git a/src/style-spec/package.json b/src/style-spec/package.json index cf30a3714e0..41f391b010c 100644 --- a/src/style-spec/package.json +++ b/src/style-spec/package.json @@ -1,7 +1,7 @@ { "name": "@mapbox/mapbox-gl-style-spec", "description": "a specification for mapbox gl styles", - "version": "14.1.0-beta.1", + "version": "14.1.0", "author": "Mapbox", "keywords": [ "mapbox", diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index 1b7043390d8..76cef8e24e8 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -92,13 +92,13 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } }, "terrain": { "type": "terrain", + "optional": true, "doc": "A global modifier that elevates layers and markers based on a DEM data source." }, "fog": { @@ -117,8 +117,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } }, @@ -129,8 +128,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } }, @@ -1101,8 +1099,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1112,8 +1109,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1123,8 +1119,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1134,8 +1129,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1145,8 +1139,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -1156,8 +1149,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } } }, @@ -1167,8 +1159,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1178,8 +1169,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -1199,8 +1189,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } } }, @@ -1220,8 +1209,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } } @@ -1248,8 +1236,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } }, @@ -1308,14 +1295,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1346,8 +1331,7 @@ "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1373,8 +1357,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1424,14 +1407,12 @@ "basic functionality": { "js": "1.2.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" }, "data-driven styling": { "js": "1.2.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" } }, "expression": { @@ -1459,14 +1440,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1483,14 +1462,12 @@ "basic functionality": { "js": "1.2.0", "android": "9.2.0", - "ios": "5.9.0", - "macos": "0.16.0" + "ios": "5.9.0" }, "data-driven styling": { "js": "1.2.0", "android": "9.2.0", - "ios": "5.9.0", - "macos": "0.16.0" + "ios": "5.9.0" } }, "expression": { @@ -1518,14 +1495,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1551,14 +1526,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1584,14 +1557,12 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1615,8 +1586,7 @@ "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1645,8 +1615,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "2.3.0" @@ -1680,14 +1649,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.40.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -1712,8 +1679,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -1737,8 +1703,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -1756,14 +1721,12 @@ "basic functionality": { "js": "1.2.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" }, "data-driven styling": { "js": "1.2.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" } }, "expression": { @@ -1791,14 +1754,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -1827,14 +1788,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "`line-center` value": { "js": "0.47.0", "android": "6.4.0", - "ios": "4.3.0", - "macos": "0.10.0" + "ios": "4.3.0" } }, "expression": { @@ -1860,8 +1819,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -1880,8 +1838,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -1899,14 +1856,12 @@ "basic functionality": { "js": "0.53.0", "android": "7.4.0", - "ios": "4.11.0", - "macos": "0.14.0" + "ios": "4.11.0" }, "data-driven styling": { "js": "0.53.0", "android": "7.4.0", - "ios": "4.11.0", - "macos": "0.14.0" + "ios": "4.11.0" } }, "expression": { @@ -1937,8 +1892,7 @@ "basic functionality": { "js": "0.49.0", "android": "6.6.0", - "ios": "4.5.0", - "macos": "0.12.0" + "ios": "4.5.0" } }, "expression": { @@ -1991,8 +1945,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2014,8 +1967,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2038,8 +1990,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2072,14 +2023,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "`auto` value": { "js": "0.25.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.3.0" + "ios": "3.4.0" } }, "expression": { @@ -2103,14 +2052,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.35.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -2148,14 +2095,12 @@ "basic functionality": { "js": "0.21.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.2.1" + "ios": "3.4.0" }, "stretchable icons": { "js": "1.6.0", "android": "9.2.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" }, "data-driven styling": { "js": "3.0.0", @@ -2199,8 +2144,7 @@ "basic functionality": { "js": "0.21.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.2.1" + "ios": "3.4.0" }, "data-driven styling": { "js": "3.0.0", @@ -2225,14 +2169,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.35.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -2257,14 +2199,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.21.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -2289,8 +2229,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2321,8 +2260,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2349,14 +2287,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -2408,14 +2344,12 @@ "basic functionality": { "js": "0.40.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" }, "data-driven styling": { "js": "0.40.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -2449,8 +2383,7 @@ "basic functionality": { "js": "0.39.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -2483,14 +2416,12 @@ "basic functionality": { "js": "0.21.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.2.1" + "ios": "3.4.0" }, "`auto` value": { "js": "0.25.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.3.0" + "ios": "3.4.0" } }, "expression": { @@ -2523,14 +2454,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "`auto` value": { "js": "0.25.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.3.0" + "ios": "3.4.0" } }, "expression": { @@ -2550,14 +2479,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -2584,14 +2511,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -2616,14 +2541,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.35.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -2653,14 +2576,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.40.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -2684,8 +2605,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "2.3.0", @@ -2714,14 +2634,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.40.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -2758,20 +2676,17 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.39.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" }, "auto": { "js": "0.54.0", "android": "7.4.0", - "ios": "4.10.0", - "macos": "0.14.0" + "ios": "4.10.0" } }, "expression": { @@ -2792,14 +2707,12 @@ "basic functionality": { "js": "0.54.0", "android": "7.4.0", - "ios": "4.10.0", - "macos": "0.14.0" + "ios": "4.10.0" }, "data-driven styling": { "js": "0.54.0", "android": "7.4.0", - "ios": "4.10.0", - "macos": "0.14.0" + "ios": "4.10.0" } }, "requires": [ @@ -2859,8 +2772,7 @@ "basic functionality": { "js": "0.54.0", "android": "7.4.0", - "ios": "4.10.0", - "macos": "0.14.0" + "ios": "4.10.0" } }, "expression": { @@ -2914,14 +2826,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.39.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -2951,8 +2861,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -2982,8 +2891,7 @@ "basic functionality": { "js": "1.3.0", "android": "8.3.0", - "ios": "5.3.0", - "macos": "0.15.0" + "ios": "5.3.0" } }, "expression": { @@ -3007,14 +2915,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.35.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -3039,8 +2945,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -3071,8 +2976,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -3105,14 +3009,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -3144,14 +3046,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.35.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -3174,8 +3074,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -3197,8 +3096,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -3221,8 +3119,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -3249,14 +3146,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -3282,14 +3177,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -3315,14 +3208,12 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "expressions support": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } }, "expression": { @@ -3552,8 +3443,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3564,8 +3454,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3576,8 +3465,7 @@ "basic functionality": { "js": "3.0.0", "android": "11.0.0", - "ios": "11.0.0", - "macos": "11.0.0" + "ios": "11.0.0" } } }, @@ -3588,8 +3476,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3600,8 +3487,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3612,8 +3498,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3624,8 +3509,7 @@ "basic functionality": { "js": "1.6.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" } } }, @@ -3658,8 +3542,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3670,8 +3553,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3682,8 +3564,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3694,8 +3575,7 @@ "basic functionality": { "js": "0.42.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3706,8 +3586,7 @@ "basic functionality": { "js": "0.42.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3736,8 +3615,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3748,8 +3626,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3760,8 +3637,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3772,8 +3648,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3784,8 +3659,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3796,8 +3670,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3808,8 +3681,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3820,8 +3692,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3832,8 +3703,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -3844,32 +3714,27 @@ "basic functionality": { "js": "0.48.0", "android": "6.7.0", - "ios": "4.6.0", - "macos": "0.12.0" + "ios": "4.6.0" }, "text-font": { "js": "0.48.0", "android": "6.7.0", - "ios": "4.6.0", - "macos": "0.12.0" + "ios": "4.6.0" }, "font-scale": { "js": "0.48.0", "android": "6.7.0", - "ios": "4.6.0", - "macos": "0.12.0" + "ios": "4.6.0" }, "text-color": { "js": "1.3.0", "android": "7.3.0", - "ios": "4.10.0", - "macos": "0.14.0" + "ios": "4.10.0" }, "image": { "js": "1.6.0", "android": "8.6.0", - "ios": "5.7.0", - "macos": "0.15.0" + "ios": "5.7.0" } } }, @@ -3880,8 +3745,7 @@ "basic functionality": { "js": "1.4.0", "android": "8.6.0", - "ios": "5.7.0", - "macos": "0.15.0" + "ios": "5.7.0" } } }, @@ -3892,8 +3756,7 @@ "basic functionality": { "js": "0.54.0", "android" : "8.4.0", - "ios": "5.4.0", - "macos": "0.15.0" + "ios": "5.4.0" } } }, @@ -3904,8 +3767,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3916,8 +3778,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3928,8 +3789,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3940,8 +3800,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3952,8 +3811,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3964,8 +3822,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -3976,8 +3833,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4010,8 +3866,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4022,8 +3877,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4034,8 +3888,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4046,8 +3899,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4069,8 +3921,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4081,8 +3932,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4093,8 +3943,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4138,8 +3987,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4150,8 +3998,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.6.0", - "macos": "0.12.0" + "ios": "4.6.0" } } }, @@ -4173,8 +4020,7 @@ "basic functionality": { "js": "0.53.0", "android": "8.4.0", - "ios": "5.5.0", - "macos": "0.15.0" + "ios": "5.5.0" } } }, @@ -4185,8 +4031,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4197,8 +4042,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4209,8 +4053,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4221,8 +4064,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4233,8 +4075,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4245,8 +4086,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4257,8 +4097,7 @@ "basic functionality": { "js": "0.42.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4269,8 +4108,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4281,8 +4119,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4293,8 +4130,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4305,8 +4141,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4317,8 +4152,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4329,8 +4163,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4341,8 +4174,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4353,8 +4185,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4365,8 +4196,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4377,8 +4207,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4389,8 +4218,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4401,8 +4229,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4413,8 +4240,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4425,8 +4251,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4437,8 +4262,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4449,8 +4273,7 @@ "basic functionality": { "js": "3.0.0", "android": "9.2.0", - "ios": "5.9.0", - "macos": "0.16.0" + "ios": "5.9.0" } } }, @@ -4461,14 +4284,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4479,14 +4300,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4497,14 +4316,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4515,14 +4332,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4533,14 +4348,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4551,14 +4364,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "collator": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4569,8 +4380,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4581,8 +4391,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4593,8 +4402,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4605,8 +4413,7 @@ "basic functionality": { "js": "1.9.0", "android": "9.1.0", - "ios": "5.8.0", - "macos": "0.15.0" + "ios": "5.8.0" } } }, @@ -4617,8 +4424,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.6.0", - "ios": "4.1.0", - "macos": "0.8.0" + "ios": "4.1.0" } } }, @@ -4629,8 +4435,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4641,8 +4446,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4653,8 +4457,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } } }, @@ -4665,8 +4468,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } } }, @@ -4964,8 +4766,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } } }, @@ -4996,8 +4797,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } } }, @@ -5017,8 +4817,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } } }, @@ -5040,8 +4839,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } } } @@ -5202,8 +5000,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -5225,14 +5022,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.21.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -5260,14 +5055,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.19.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -5297,14 +5090,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.19.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -5333,8 +5124,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -5364,8 +5154,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -5384,13 +5173,11 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.49.0", "android": "6.5.0", - "macos": "0.11.0", "ios": "4.4.0" } }, @@ -5442,8 +5229,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5468,14 +5254,12 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" }, "data-driven styling": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5504,8 +5288,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5535,8 +5318,7 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5555,13 +5337,11 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" }, "data-driven styling": { "js": "0.49.0", "android": "6.5.0", - "macos": "0.11.0", "ios": "4.4.0" } }, @@ -5585,14 +5365,12 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" }, "data-driven styling": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5619,14 +5397,12 @@ "basic functionality": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" }, "data-driven styling": { "js": "0.27.0", "android": "5.1.0", - "ios": "3.6.0", - "macos": "0.5.0" + "ios": "3.6.0" } }, "expression": { @@ -5648,8 +5424,7 @@ "basic functionality": { "js": "0.50.0", "android": "7.0.0", - "ios": "4.7.0", - "macos": "0.13.0" + "ios": "4.7.0" } }, "expression": { @@ -6054,14 +5829,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6089,14 +5862,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.23.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6125,8 +5896,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -6156,8 +5926,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -6179,14 +5948,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.39.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -6211,14 +5978,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6242,14 +6007,12 @@ "basic functionality": { "js": "0.12.1", "android": "3.0.0", - "ios": "3.1.0", - "macos": "0.1.0" + "ios": "3.1.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6274,14 +6037,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6311,8 +6072,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "2.3.0" @@ -6335,13 +6095,11 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.49.0", "android": "6.5.0", - "macos": "0.11.0", "ios": "4.4.0" } }, @@ -6390,8 +6148,7 @@ "basic functionality": { "js": "0.45.0", "android": "6.5.0", - "ios": "4.4.0", - "macos": "0.11.0" + "ios": "4.4.0" }, "data-driven styling": {} }, @@ -6424,8 +6181,7 @@ "basic functionality": { "js": "2.9.0", "android": "10.5.0", - "ios": "10.5.0", - "macos": "10.5.0" + "ios": "10.5.0" } }, "property-type": "constant" @@ -6526,14 +6282,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.18.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6556,14 +6310,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.18.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6586,14 +6338,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.20.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6618,14 +6368,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.20.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6654,8 +6402,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -6685,8 +6432,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -6713,8 +6459,7 @@ "basic functionality": { "js": "0.21.0", "android": "4.2.0", - "ios": "3.4.0", - "macos": "0.2.1" + "ios": "3.4.0" } }, "expression": { @@ -6741,8 +6486,7 @@ "basic functionality": { "js": "0.39.0", "android": "5.2.0", - "ios": "3.7.0", - "macos": "0.6.0" + "ios": "3.7.0" } }, "expression": { @@ -6764,14 +6508,12 @@ "basic functionality": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6794,14 +6536,12 @@ "basic functionality": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6826,14 +6566,12 @@ "basic functionality": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" }, "data-driven styling": { "js": "0.29.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -6886,14 +6624,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "data-driven styling": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -6917,14 +6653,12 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "data-driven styling": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -6948,8 +6682,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -6989,8 +6722,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" }, "data-driven styling": {} }, @@ -7013,8 +6745,7 @@ "basic functionality": { "js": "0.41.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -7041,14 +6772,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7136,14 +6865,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7169,14 +6896,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7204,14 +6929,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7239,14 +6962,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7278,8 +6999,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7310,8 +7030,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7366,14 +7085,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7400,14 +7117,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7433,14 +7148,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7468,14 +7181,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7503,14 +7214,12 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" }, "data-driven styling": { "js": "0.33.0", "android": "5.0.0", - "ios": "3.5.0", - "macos": "0.4.0" + "ios": "3.5.0" } }, "expression": { @@ -7542,8 +7251,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7574,8 +7282,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7585,6 +7292,26 @@ ] }, "property-type": "data-constant" + }, + "icon-color-saturation": { + "type": "number", + "default": 1, + "minimum": 0, + "maximum": 1, + "transition": true, + "units": "intensity", + "doc": "Controls saturation level of the symbol icon. With the default value of 1 the icon color is preserved while with a value of 0 it is fully desaturated and looks black and white.", + "sdk-support": { + "basic functionality": { + "js": "3.1.0", + "android": "11.1.0", + "ios": "11.1.0" + } + }, + "expression": { + "interpolated": false + }, + "property-type": "data-constant" } }, "paint_raster": { @@ -7599,8 +7326,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7710,8 +7436,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7733,8 +7458,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7756,8 +7480,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7779,8 +7502,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7802,8 +7524,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7830,8 +7551,7 @@ "basic functionality": { "js": "0.47.0", "android": "6.3.0", - "ios": "4.2.0", - "macos": "0.9.0" + "ios": "4.2.0" } }, "expression": { @@ -7853,8 +7573,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -7914,7 +7633,9 @@ "transition": true, "sdk-support": { "basic functionality": { - "js": "3.1.0" + "js": "3.1.0", + "android": "11.2.0", + "ios": "11.2.0" } }, "expression": { @@ -7938,8 +7659,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -7966,8 +7686,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -7989,8 +7708,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -8010,8 +7728,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -8032,8 +7749,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -8054,8 +7770,7 @@ "basic functionality": { "js": "0.43.0", "android": "6.0.0", - "ios": "4.0.0", - "macos": "0.7.0" + "ios": "4.0.0" } }, "expression": { @@ -8109,8 +7824,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -8129,8 +7843,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -8152,8 +7865,7 @@ "basic functionality": { "js": "0.10.0", "android": "2.0.1", - "ios": "2.0.0", - "macos": "0.1.0" + "ios": "2.0.0" } }, "expression": { @@ -8656,7 +8368,7 @@ "minimum": 0, "maximum": 5, "units": "intensity", - "doc": "Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are not supported when using GeoJSON or vector tile as the model layer source.", + "doc": "Strength of the emission. There is no emission for value 0. For value 1.0, only emissive component (no shading) is displayed and values above 1.0 produce light contribution to surrounding area, for some of the parts (e.g. doors). Expressions that depend on measure-light are only supported as a global layer value (and not for each feature) when using GeoJSON or vector tile as the model layer source.", "expression": { "interpolated": true, "parameters": ["feature", "feature-state", "measure-light"] diff --git a/src/style-spec/types.js b/src/style-spec/types.js index e1b1fd37319..c11b2b3ebbb 100644 --- a/src/style-spec/types.js +++ b/src/style-spec/types.js @@ -68,7 +68,7 @@ export type StyleSpecification = {| "pitch"?: number, "light"?: LightSpecification, "lights"?: Array, - "terrain"?: TerrainSpecification, + "terrain"?: ?TerrainSpecification, "fog"?: FogSpecification, "camera"?: CameraSpecification, "imports"?: Array, @@ -190,6 +190,19 @@ export type RasterDEMSourceSpecification = { [_: string]: mixed } +export type Raster_arraySourceSpecification = { + "type": "raster-array", + "url"?: string, + "tiles"?: Array, + "bounds"?: [number, number, number, number], + "minzoom"?: number, + "maxzoom"?: number, + "tileSize"?: number, + "attribution"?: string, + "rasterLayers"?: mixed, + [_: string]: mixed +} + export type GeoJSONSourceSpecification = {| "type": "geojson", "data"?: mixed, @@ -231,6 +244,7 @@ export type SourceSpecification = | VectorSourceSpecification | RasterSourceSpecification | RasterDEMSourceSpecification + | Raster_arraySourceSpecification | GeoJSONSourceSpecification | VideoSourceSpecification | ImageSourceSpecification @@ -410,7 +424,8 @@ export type SymbolLayerSpecification = {| "text-halo-width"?: DataDrivenPropertyValueSpecification, "text-halo-blur"?: DataDrivenPropertyValueSpecification, "text-translate"?: PropertyValueSpecification<[number, number]>, - "text-translate-anchor"?: PropertyValueSpecification<"map" | "viewport"> + "text-translate-anchor"?: PropertyValueSpecification<"map" | "viewport">, + "icon-color-saturation"?: ExpressionSpecification |} |} diff --git a/src/style-spec/validate/validate_property.js b/src/style-spec/validate/validate_property.js index 20a09ecf6c6..af73d95212d 100644 --- a/src/style-spec/validate/validate_property.js +++ b/src/style-spec/validate/validate_property.js @@ -6,7 +6,7 @@ import getType from '../util/get_type.js'; import {isFunction} from '../function/index.js'; import {unbundle, deepUnbundle} from '../util/unbundle_jsonlint.js'; import {supportsLightExpression, supportsPropertyExpression, supportsZoomExpression} from '../util/properties.js'; -import {isGlobalPropertyConstant} from '../expression/is_constant.js'; +import {isGlobalPropertyConstant, isFeatureConstant, isStateConstant} from '../expression/is_constant.js'; import type {ValidationOptions} from './validate.js'; import {createPropertyExpression} from '../expression/index.js'; @@ -67,8 +67,11 @@ export default function validateProperty(options: PropertyValidationOptions, pro // Performance related style spec limitation: zoom and light expressions are not allowed for e.g. trees. const expression = createPropertyExpression(deepUnbundle(value), valueSpec); const expressionObj = (expression.value: any).expression || (expression.value: any)._styleExpression.expression; + if (expressionObj && !isGlobalPropertyConstant(expressionObj, ['measure-light'])) { - errors.push(new ValidationError(key, value, `${propertyKey} does not support measure-light expressions when the model layer source is vector tile or GeoJSON.`)); + if (propertyKey !== 'model-emissive-strength' || (!isFeatureConstant(expressionObj) || !isStateConstant(expressionObj))) { + errors.push(new ValidationError(key, value, `${propertyKey} does not support measure-light expressions when the model layer source is vector tile or GeoJSON.`)); + } } } } diff --git a/src/style-spec/validate/validate_source.js b/src/style-spec/validate/validate_source.js index 789b4628ab6..aee36f5bbe9 100644 --- a/src/style-spec/validate/validate_source.js +++ b/src/style-spec/validate/validate_source.js @@ -26,20 +26,26 @@ export default function validateSource(options: ValidationOptions): Array): StyleLayer | CustomStyleLayer { +export default function createStyleLayer(layer: LayerSpecification | CustomLayerInterface, options?: ?ConfigOptions): StyleLayer | CustomStyleLayer { if (layer.type === 'custom') { return new CustomStyleLayer(layer); } else { diff --git a/src/style/properties.js b/src/style/properties.js index 6a68ee82bae..ebe4ce1f589 100644 --- a/src/style/properties.js +++ b/src/style/properties.js @@ -67,6 +67,17 @@ export interface Property { interpolate(a: R, b: R, t: number): R; } +export type ConfigOptionValue = { + default: Expression; + value?: Expression; + values?: Array; + minValue?: number; + maxValue?: number; + stepValue?: number; + type?: 'string' | 'number' | 'boolean' | 'color'; +}; +export type ConfigOptions = Map; + /** * `PropertyValue` represents the value part of a property key-value unit. It's used to represent both * paint and layout property values, and regardless of whether or not their property supports data-driven @@ -91,7 +102,7 @@ export class PropertyValue { value: PropertyValueSpecification | void; expression: StylePropertyExpression; - constructor(property: Property, value: PropertyValueSpecification | void, options?: ?Map) { + constructor(property: Property, value: PropertyValueSpecification | void, options?: ?ConfigOptions) { this.property = property; this.value = value; this.expression = normalizePropertyExpression(value === undefined ? property.specification.default : value, property.specification, options); @@ -130,7 +141,7 @@ class TransitionablePropertyValue { value: PropertyValue; transition: TransitionSpecification | void; - constructor(property: Property, options?: ?Map) { + constructor(property: Property, options?: ?ConfigOptions) { this.property = property; this.value = new PropertyValue(property, undefined, options); } @@ -165,10 +176,10 @@ type TransitionablePropertyValues export class Transitionable { _properties: Properties; _values: TransitionablePropertyValues; - _options: ?Map; + _options: ?ConfigOptions; isConfigDependent: boolean; - constructor(properties: Properties, options?: ?Map) { + constructor(properties: Properties, options?: ?ConfigOptions) { this._properties = properties; this._values = (Object.create(properties.defaultTransitionablePropertyValues): any); this._options = options; @@ -189,7 +200,7 @@ export class Transitionable { this.isConfigDependent = this.isConfigDependent || this._values[name].value.expression.isConfigDependent; } - setTransitionOrValue(properties: ?P, options?: ?Map) { + setTransitionOrValue(properties: ?P, options?: ?ConfigOptions) { if (options) this._options = options; const specProperties = this._properties.properties; @@ -392,10 +403,10 @@ type PropertyValueSpecifications export class Layout { _properties: Properties; _values: PropertyValues; - _options: ?Map; + _options: ?ConfigOptions; isConfigDependent: boolean; - constructor(properties: Properties, options?: ?Map) { + constructor(properties: Properties, options?: ?ConfigOptions) { this._properties = properties; this._values = (Object.create(properties.defaultPropertyValues): any); this._options = options; diff --git a/src/style/style.js b/src/style/style.js index 3f1dd257044..bd9f6050904 100644 --- a/src/style/style.js +++ b/src/style/style.js @@ -103,9 +103,8 @@ import type {QueryFeature} from '../util/vectortile_to_geojson.js'; import type {FeatureStates} from '../source/source_state.js'; import type {PointLike} from '@mapbox/point-geometry'; import type {Source, SourceClass} from '../source/source.js'; -import type {TransitionParameters} from './properties.js'; +import type {TransitionParameters, ConfigOptions} from './properties.js'; import ModelManager from '../../3d-style/render/model_manager.js'; -import type {Expression} from '../style-spec/expression/expression.js'; import {DEFAULT_MAX_ZOOM, DEFAULT_MIN_ZOOM} from '../geo/transform.js'; import type {QueryRenderedFeaturesParams} from '../source/query_features.js'; @@ -160,6 +159,7 @@ export type StyleOptions = { importDepth?: number, importsCache?: Map, resolvedImports?: Set, + config?: ?ConfigSpecification }; export type StyleSetterOptions = { @@ -193,6 +193,7 @@ class Style extends Evented { directionalLight: ?Lights; light: Light; terrain: ?Terrain; + disableElevatedTerrain: ?boolean; fog: ?Fog; camera: CameraSpecification; transition: TransitionSpecification; @@ -206,7 +207,7 @@ class Style extends Evented { // Keeps track of ancestors' Style URLs. resolvedImports: Set; - options: Map; + options: ConfigOptions; // Merged layers and sources _mergedOrder: Array; @@ -235,6 +236,7 @@ class Style extends Evented { _markersNeedUpdate: boolean; _brightness: ?number; _configDependentLayers: Set; + _config: ?ConfigSpecification; _buildingIndex: BuildingIndex; _transition: TransitionSpecification; @@ -328,6 +330,7 @@ class Style extends Evented { this.options = new Map(); this._configDependentLayers = new Set(); + this._config = options.config; this.dispatcher.broadcast('setReferrer', getReferrer()); @@ -424,8 +427,11 @@ class Style extends Evented { for (const importSpec of imports) { const style = this._createFragmentStyle(importSpec); - // Merge everything and update layers after the import style is loaded. - const waitForStyle = new Promise(resolve => style.once('style.import.load', resolve)) + // Merge everything and update layers after the import style is settled. + const waitForStyle = new Promise(resolve => { + style.once('style.import.load', resolve); + style.once('error', resolve); + }) .then(() => this.mergeAll()); waitForStyles.push(waitForStyle); @@ -474,13 +480,12 @@ class Style extends Evented { imageManager: this.imageManager, glyphManager: this.glyphManager, modelManager: this.modelManager, + config: importSpec.config }); // Bubble all events fired by the style to the map. style.setEventedParent(this.map, {style}); - style.setConfig(importSpec.config); - return style; } @@ -512,7 +517,7 @@ class Style extends Evented { return; } - this.updateSchema(schema); + this.setConfig(this._config, schema); if (validate && emitValidationErrors(this, validateStyle(json))) { return; @@ -577,8 +582,17 @@ class Style extends Evented { } const terrain = this.stylesheet.terrain; - if (terrain && !this.terrainSetForDrapingOnly()) { - this._createTerrain(terrain, DrapeRenderMode.elevated); + if (terrain) { + // This workaround disables terrain and hillshade + // if there is noise in the Canvas2D operations used for image decoding. + if (this.disableElevatedTerrain === undefined) + this.disableElevatedTerrain = browser.hasCanvasFingerprintNoise(); + + if (this.disableElevatedTerrain) { + warnOnce('Terrain and hillshade are disabled because of Canvas2D limitations when fingerprinting protection is enabled (e.g. in private browsing mode).'); + } else if (!this.terrainSetForDrapingOnly()) { + this._createTerrain(terrain, DrapeRenderMode.elevated); + } } if (this.stylesheet.fog) { @@ -612,6 +626,11 @@ class Style extends Evented { let transition; let camera; + // Reset terrain that might have been set by a previous merge + if (this.terrain && this.terrain.scope !== this.scope) { + delete this.terrain; + } + this.forEachFragmentStyle((style: Style) => { if (!style.stylesheet) return; @@ -628,14 +647,11 @@ class Style extends Evented { } } - const isGlobe = style.stylesheet.projection && style.stylesheet.projection.name === 'globe'; - if ((style.stylesheet.terrain || isGlobe) && style.terrain != null) { - const nextIsElevated = style.terrain.drapeRenderMode === DrapeRenderMode.elevated; - const prevIsDeffered = terrain && terrain.drapeRenderMode === DrapeRenderMode.deferred; - if (!terrain || prevIsDeffered || nextIsElevated) { - terrain = style.terrain; - } - } + terrain = this._prioritizeTerrain( + terrain, + style.terrain, + style.stylesheet.terrain, + ); if (style.stylesheet.fog && style.fog != null) fog = style.fog; @@ -654,9 +670,14 @@ class Style extends Evented { this.light = light; this.ambientLight = ambientLight; this.directionalLight = directionalLight; - this.terrain = terrain; this.fog = fog; + if (terrain === null) { + delete this.terrain; + } else { + this.terrain = terrain; + } + // Use perspective camera as a fallback if no camera is specified this.camera = camera || {'camera-projection': 'perspective'}; this.projection = projection || {name: 'mercator'}; @@ -678,20 +699,55 @@ class Style extends Evented { traverse(this); } + _prioritizeTerrain(prevTerrain: ?Terrain, nextTerrain: ?Terrain, nextTerrainSpec: ?TerrainSpecification): ?Terrain { + // Given the previous and next terrain during imports merging, in order of priority, we select: + // 1. null, if the next terrain is explicitly disabled and we are not using the globe + // 2. next terrain if it is not null + // 3. previous terrain + + const prevIsDeffered = prevTerrain && prevTerrain.drapeRenderMode === DrapeRenderMode.deferred; + const nextIsDeffered = nextTerrain && nextTerrain.drapeRenderMode === DrapeRenderMode.deferred; + + // Disable terrain if it was explicitly set to null and we are not using globe + if (nextTerrainSpec === null) { + // First, check if the terrain is deferred + // If so, we are using the globe and should keep the terrain + if (nextIsDeffered) return nextTerrain; + if (prevIsDeffered) return prevTerrain; + + return null; + } + + // Use next terrain if there is no previous terrain or if it is deferred + if (nextTerrain != null) { + const nextIsElevated = nextTerrain && nextTerrain.drapeRenderMode === DrapeRenderMode.elevated; + if (!prevTerrain || prevIsDeffered || nextIsElevated) return nextTerrain; + } + + return prevTerrain; + } + mergeTerrain() { let terrain; + // Reset terrain that might have been set by a previous merge + if (this.terrain && this.terrain.scope !== this.scope) { + delete this.terrain; + } + this.forEachFragmentStyle((style: Style) => { - if (style.terrain != null) { - const nextIsElevated = style.terrain.drapeRenderMode === DrapeRenderMode.elevated; - const prevIsDeffered = terrain && terrain.drapeRenderMode === DrapeRenderMode.deferred; - if (!terrain || prevIsDeffered || nextIsElevated) { - terrain = style.terrain; - } - } + terrain = this._prioritizeTerrain( + terrain, + style.terrain, + style.stylesheet.terrain, + ); }); - this.terrain = terrain; + if (terrain === null) { + delete this.terrain; + } else { + this.terrain = terrain; + } } mergeProjection() { @@ -1547,7 +1603,8 @@ class Style extends Evented { getConfigProperty(fragmentId: string, key: string): ?any { const fragmentStyle = this.getFragmentStyle(fragmentId); if (!fragmentStyle) return null; - const expression = fragmentStyle.options.get(key); + const expressions = fragmentStyle.options.get(key); + const expression = expressions ? expressions.value || expressions.default : null; return expression ? expression.serialize() : null; } @@ -1562,35 +1619,53 @@ class Style extends Evented { const fragmentStyle = this.getFragmentStyle(fragmentId); if (!fragmentStyle) return; - fragmentStyle.options.set(key, expression); + + const expressions = fragmentStyle.options.get(key); + if (!expressions) return; + + fragmentStyle.options.set(key, {...expressions, value: expression}); fragmentStyle.updateConfigDependencies(); } setConfig(config: ?ConfigSpecification, schema: ?SchemaSpecification) { - this.options.clear(); - if (!config) return; + this._config = config; - for (const key in config) { - const expressionParsed = createExpression(config[key]); - if (expressionParsed.result === 'success') { - this.options.set(key, expressionParsed.value.expression); - } - } + if (!config && !schema) return; - this.updateSchema(schema); - } + if (!schema) { + this.fire(new ErrorEvent(new Error(`Attempting to set config for a style without schema.`))); + return; + } - updateSchema(schema: ?SchemaSpecification) { - if (!schema) return; + this.options.clear(); for (const id in schema) { - // already set by config - if (this.options.has(id)) continue; + let defaultExpression; + let configExpression; const expression = schema[id].default; const expressionParsed = createExpression(expression); if (expressionParsed.result === 'success') { - this.options.set(id, expressionParsed.value.expression); + defaultExpression = expressionParsed.value.expression; + } + + if (config && config[id] !== undefined) { + const expressionParsed = createExpression(config[id]); + if (expressionParsed.result === 'success') { + configExpression = expressionParsed.value.expression; + } + } + + const {minValue, maxValue, stepValue, type, values} = schema[id]; + + if (defaultExpression) { + this.options.set(id, { + default: defaultExpression, + value: configExpression, + minValue, maxValue, stepValue, type, values + }); + } else { + this.fire(new ErrorEvent(new Error(`No schema defined for config option "${id}".`))); } } } @@ -2049,7 +2124,9 @@ class Style extends Evented { this._checkLoaded(); const terrain = this.getTerrain(); - const scopedTerrain = terrain && this.terrain && this.terrain.scope === this.scope ? terrain : undefined; + const scopedTerrain = terrain && this.terrain && this.terrain.scope === this.scope ? + terrain : + this.stylesheet.terrain; return filterObject({ version: this.stylesheet.version, @@ -2307,13 +2384,20 @@ class Style extends Evented { // Disabling if (!terrainOptions) { delete this.terrain; - delete this.stylesheet.terrain; + + if (terrainOptions === null) { + this.stylesheet.terrain = null; + } else { + delete this.stylesheet.terrain; + } + this._force3DLayerUpdate(); this._markersNeedUpdate = true; return; } let options: TerrainSpecification = terrainOptions; + const isUpdating = terrainOptions.source == null; if (drapeRenderMode === DrapeRenderMode.elevated) { // Input validation and source object unrolling if (typeof options.source === 'object') { @@ -2323,13 +2407,25 @@ class Style extends Evented { options = extend(options, {source: id}); } - if (this._validate(validateTerrain, 'terrain', options)) { + const validationOptions = extend({}, options); + const validationProps = {}; + + if (this.terrain && isUpdating) { + validationOptions.source = this.terrain.get().source; + + const fragmentStyle = this.terrain ? this.getFragmentStyle(this.terrain.scope) : null; + if (fragmentStyle) { + validationProps.style = fragmentStyle.serialize(); + } + } + + if (this._validate(validateTerrain, 'terrain', validationOptions, validationProps)) { return; } } // Enabling - if (!this.terrain || this.terrain.scope !== this.scope || (this.terrain && drapeRenderMode !== this.terrain.drapeRenderMode)) { + if (!this.terrain || (this.terrain.scope !== this.scope && !isUpdating) || (this.terrain && drapeRenderMode !== this.terrain.drapeRenderMode)) { if (!options) return; this._createTerrain(options, drapeRenderMode); this.fire(new Event('data', {dataType: 'style'})); @@ -2442,7 +2538,12 @@ class Style extends Evented { _createTerrain(terrainOptions: TerrainSpecification, drapeRenderMode: number) { const terrain = this.terrain = new Terrain(terrainOptions, drapeRenderMode, this.scope, this.options); - this.stylesheet.terrain = terrainOptions; + // We need to update the stylesheet only for the elevated mode, + // i.e., mock terrain shouldn't be propagated to the stylesheet + if (drapeRenderMode === DrapeRenderMode.elevated) { + this.stylesheet.terrain = terrainOptions; + } + this.mergeTerrain(); this.updateDrapeFirstLayers(); this._force3DLayerUpdate(); diff --git a/src/style/style_layer.js b/src/style/style_layer.js index 3d5a6e6eddd..e598eb869d1 100644 --- a/src/style/style_layer.js +++ b/src/style/style_layer.js @@ -16,11 +16,10 @@ import featureFilter from '../style-spec/feature_filter/index.js'; import {makeFQID} from '../util/fqid.js'; import type {FeatureState} from '../style-spec/expression/index.js'; -import type {Expression} from '../style-spec/expression/expression.js'; import type {Bucket} from '../data/bucket.js'; import type Point from '@mapbox/point-geometry'; import type {FeatureFilter, FilterExpression} from '../style-spec/feature_filter/index.js'; -import type {TransitionParameters, PropertyValue} from './properties.js'; +import type {TransitionParameters, PropertyValue, ConfigOptions} from './properties.js'; import type EvaluationParameters from './evaluation_parameters.js'; import type Transform from '../geo/transform.js'; import type { @@ -70,8 +69,9 @@ class StyleLayer extends Evented { _featureFilter: FeatureFilter; _filterCompiled: boolean; - options: ?Map; + options: ?ConfigOptions; _stats: ?LayerRenderingStats; + +queryRadius: (bucket: Bucket) => number; +queryIntersectsFeature: (queryGeometry: TilespaceQueryGeometry, feature: IVectorTileFeature, @@ -87,7 +87,7 @@ class StyleLayer extends Evented { +onRemove: ?(map: MapboxMap) => void; +isLayerDraped: ?(sourceCache: ?SourceCache) => boolean; - constructor(layer: LayerSpecification | CustomLayerInterface, properties: $ReadOnly<{layout?: Properties<*>, paint?: Properties<*>}>, options?: ?Map) { + constructor(layer: LayerSpecification | CustomLayerInterface, properties: $ReadOnly<{layout?: Properties<*>, paint?: Properties<*>}>, options?: ?ConfigOptions) { super(); this.id = layer.id; diff --git a/src/style/style_layer/background_style_layer.js b/src/style/style_layer/background_style_layer.js index ff7a161caff..f139469d4c9 100644 --- a/src/style/style_layer/background_style_layer.js +++ b/src/style/style_layer/background_style_layer.js @@ -7,15 +7,15 @@ import {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js import type {PaintProps} from './background_style_layer_properties.js'; import type {LayerSpecification} from '../../style-spec/types.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type {CreateProgramParams} from "../../render/painter.js"; +import type {ConfigOptions} from '../properties.js'; class BackgroundStyleLayer extends StyleLayer { _transitionablePaint: Transitionable; _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/src/style/style_layer/circle_style_layer.js b/src/style/style_layer/circle_style_layer.js index 6a579297f53..dff88a9962f 100644 --- a/src/style/style_layer/circle_style_layer.js +++ b/src/style/style_layer/circle_style_layer.js @@ -16,7 +16,6 @@ import {latFromMercatorY, mercatorZfromAltitude} from '../../geo/mercator_coordi import EXTENT from '../../style-spec/data/extent.js'; import type {FeatureState} from '../../style-spec/expression/index.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type Transform from '../../geo/transform.js'; import type {Bucket, BucketParameters} from '../../data/bucket.js'; import type {LayoutProps, PaintProps} from './circle_style_layer_properties.js'; @@ -27,6 +26,7 @@ import type {IVectorTileFeature} from '@mapbox/vector-tile'; import {circleDefinesValues} from '../../render/program/circle_program.js'; import type {CreateProgramParams} from "../../render/painter.js"; import type {DynamicDefinesType} from "../../render/program/program_uniforms.js"; +import type {ConfigOptions} from '../properties.js'; class CircleStyleLayer extends StyleLayer { _unevaluatedLayout: Layout; @@ -36,7 +36,7 @@ class CircleStyleLayer extends StyleLayer { _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/src/style/style_layer/fill_extrusion_style_layer.js b/src/style/style_layer/fill_extrusion_style_layer.js index 0f2b56ca421..89b5bcf9b29 100644 --- a/src/style/style_layer/fill_extrusion_style_layer.js +++ b/src/style/style_layer/fill_extrusion_style_layer.js @@ -12,7 +12,6 @@ import EXTENT from '../../style-spec/data/extent.js'; import {CanonicalTileID} from '../../source/tile_id.js'; import type {FeatureState} from '../../style-spec/expression/index.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type {BucketParameters} from '../../data/bucket.js'; import type {PaintProps, LayoutProps} from './fill_extrusion_style_layer_properties.js'; import type Transform from '../../geo/transform.js'; @@ -21,6 +20,7 @@ import type {TilespaceQueryGeometry} from '../query_geometry.js'; import type {DEMSampler} from '../../terrain/elevation.js'; import type {Vec2, Vec4} from 'gl-matrix'; import type {IVectorTileFeature} from '@mapbox/vector-tile'; +import type {ConfigOptions} from '../properties.js'; class Point3D extends Point { z: number; @@ -37,7 +37,7 @@ class FillExtrusionStyleLayer extends StyleLayer { paint: PossiblyEvaluated; layout: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); this._stats = {numRenderedVerticesInShadowPass : 0, numRenderedVerticesInTransparentPass: 0}; } diff --git a/src/style/style_layer/fill_style_layer.js b/src/style/style_layer/fill_style_layer.js index c7a00b64ed9..50f51b268da 100644 --- a/src/style/style_layer/fill_style_layer.js +++ b/src/style/style_layer/fill_style_layer.js @@ -10,7 +10,6 @@ import {Transitionable, Transitioning, Layout, PossiblyEvaluated} from '../prope import ProgramConfiguration from '../../data/program_configuration.js'; import type {FeatureState} from '../../style-spec/expression/index.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type {BucketParameters} from '../../data/bucket.js'; import type Point from '@mapbox/point-geometry'; import type {LayoutProps, PaintProps} from './fill_style_layer_properties.js'; @@ -20,6 +19,7 @@ import type {LayerSpecification} from '../../style-spec/types.js'; import type {TilespaceQueryGeometry} from '../query_geometry.js'; import type {IVectorTileFeature} from '@mapbox/vector-tile'; import type {CreateProgramParams} from "../../render/painter.js"; +import type {ConfigOptions} from '../properties.js'; class FillStyleLayer extends StyleLayer { _unevaluatedLayout: Layout; @@ -29,7 +29,7 @@ class FillStyleLayer extends StyleLayer { _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/src/style/style_layer/heatmap_style_layer.js b/src/style/style_layer/heatmap_style_layer.js index 0712cd872df..37162cc6e12 100644 --- a/src/style/style_layer/heatmap_style_layer.js +++ b/src/style/style_layer/heatmap_style_layer.js @@ -20,11 +20,11 @@ import ProgramConfiguration from '../../data/program_configuration.js'; import type {TilespaceQueryGeometry} from '../query_geometry.js'; import type {DEMSampler} from '../../terrain/elevation.js'; import type {FeatureState} from '../../style-spec/expression/index.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type Transform from '../../geo/transform.js'; import type CircleBucket from '../../data/bucket/circle_bucket.js'; import type {IVectorTileFeature} from '@mapbox/vector-tile'; import type {CreateProgramParams} from "../../render/painter.js"; +import type {ConfigOptions} from '../properties.js'; class HeatmapStyleLayer extends StyleLayer { @@ -40,7 +40,7 @@ class HeatmapStyleLayer extends StyleLayer { return new HeatmapBucket(parameters); } - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); // make sure color ramp texture is generated for default heatmap color too diff --git a/src/style/style_layer/hillshade_style_layer.js b/src/style/style_layer/hillshade_style_layer.js index 5dbdc62a5b0..365474d847d 100644 --- a/src/style/style_layer/hillshade_style_layer.js +++ b/src/style/style_layer/hillshade_style_layer.js @@ -7,15 +7,15 @@ import {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js import type {PaintProps} from './hillshade_style_layer_properties.js'; import type {LayerSpecification} from '../../style-spec/types.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type {CreateProgramParams} from "../../render/painter.js"; +import type {ConfigOptions} from '../properties.js'; class HillshadeStyleLayer extends StyleLayer { _transitionablePaint: Transitionable; _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/src/style/style_layer/line_style_layer.js b/src/style/style_layer/line_style_layer.js index 05a9686e94e..428d4499764 100644 --- a/src/style/style_layer/line_style_layer.js +++ b/src/style/style_layer/line_style_layer.js @@ -13,9 +13,8 @@ import {Transitionable, Transitioning, Layout, PossiblyEvaluated, DataDrivenProp import ProgramConfiguration from '../../data/program_configuration.js'; import Step from '../../style-spec/expression/definitions/step.js'; -import type {PossiblyEvaluatedValue, PropertyValue, PossiblyEvaluatedPropertyValue} from '../properties.js'; +import type {PossiblyEvaluatedValue, PropertyValue, PossiblyEvaluatedPropertyValue, ConfigOptions} from '../properties.js'; import type {Feature, FeatureState, ZoomConstantExpression, StylePropertyExpression} from '../../style-spec/expression/index.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; import type {Bucket, BucketParameters} from '../../data/bucket.js'; import type {LayoutProps, PaintProps} from './line_style_layer_properties.js'; import type Transform from '../../geo/transform.js'; @@ -58,7 +57,7 @@ class LineStyleLayer extends StyleLayer { _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); this.gradientVersion = 0; } diff --git a/src/style/style_layer/raster_style_layer.js b/src/style/style_layer/raster_style_layer.js index 9106fd72ed4..b4dfc7bae20 100644 --- a/src/style/style_layer/raster_style_layer.js +++ b/src/style/style_layer/raster_style_layer.js @@ -6,13 +6,13 @@ import properties from './raster_style_layer_properties.js'; import {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js'; import {renderColorRamp} from '../../util/color_ramp.js'; import {RGBAImage} from '../../util/image.js'; +import ImageSource from '../../source/image_source.js'; +import SourceCache from '../../source/source_cache.js'; import type {PaintProps} from './raster_style_layer_properties.js'; import type {LayerSpecification} from '../../style-spec/types.js'; import type Texture from '../../render/texture.js'; -import type {Expression} from '../../style-spec/expression/expression.js'; -import ImageSource from '../../source/image_source.js'; -import SourceCache from '../../source/source_cache.js'; +import type {ConfigOptions} from '../properties.js'; const COLOR_RAMP_RES = 256; @@ -24,7 +24,7 @@ class RasterStyleLayer extends StyleLayer { colorRamp: RGBAImage; colorRampTexture: ?Texture; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); this._updateColorRamp(); } diff --git a/src/style/style_layer/sky_style_layer.js b/src/style/style_layer/sky_style_layer.js index 8e1155eed97..36d78369fb9 100644 --- a/src/style/style_layer/sky_style_layer.js +++ b/src/style/style_layer/sky_style_layer.js @@ -4,6 +4,10 @@ import StyleLayer from '../style_layer.js'; import properties from './sky_style_layer_properties.js'; import {Transitionable, Transitioning, PossiblyEvaluated} from '../properties.js'; import {renderColorRamp} from '../../util/color_ramp.js'; +import {warnOnce, degToRad} from '../../util/util.js'; +import {vec3, quat} from 'gl-matrix'; +import assert from 'assert'; + import type {PaintProps} from './sky_style_layer_properties.js'; import type Texture from '../../render/texture.js'; import type Painter from '../../render/painter.js'; @@ -12,11 +16,7 @@ import type Framebuffer from '../../gl/framebuffer.js'; import type {RGBAImage} from '../../util/image.js'; import type SkyboxGeometry from '../../render/skybox_geometry.js'; import type {Position} from '../../util/util.js'; -import {warnOnce, degToRad} from '../../util/util.js'; -import {vec3, quat} from 'gl-matrix'; -import assert from 'assert'; - -import type {Expression} from '../../style-spec/expression/expression.js'; +import type {ConfigOptions} from '../properties.js'; function getCelestialDirection(azimuth: number, altitude: number, leftHanded: boolean) { const up = [0, 0, 1]; @@ -44,7 +44,7 @@ class SkyLayer extends StyleLayer { skyboxGeometry: SkyboxGeometry; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); this._updateColorRamp(); } diff --git a/src/style/style_layer/symbol_style_layer.js b/src/style/style_layer/symbol_style_layer.js index 39563b419e3..cabf49f92fd 100644 --- a/src/style/style_layer/symbol_style_layer.js +++ b/src/style/style_layer/symbol_style_layer.js @@ -6,9 +6,11 @@ import assert from 'assert'; import SymbolBucket from '../../data/bucket/symbol_bucket.js'; import resolveTokens from '../../util/resolve_tokens.js'; import properties from './symbol_style_layer_properties.js'; + import type {FormattedSection} from '../../style-spec/expression/types/formatted.js'; import type {FormattedSectionExpression} from '../../style-spec/expression/definitions/format.js'; import type {CreateProgramParams} from "../../render/painter.js"; +import type {ConfigOptions} from '../properties.js'; import { Transitionable, @@ -49,7 +51,7 @@ class SymbolStyleLayer extends StyleLayer { _transitioningPaint: Transitioning; paint: PossiblyEvaluated; - constructor(layer: LayerSpecification, options?: ?Map) { + constructor(layer: LayerSpecification, options?: ?ConfigOptions) { super(layer, properties, options); } diff --git a/src/style/style_layer/symbol_style_layer_properties.js b/src/style/style_layer/symbol_style_layer_properties.js index 80cd147fab3..8f1773571e6 100644 --- a/src/style/style_layer/symbol_style_layer_properties.js +++ b/src/style/style_layer/symbol_style_layer_properties.js @@ -131,6 +131,7 @@ export type PaintProps = {| "text-halo-blur": DataDrivenProperty, "text-translate": DataConstantProperty<[number, number]>, "text-translate-anchor": DataConstantProperty<"map" | "viewport">, + "icon-color-saturation": DataConstantProperty, |}; const paint: Properties = new Properties({ @@ -151,6 +152,7 @@ const paint: Properties = new Properties({ "text-halo-blur": new DataDrivenProperty(styleSpec["paint_symbol"]["text-halo-blur"]), "text-translate": new DataConstantProperty(styleSpec["paint_symbol"]["text-translate"]), "text-translate-anchor": new DataConstantProperty(styleSpec["paint_symbol"]["text-translate-anchor"]), + "icon-color-saturation": new DataConstantProperty(styleSpec["paint_symbol"]["icon-color-saturation"]), }); // Note: without adding the explicit type annotation, Flow infers weaker types diff --git a/src/style/style_layer_index.js b/src/style/style_layer_index.js index 045410d1333..a1e018b1286 100644 --- a/src/style/style_layer_index.js +++ b/src/style/style_layer_index.js @@ -7,7 +7,7 @@ import groupByLayout from '../style-spec/group_by_layout.js'; import type {TypedStyleLayer} from './style_layer/typed_style_layer.js'; import type {LayerSpecification} from '../style-spec/types.js'; -import type {Expression} from '../style-spec/expression/expression.js'; +import type {ConfigOptions} from './properties.js'; export type LayerConfigs = {[_: string]: LayerSpecification }; export type Family = Array; @@ -19,7 +19,7 @@ class StyleLayerIndex { _layerConfigs: LayerConfigs; _layers: {[_: string]: TypedStyleLayer }; - _options: ?Map; + _options: ?ConfigOptions; constructor(layerConfigs: ?Array) { this.keyCache = {}; @@ -30,13 +30,13 @@ class StyleLayerIndex { } } - replace(layerConfigs: Array, options?: ?Map) { + replace(layerConfigs: Array, options?: ?ConfigOptions) { this._layerConfigs = {}; this._layers = {}; this.update(layerConfigs, [], options); } - update(layerConfigs: Array, removedIds: Array, options: ?Map) { + update(layerConfigs: Array, removedIds: Array, options: ?ConfigOptions) { this._options = options; for (const layerConfig of layerConfigs) { diff --git a/src/style/terrain.js b/src/style/terrain.js index ec5444b68b4..ca6e9dd096b 100644 --- a/src/style/terrain.js +++ b/src/style/terrain.js @@ -5,8 +5,7 @@ import {Evented} from '../util/evented.js'; import {Properties, Transitionable, Transitioning, PossiblyEvaluated, DataConstantProperty} from './properties.js'; import EvaluationParameters from './evaluation_parameters.js'; -import type {Expression} from '../../src/style-spec/expression/expression.js'; -import type {TransitionParameters} from './properties.js'; +import type {ConfigOptions, TransitionParameters} from './properties.js'; import type {TerrainSpecification} from '../style-spec/types.js'; import {ZoomDependentExpression} from '../style-spec/expression/index.js'; @@ -32,7 +31,7 @@ class Terrain extends Evented { properties: PossiblyEvaluated; drapeRenderMode: number; - constructor(terrainOptions: TerrainSpecification, drapeRenderMode: number, scope: string, configOptions?: ?Map) { + constructor(terrainOptions: TerrainSpecification, drapeRenderMode: number, scope: string, configOptions?: ?ConfigOptions) { super(); this.scope = scope; this._transitionable = new Transitionable(properties, configOptions); @@ -45,7 +44,7 @@ class Terrain extends Evented { return (this._transitionable.serialize(): any); } - set(terrain: TerrainSpecification, configOptions?: ?Map) { + set(terrain: TerrainSpecification, configOptions?: ?ConfigOptions) { this._transitionable.setTransitionOrValue(terrain, configOptions); } diff --git a/src/symbol/shaping.js b/src/symbol/shaping.js index c20ff438a9a..e39bb585ab5 100644 --- a/src/symbol/shaping.js +++ b/src/symbol/shaping.js @@ -14,7 +14,6 @@ import {warnOnce} from '../util/util.js'; import type {StyleGlyph, GlyphMetrics} from '../style/style_glyph.js'; import {GLYPH_PBF_BORDER} from '../style/parse_glyph_pbf.js'; import type {ImagePosition} from '../render/image_atlas.js'; -import {IMAGE_PADDING} from '../render/image_atlas.js'; import type {GlyphRect, GlyphPositions} from '../render/glyph_atlas.js'; import Formatted, {FormattedSection} from '../style-spec/expression/types/formatted.js'; @@ -683,7 +682,7 @@ function shapeLines(shaping: Shaping, metrics = {width: size[0], height: size[1], - left: IMAGE_PADDING, + left: 0, top: -GLYPH_PBF_BORDER, advance: vertical ? size[1] : size[0], localGlyph: false}; diff --git a/src/ui/events.js b/src/ui/events.js index ab85e0c7126..ea1277e422a 100644 --- a/src/ui/events.js +++ b/src/ui/events.js @@ -409,7 +409,7 @@ export type MapBoxZoomEvent = { * @property {Object} [source] The [style spec representation of the source](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) if the event has a `dataType` of `source`. * @property {string} [sourceId] The `id` of the [`source`](https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/) that triggered the event, if the event has a `dataType` of `source`. Same as the `id` of the object in the `source` property. * @property {string} [sourceDataType] Included if the event has a `dataType` of `source` and the event signals - * that internal data has been received or changed. Possible values are `metadata`, `content` and `visibility`. + * that internal data has been received or changed. Possible values are `metadata`, `content`, `visibility`, and `error`. * @property {Object} [tile] The tile being loaded or changed, if the event has a `dataType` of `source` and * the event is related to loading of a tile. * @property {Coordinate} [coord] The coordinate of the tile if the event has a `dataType` of `source` and diff --git a/src/ui/map.js b/src/ui/map.js index 5582fbdff1d..79609ff5d14 100755 --- a/src/ui/map.js +++ b/src/ui/map.js @@ -2053,7 +2053,12 @@ class Map extends Camera { return this.style.loaded(); } - _isValidId(id: string): boolean { + _isValidId(id: ?string): boolean { + if (id == null) { + this.fire(new ErrorEvent(new Error(`IDs can't be empty.`))); + return false; + } + // Disallow using fully qualified IDs in the public APIs if (isFQID(id)) { this.fire(new ErrorEvent(new Error(`IDs can't contain special symbols: "${id}".`))); @@ -3040,6 +3045,7 @@ class Map extends Camera { * * @param {TerrainSpecification} terrain Terrain properties to set. Must conform to the [Terrain Style Specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/terrain/). * If `null` or `undefined` is provided, function removes terrain. + * Exaggeration could be updated for the existing terrain without explicitly specifying the `source`. * @returns {Map} Returns itself to allow for method chaining. * @example * map.addSource('mapbox-dem', { @@ -3050,6 +3056,8 @@ class Map extends Camera { * }); * // add the DEM source as a terrain layer with exaggerated height * map.setTerrain({'source': 'mapbox-dem', 'exaggeration': 1.5}); + * // update the exaggeration for the existing terrain + * map.setTerrain({'exaggeration': 2}); */ setTerrain(terrain: TerrainSpecification): this { this._lazyInitEmptyStyle(); @@ -3591,7 +3599,7 @@ class Map extends Camera { if (this.style && this._sourcesDirty) { this._sourcesDirty = false; this.painter._updateFog(this.style); - this._updateTerrain(); // Terrain DEM source updates here and skips update in style._updateSources. + this._updateTerrain(); // Terrain DEM source updates here and skips update in Style#updateSources. averageElevationChanged = this._updateAverageElevation(frameStartTime); this.style.updateSources(this.transform); // Update positions of markers and popups on enabling/disabling terrain @@ -3693,7 +3701,7 @@ class Map extends Camera { // // Even though `_styleDirty` and `_sourcesDirty` are reset in this // method, synchronous events fired during Style#update or - // Style#_updateSources could have caused them to be set again. + // Style#updateSources could have caused them to be set again. const somethingDirty = this._sourcesDirty || this._styleDirty || this._placementDirty || averageElevationChanged; if (somethingDirty || this._repaint) { this.triggerRepaint(); diff --git a/src/util/browser.js b/src/util/browser.js index 4a0a70e903e..122d0876b38 100755 --- a/src/util/browser.js +++ b/src/util/browser.js @@ -1,6 +1,7 @@ // @flow strict - +import assert from 'assert'; import window from './window.js'; +import offscreenCanvasSupported from './offscreen_canvas_supported.js'; import type {Cancelable} from '../types/cancelable.js'; let linkEl; @@ -75,6 +76,32 @@ const exported = { } return reducedMotionQuery.matches; }, + + /** + * Returns true if the browser has OffscreenCanvas support and + * adds noise to Canvas2D operations used for image decoding to prevent fingerprinting. + */ + hasCanvasFingerprintNoise(): boolean { + if (!offscreenCanvasSupported()) return false; + assert(window.OffscreenCanvas, 'OffscreenCanvas is not supported'); + + const offscreenCanvas = new window.OffscreenCanvas(255 / 3, 1); + const offscreenCanvasContext = offscreenCanvas.getContext('2d', {willReadFrequently: true}); + let inc = 0; + // getImageData is lossy with premultiplied alpha. + for (let i = 0; i < offscreenCanvas.width; ++i) { + offscreenCanvasContext.fillStyle = `rgba(${inc++},${inc++},${inc++}, 255)`; + offscreenCanvasContext.fillRect(i, 0, 1, 1); + } + const readData = offscreenCanvasContext.getImageData(0, 0, offscreenCanvas.width, offscreenCanvas.height); + inc = 0; + for (let i = 0; i < readData.data.length; ++i) { + if (i % 4 !== 3 && inc++ !== readData.data[i]) { + return true; + } + } + return false; + } }; export default exported; diff --git a/src/util/offscreen_canvas_supported.js b/src/util/offscreen_canvas_supported.js index d487218e937..b1b242bc4fc 100644 --- a/src/util/offscreen_canvas_supported.js +++ b/src/util/offscreen_canvas_supported.js @@ -1,4 +1,4 @@ -// @flow +// @flow strict import window from './window.js'; let supportsOffscreenCanvas: ?boolean; diff --git a/test/fixtures/expected/text-shaping-images-horizontal.json b/test/fixtures/expected/text-shaping-images-horizontal.json index 3ee3d178238..1555dbf6016 100644 --- a/test/fixtures/expected/text-shaping-images-horizontal.json +++ b/test/fixtures/expected/text-shaping-images-horizontal.json @@ -87,7 +87,7 @@ "metrics": { "width": 14, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false @@ -112,7 +112,7 @@ "metrics": { "width": 30, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 30, "localGlyph": false @@ -142,7 +142,7 @@ "metrics": { "width": 14, "height": 30, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false @@ -167,7 +167,7 @@ "metrics": { "width": 14, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false diff --git a/test/fixtures/expected/text-shaping-images-vertical.json b/test/fixtures/expected/text-shaping-images-vertical.json index 00f451b1814..42a66ad5b83 100644 --- a/test/fixtures/expected/text-shaping-images-vertical.json +++ b/test/fixtures/expected/text-shaping-images-vertical.json @@ -39,7 +39,7 @@ "metrics": { "width": 14, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false @@ -64,7 +64,7 @@ "metrics": { "width": 30, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false @@ -94,7 +94,7 @@ "metrics": { "width": 14, "height": 30, - "left": 1, + "left": 0, "top": -3, "advance": 30, "localGlyph": false @@ -119,7 +119,7 @@ "metrics": { "width": 14, "height": 14, - "left": 1, + "left": 0, "top": -3, "advance": 14, "localGlyph": false diff --git a/test/fixtures/fontstack-glyphs.json b/test/fixtures/fontstack-glyphs.json index ee6156be659..6dfb23d81a1 100644 --- a/test/fixtures/fontstack-glyphs.json +++ b/test/fixtures/fontstack-glyphs.json @@ -940,7 +940,7 @@ "metrics": { "width": 12, "height": 14, - "left": 1, + "left": 0, "top": -13, "advance": 14 }, diff --git a/test/integration/render-tests/imports/config-max-value/expected.png b/test/integration/render-tests/imports/config-max-value/expected.png new file mode 100644 index 00000000000..a1ab5719241 Binary files /dev/null and b/test/integration/render-tests/imports/config-max-value/expected.png differ diff --git a/test/integration/render-tests/imports/config-max-value/style.json b/test/integration/render-tests/imports/config-max-value/style.json new file mode 100644 index 00000000000..b27bd33ebd2 --- /dev/null +++ b/test/integration/render-tests/imports/config-max-value/style.json @@ -0,0 +1,45 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 32 + } + }, + "sources": {}, + "layers": [], + "imports": [{ + "id": "basemap", + "url": "", + "config": { + "width": 10 + }, + "data": { + "version": 8, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": { + "width": { + "default": 1, + "maxValue": 5 + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "LineString", + "coordinates": [[-15, 0], [15, 0]] + } + } + }, + "layers": [{ + "id": "line", + "type": "line", + "source": "geojson", + "paint": { + "line-width": ["config", "width"] + } + }] + } + }] +} diff --git a/test/integration/render-tests/imports/config-min-value/expected.png b/test/integration/render-tests/imports/config-min-value/expected.png new file mode 100644 index 00000000000..a1ab5719241 Binary files /dev/null and b/test/integration/render-tests/imports/config-min-value/expected.png differ diff --git a/test/integration/render-tests/imports/config-min-value/style.json b/test/integration/render-tests/imports/config-min-value/style.json new file mode 100644 index 00000000000..9f6813d99b6 --- /dev/null +++ b/test/integration/render-tests/imports/config-min-value/style.json @@ -0,0 +1,45 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 32 + } + }, + "sources": {}, + "layers": [], + "imports": [{ + "id": "basemap", + "url": "", + "config": { + "width": 1 + }, + "data": { + "version": 8, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": { + "width": { + "default": 10, + "minValue": 5 + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "LineString", + "coordinates": [[-15, 0], [15, 0]] + } + } + }, + "layers": [{ + "id": "line", + "type": "line", + "source": "geojson", + "paint": { + "line-width": ["config", "width"] + } + }] + } + }] +} diff --git a/test/integration/render-tests/imports/config-step-value/expected.png b/test/integration/render-tests/imports/config-step-value/expected.png new file mode 100644 index 00000000000..a1ab5719241 Binary files /dev/null and b/test/integration/render-tests/imports/config-step-value/expected.png differ diff --git a/test/integration/render-tests/imports/config-step-value/style.json b/test/integration/render-tests/imports/config-step-value/style.json new file mode 100644 index 00000000000..166a806031b --- /dev/null +++ b/test/integration/render-tests/imports/config-step-value/style.json @@ -0,0 +1,45 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 32 + } + }, + "sources": {}, + "layers": [], + "imports": [{ + "id": "basemap", + "url": "", + "config": { + "width": 7 + }, + "data": { + "version": 8, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": { + "width": { + "default": 10, + "stepValue": 5 + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "LineString", + "coordinates": [[-15, 0], [15, 0]] + } + } + }, + "layers": [{ + "id": "line", + "type": "line", + "source": "geojson", + "paint": { + "line-width": ["config", "width"] + } + }] + } + }] +} diff --git a/test/integration/render-tests/imports/config-values/expected.png b/test/integration/render-tests/imports/config-values/expected.png new file mode 100644 index 00000000000..dda232c85ce Binary files /dev/null and b/test/integration/render-tests/imports/config-values/expected.png differ diff --git a/test/integration/render-tests/imports/config-values/style.json b/test/integration/render-tests/imports/config-values/style.json new file mode 100644 index 00000000000..84ac67d955d --- /dev/null +++ b/test/integration/render-tests/imports/config-values/style.json @@ -0,0 +1,59 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 32 + } + }, + "sources": {}, + "layers": [], + "imports": [{ + "id": "basemap", + "url": "", + "config": { + "width": 5, + "width2": 3 + }, + "data": { + "version": 8, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": { + "width": { + "default": 10, + "values": [1, 2, 3, 4] + }, + "width2": { + "default": 10, + "values": [1, 2, 3, 4] + } + }, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "LineString", + "coordinates": [[-15, 0], [15, 0]] + } + } + }, + "layers": [{ + "id": "line", + "type": "line", + "source": "geojson", + "paint": { + "line-width": ["config", "width"], + "line-offset": -6 + } + }, { + "id": "line2", + "type": "line", + "source": "geojson", + "paint": { + "line-width": ["config", "width2"], + "line-offset": 6 + } + }] + } + }] +} diff --git a/test/integration/render-tests/imports/nullable-terrain-globe/expected.png b/test/integration/render-tests/imports/nullable-terrain-globe/expected.png new file mode 100644 index 00000000000..0a1c3f44f72 Binary files /dev/null and b/test/integration/render-tests/imports/nullable-terrain-globe/expected.png differ diff --git a/test/integration/render-tests/imports/nullable-terrain-globe/style.json b/test/integration/render-tests/imports/nullable-terrain-globe/style.json new file mode 100644 index 00000000000..cb295b69561 --- /dev/null +++ b/test/integration/render-tests/imports/nullable-terrain-globe/style.json @@ -0,0 +1,47 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.002 + } + }, + "center": [0, 50], + "zoom": 1.5, + "sources": {}, + "layers": [], + "terrain": null, + "imports": [ + { + "id": "basemap", + "url": "", + "data": { + "version": 8, + "projection": { + "name": "globe" + }, + "fog": {}, + "sources": { + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "tileSize": 256 + } + }, + "layers": [ + { + "id": "satellite", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + } + ] + } + } + ] +} diff --git a/test/integration/render-tests/imports/nullable-terrain/expected.png b/test/integration/render-tests/imports/nullable-terrain/expected.png new file mode 100644 index 00000000000..2b9b9a625df Binary files /dev/null and b/test/integration/render-tests/imports/nullable-terrain/expected.png differ diff --git a/test/integration/render-tests/imports/nullable-terrain/style.json b/test/integration/render-tests/imports/nullable-terrain/style.json new file mode 100644 index 00000000000..93e44be3773 --- /dev/null +++ b/test/integration/render-tests/imports/nullable-terrain/style.json @@ -0,0 +1,56 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 512, + "width": 512, + "allowed": 0.001 + } + }, + "center": [72.42, 37.062], + "zoom": 5.1, + "pitch": 70, + "sources": {}, + "layers": [], + "terrain": null, + "imports": [ + { + "id": "basemap", + "url": "", + "data": { + "version": 8, + "projection": { + "name": "globe" + }, + "terrain": { + "source": "rgbterrain", + "exaggeration": 10.0 + }, + "sources": { + "rgbterrain": { + "type": "raster-dem", + "tiles": [ + "local://tiles/{z}-{x}-{y}.terrain.png" + ], + "maxzoom": 12, + "tileSize": 256 + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "hillshade", + "type": "hillshade", + "source": "rgbterrain" + } + ] + } + } + ] +} diff --git a/test/integration/render-tests/imports/set-style-config/style.json b/test/integration/render-tests/imports/set-style-config/style.json index 9f26380bc37..77fb53e71b6 100644 --- a/test/integration/render-tests/imports/set-style-config/style.json +++ b/test/integration/render-tests/imports/set-style-config/style.json @@ -22,6 +22,7 @@ "data": { "version": 8, "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": {"lightPreset": {"default": "dawn"}}, "lights": [{ "type": "ambient", "id": "ambient", @@ -92,6 +93,7 @@ "data": { "version": 8, "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": {"lightPreset": {"default": "dawn"}}, "lights": [{ "type": "ambient", "id": "ambient", diff --git a/test/integration/render-tests/model-layer/model-emissive-strength/expected.png b/test/integration/render-tests/model-layer/model-emissive-strength/expected.png new file mode 100644 index 00000000000..67a4f8c4a35 Binary files /dev/null and b/test/integration/render-tests/model-layer/model-emissive-strength/expected.png differ diff --git a/test/integration/render-tests/model-layer/model-emissive-strength/style.json b/test/integration/render-tests/model-layer/model-emissive-strength/style.json new file mode 100644 index 00000000000..17b268013b0 --- /dev/null +++ b/test/integration/render-tests/model-layer/model-emissive-strength/style.json @@ -0,0 +1,128 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 512, + "width": 512, + "allowed": 0.00025 + } + }, + "sources": { + "mapbox": { + "type": "vector", + "maxzoom": 15, + "tiles": [ + "local://tiles/{z}-{x}-{y}.vector.pbf" + ] + }, + "trees": { + "type": "vector", + "maxzoom": 15, + "tiles": [ + "local://tiles/trees/{z}-{x}-{y}.pbf" + ] + } + }, + "lights": [ + { + "type": "ambient", + "id": "test_ambient", + "properties": { + "color": "rgba(0, 0, 0, 1)", + "intensity": 0.2 + } + }, + { + "type": "directional", + "id": "test_directional", + "properties": { + "color": "rgba(255, 255, 255, 1)", + "intensity": 0.1 + } + } + ], + "pitch": 62, + "zoom": 17.2, + "bearing": 264, + "center": [ + -122.4027, + 37.7845 + ], + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "lightgray" + } + }, + { + "id": "land", + "type": "fill", + "source": "mapbox", + "source-layer": "water", + "paint": { + "fill-color": "lightblue" + } + }, + { + "id": "road", + "type": "line", + "source": "mapbox", + "source-layer": "road", + "paint": { + "line-color": "lightyellow", + "line-width": 10 + } + }, + { + "id": "tree-layer", + "type": "model", + "source": "trees", + "source-layer": "trees", + "layout": { + "model-id": ["match", ["get", "tree_type"], + "broadleaved", + ["match", ["%", ["id"], 6], + 0, "maple", + 1, "maple1", + 2, "spur1", + 3, "oak1", + 4, "oak2", + "oak3"], + ["match", ["%", ["id"], 2], + 0, "oak1", "oak2"] + ] + }, + "paint": { + "model-rotation": ["match", ["%", ["id"], 4], + 0, ["literal", [0.0, 0.0, 0.0]], + 1, ["literal", [0.0, 0.0, 50.0]], + 2, ["literal", [10.0, 0.0, 120.0]], + ["literal", [0.0, -3.0, -60]]], + "model-scale": ["match", ["%", ["id"], 3], + 0, ["literal", [1.0, 1.25, 1.0]], + 1, ["literal", [0.8, 0.9, 0.8]], + ["literal", [1.2, 1.1, 1.1]]], + "model-emissive-strength": ["interpolate", + [ "linear" ], + [ "measure-light", "brightness" ], + 0.5, + 0.3, + 0.9, + 1.0 + ] + } + } + ], + "models": { + "maple": "local://models/maple.glb", + "maple1": "local://models/maple1.glb", + "maple2": "local://models/maple2.glb", + "oak1": "local://models/oak1.glb", + "oak2": "local://models/oak2.glb", + "oak3": "local://models/oak3.glb", + "spur1": "local://models/spur1.glb", + "spur2": "local://models/spur2.glb" + } +} diff --git a/test/integration/render-tests/symbol-icon-saturation/expected.png b/test/integration/render-tests/symbol-icon-saturation/expected.png new file mode 100644 index 00000000000..3f947e65075 Binary files /dev/null and b/test/integration/render-tests/symbol-icon-saturation/expected.png differ diff --git a/test/integration/render-tests/symbol-icon-saturation/style.json b/test/integration/render-tests/symbol-icon-saturation/style.json new file mode 100644 index 00000000000..81c8d1759ad --- /dev/null +++ b/test/integration/render-tests/symbol-icon-saturation/style.json @@ -0,0 +1,48 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 128, + "width": 128, + "allowed": 0.0135 + } + }, + "center": [ + 13.418056, + 52.499167 + ], + "zoom": 14, + "sources": { + "mapbox": { + "type": "vector", + "maxzoom": 14, + "tiles": [ + "local://tiles/{z}-{x}-{y}.mvt" + ] + } + }, + "sprite": "local://sprites/sprite", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "icon", + "type": "symbol", + "source": "mapbox", + "source-layer": "poi_label", + "filter": ["has", "maki"], + "paint": { + "icon-color-saturation": 0 + }, + "layout": { + "icon-image": "{maki}-12", + "symbol-placement": "point" + } + } + ] +} diff --git a/test/integration/render-tests/terrain/imported-style/expected.png b/test/integration/render-tests/terrain/imported-style/expected.png new file mode 100644 index 00000000000..eda2cc77f8d Binary files /dev/null and b/test/integration/render-tests/terrain/imported-style/expected.png differ diff --git a/test/integration/render-tests/terrain/imported-style/style.json b/test/integration/render-tests/terrain/imported-style/style.json new file mode 100644 index 00000000000..1302ca7addc --- /dev/null +++ b/test/integration/render-tests/terrain/imported-style/style.json @@ -0,0 +1,64 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 200, + "width": 200, + "operations": [ + ["wait"], + ["setTerrain", { + "exaggeration": 1 + }], + ["wait"] + ] + } + }, + "sources": {}, + "layers": [], + "center": [-113.2697514325975, 35.962383122262054], + "zoom": 12.5, + "pitch": 70, + "bearing": -40, + "imports": [ + { + "id": "basemap", + "url": "", + "data": { + "version": 8, + "terrain": { + "source": "rgbterrain", + "exaggeration": 2 + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sources": { + "rgbterrain": { + "type": "raster-dem", + "tiles": [ + "local://tiles/{z}-{x}-{y}.terrain.png" + ], + "maxzoom": 12, + "tileSize": 256 + }, + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "maxzoom": 17, + "tileSize": 256 + } + }, + "layers": [ + { + "id": "raster", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + } + ] + } + } + ] +} diff --git a/test/integration/render-tests/text-field/formatted-images-constant-size/expected.png b/test/integration/render-tests/text-field/formatted-images-constant-size/expected.png index cc27f0bcdce..269be5ddf01 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-constant-size/expected.png and b/test/integration/render-tests/text-field/formatted-images-constant-size/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images-line/expected.png b/test/integration/render-tests/text-field/formatted-images-line/expected.png index 5fefdc0490e..ccaa7f5aabf 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-line/expected.png and b/test/integration/render-tests/text-field/formatted-images-line/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images-multiline/expected.png b/test/integration/render-tests/text-field/formatted-images-multiline/expected.png index f2b579ccca6..f8b8469bafa 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-multiline/expected.png and b/test/integration/render-tests/text-field/formatted-images-multiline/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images-variable-anchors-justification/expected.png b/test/integration/render-tests/text-field/formatted-images-variable-anchors-justification/expected.png index 18696d91b95..01d4403b1bc 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-variable-anchors-justification/expected.png and b/test/integration/render-tests/text-field/formatted-images-variable-anchors-justification/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images-vertical/expected.png b/test/integration/render-tests/text-field/formatted-images-vertical/expected.png index fe9401bd9b4..6e5400eb6e1 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-vertical/expected.png and b/test/integration/render-tests/text-field/formatted-images-vertical/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images-zoom-dependent-size/expected.png b/test/integration/render-tests/text-field/formatted-images-zoom-dependent-size/expected.png index 69caad5f216..72d759b668e 100644 Binary files a/test/integration/render-tests/text-field/formatted-images-zoom-dependent-size/expected.png and b/test/integration/render-tests/text-field/formatted-images-zoom-dependent-size/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-images/expected.png b/test/integration/render-tests/text-field/formatted-images/expected.png index dd6707b6877..a88af8274eb 100644 Binary files a/test/integration/render-tests/text-field/formatted-images/expected.png and b/test/integration/render-tests/text-field/formatted-images/expected.png differ diff --git a/test/integration/render-tests/text-field/formatted-text-with-sdf-image-non-sdf-image/expected.png b/test/integration/render-tests/text-field/formatted-text-with-sdf-image-non-sdf-image/expected.png index aba683a5445..724215579e5 100644 Binary files a/test/integration/render-tests/text-field/formatted-text-with-sdf-image-non-sdf-image/expected.png and b/test/integration/render-tests/text-field/formatted-text-with-sdf-image-non-sdf-image/expected.png differ diff --git a/test/integration/render-tests/text-field/terrain/formatted-images-vertical/expected.png b/test/integration/render-tests/text-field/terrain/formatted-images-vertical/expected.png index 663062c11ff..6e5400eb6e1 100644 Binary files a/test/integration/render-tests/text-field/terrain/formatted-images-vertical/expected.png and b/test/integration/render-tests/text-field/terrain/formatted-images-vertical/expected.png differ diff --git a/test/integration/render-tests/text-font-metrics/font-with-image-vertical/expected.png b/test/integration/render-tests/text-font-metrics/font-with-image-vertical/expected.png index 24b767ca9f7..bf2c069ff5b 100644 Binary files a/test/integration/render-tests/text-font-metrics/font-with-image-vertical/expected.png and b/test/integration/render-tests/text-font-metrics/font-with-image-vertical/expected.png differ diff --git a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image-vertical/expected.png b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image-vertical/expected.png index 8b80a2cacbc..1d664aa6000 100644 Binary files a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image-vertical/expected.png and b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image-vertical/expected.png differ diff --git a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image/expected.png b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image/expected.png index 5b2d54adac1..0c48fe1e700 100644 Binary files a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image/expected.png and b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-image/expected.png differ diff --git a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-images-vertical/expected.png b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-images-vertical/expected.png index 52c2240ef47..2b723928af2 100644 Binary files a/test/integration/render-tests/text-font-metrics/mixed-fonts-with-images-vertical/expected.png and b/test/integration/render-tests/text-font-metrics/mixed-fonts-with-images-vertical/expected.png differ diff --git a/test/integration/render-tests/text-font-metrics/punctuations-vertical/expected.png b/test/integration/render-tests/text-font-metrics/punctuations-vertical/expected.png index 1ff02a4b453..077ac642510 100644 Binary files a/test/integration/render-tests/text-font-metrics/punctuations-vertical/expected.png and b/test/integration/render-tests/text-font-metrics/punctuations-vertical/expected.png differ diff --git a/test/unit/source/source_cache.test.js b/test/unit/source/source_cache.test.js index cbd09bf252d..56bbaea6499 100644 --- a/test/unit/source/source_cache.test.js +++ b/test/unit/source/source_cache.test.js @@ -1841,6 +1841,37 @@ test('SourceCache loads tiles recursively', (t) => { sourceCache.getSource().onAdd(); }); + t.test('fires `data` event with `error` sourceDataType if all tiles are 404', (t) => { + const transform = new Transform(); + transform.resize(511, 511); + transform.zoom = 1; + + const {sourceCache, eventedParent} = createSourceCache({ + loadTile (tile, callback) { + setTimeout(() => callback({status: 404}), 0); + } + }); + + eventedParent.on('data', (e) => { + if (e.dataType === 'source' && e.sourceDataType === 'metadata') { + sourceCache.update(transform); + return; + } + + if (e.dataType === 'source' && e.sourceDataType === 'error') { + t.equal(sourceCache.loaded(), true, 'source is loaded'); + t.deepEqual(sourceCache.getRenderableIds(), [], 'all tiles are empty'); + + const tileStates = Object.values(sourceCache._tiles).map(t => t.state); + t.deepEqual(tileStates, Array(5).fill('errored'), 'all tiles are errored'); + + t.end(); + } + }); + + sourceCache.getSource().onAdd(); + }); + t.end(); }); diff --git a/test/unit/style-spec/fixture/sources.output-api-supported.json b/test/unit/style-spec/fixture/sources.output-api-supported.json index c76ef7ed54a..0156a8a871c 100644 --- a/test/unit/style-spec/fixture/sources.output-api-supported.json +++ b/test/unit/style-spec/fixture/sources.output-api-supported.json @@ -39,6 +39,10 @@ "message": "sources.cluster-properties.state.map: \"zoom\" and \"feature-state\" expressions are not supported with cluster properties.", "line": 50 }, + { + "message": "sources.missing-url: Either \"url\" or \"tiles\" is required.", + "line": 53 + }, { "message": "sources[0].type: Expected one of [vector, raster, raster-dem, model, batched-model]" }, @@ -146,4 +150,4 @@ { "message": "sources[9].url: Expected a valid Mapbox tileset url" } -] \ No newline at end of file +] diff --git a/test/unit/style-spec/fixture/sources.output.json b/test/unit/style-spec/fixture/sources.output.json index e955b22e110..1f3452ed532 100644 --- a/test/unit/style-spec/fixture/sources.output.json +++ b/test/unit/style-spec/fixture/sources.output.json @@ -38,5 +38,9 @@ { "message": "sources.cluster-properties.state.map: \"zoom\" and \"feature-state\" expressions are not supported with cluster properties.", "line": 50 + }, + { + "message": "sources.missing-url: Either \"url\" or \"tiles\" is required.", + "line": 53 } -] \ No newline at end of file +] diff --git a/test/unit/style-spec/spec.test.js b/test/unit/style-spec/spec.test.js index 39d78c06b2f..94a7cdee466 100644 --- a/test/unit/style-spec/spec.test.js +++ b/test/unit/style-spec/spec.test.js @@ -82,6 +82,7 @@ function validSchema(k, t, obj, ref, version, kind) { 'length', 'min-length', 'required', + 'optional', 'transition', 'type', 'value', @@ -183,6 +184,10 @@ function validSchema(k, t, obj, ref, version, kind) { t.equal('boolean', typeof obj.required, `${k}.required (boolean)`); } + if (obj.required && obj.optional) { + t.fail(`${k} is marked as "required" and "optional" at the same time`); + } + // schema key transition checks if (obj.transition !== undefined) { t.equal('boolean', typeof obj.transition, `${k}.transition (boolean)`); diff --git a/test/unit/style/style.test.js b/test/unit/style/style.test.js index 653afda7d3e..a4338785fa0 100644 --- a/test/unit/style/style.test.js +++ b/test/unit/style/style.test.js @@ -316,7 +316,8 @@ test('Style#loadJSON', (t) => { "version": 8, "sources": { "foo": { - "type": "vector" + "type": "vector", + "tiles": [] } }, "layers": [{ @@ -446,7 +447,8 @@ test('Style#update', (t) => { 'version': 8, 'sources': { 'source': { - 'type': 'vector' + 'type': 'vector', + 'tiles': [] } }, 'layers': [{ @@ -2295,6 +2297,49 @@ test('Style#setTerrain', (t) => { }); }); + t.test('raises error during creation terrain without source', (t) => { + const style = new Style(new StubMap()); + style.loadJSON(createStyleJSON()); + + style.on('style.load', () => { + style.on('error', ({error}) => { + t.ok(error); + t.match(error.message, `terrain: terrain is missing required property "source"`); + t.end(); + }); + style.setTerrain({ + exaggeration: 2 + }); + }); + }); + + t.test('updates terrain properties', (t) => { + const style = new Style(new StubMap()); + + style.on('style.load', () => { + style.setTerrain({ + "source": { + "type": "raster-dem", + "tiles": ['http://example.com/{z}/{x}/{y}.png'], + "tileSize": 256, + "maxzoom": 14 + }, + "exaggeration": 1 + }); + + t.equals(style.getTerrain().exaggeration, 1); + + style.setTerrain({ + exaggeration: 2 + }); + + t.equals(style.getTerrain().exaggeration, 2); + t.end(); + }); + + style.loadJSON(createStyleJSON()); + }); + t.test('setTerrain(undefined) removes terrain', (t) => { const style = new Style(new StubMap()); style.loadJSON({ diff --git a/test/unit/style/style_imports.test.js b/test/unit/style/style_imports.test.js index ca664430ee0..46082d9de84 100644 --- a/test/unit/style/style_imports.test.js +++ b/test/unit/style/style_imports.test.js @@ -74,6 +74,24 @@ test('Style#loadURL', (t) => { style.loadURL('/style.json'); }); + t.test('non existing imports don\'t block root style', (t) => { + const style = new Style(new StubMap()); + + const initialStyle = createStyleJSON({ + imports: [{id: 'foo', url: '/styles/not-found.json'}], + }); + + t.stub(console, 'error'); + + style.on('style.load', () => { + t.pass(); + t.end(); + }); + + window.server.respondWith('/style.json', JSON.stringify(initialStyle)); + style.loadURL('/style.json'); + }); + t.test('imports style from JSON', (t) => { const style = new Style(new StubMap()); @@ -1381,6 +1399,28 @@ test('Terrain', (t) => { }); }); + t.test('root style disables terrain in imports', (t) => { + const style = new Style(new StubMap()); + + style.loadJSON(createStyleJSON({ + terrain: null, + imports: [{ + id: 'basemap', + url: '', + data: createStyleJSON({ + projection: {name: 'globe'}, + terrain: {source: 'dem', exaggeration: 1}, + sources: {dem: {type: 'raster-dem', tiles: ['http://example.com/{z}/{x}/{y}.png']}} + }) + }] + })); + + style.on('style.load', () => { + t.equal(style.getTerrain(), null); + t.end(); + }); + }); + t.test('empty root style terrain overrides terrain in imports', (t) => { const style = new Style(new StubMap()); @@ -1559,6 +1599,11 @@ test('Terrain', (t) => { url: '/standard.json', config: {showTerrain: true}, data: createStyleJSON({ + schema: { + showTerrain: { + default: true + } + }, terrain: {source: 'mapbox-dem', exaggeration: ['case', ['config', 'showTerrain'], 2, 0]}, sources: { 'mapbox-dem': { @@ -1583,6 +1628,42 @@ test('Terrain', (t) => { style.loadJSON(initialStyle); }); + t.test('setTerrain updates imported terrain properties', (t) => { + const style = new Style(new StubMap()); + + style.on('style.load', () => { + style.setTerrain({ + exaggeration: 2 + }); + + t.equals(style.getTerrain().exaggeration, 2); + t.end(); + }); + + style.loadJSON(createStyleJSON({ + imports: [ + { + id: "basemap", + url: "", + data: createStyleJSON({ + sources: { + "mapbox-dem": { + "type": "raster-dem", + "tiles": ['http://example.com/{z}/{x}/{y}.png'], + "tileSize": 256, + "maxzoom": 14 + } + }, + terrain: { + source: "mapbox-dem", + exaggeration: 1 + } + }) + } + ] + })); + }); + t.end(); }); @@ -2185,7 +2266,13 @@ test('Style#setConfigProperty', (t) => { layers: [{ id: 'background', type: 'background', - layout: {visibility: ['case', ['config', 'showBackground'], 'visible', 'none']}}] + layout: {visibility: ['case', ['config', 'showBackground'], 'visible', 'none']} + }], + schema: { + showBackground: { + default: false + } + } }) }] }); @@ -2197,7 +2284,7 @@ test('Style#setConfigProperty', (t) => { t.equal(key, 'updateLayers'); t.equal(value.scope, 'standard'); t.deepEqual(value.removedIds, []); - t.deepEqual(value.options.get('showBackground').value, true); + t.deepEqual(value.options.get('showBackground').value.value, true); t.deepEqual(value.layers.map(layer => layer.id), ['background']); t.end(); }; @@ -2222,7 +2309,9 @@ test('Style#setConfigProperty', (t) => { layers: [{ id: 'background', type: 'background', - layout: {visibility: ['case', ['config', 'showBackground'], 'visible', 'none']}}] + layout: {visibility: ['case', ['config', 'showBackground'], 'visible', 'none']} + }], + schema: {showBackground: {default: false}} }) }] }); @@ -2441,8 +2530,13 @@ test('Style#setState', (t) => { const style = new Style(map); style.setEventedParent(map, {style}); - const data = createStyleJSON({layers: [{id: 'a', type: 'background'}]}); - window.server.respondWith('/style1.json', JSON.stringify(createStyleJSON())); + const data = createStyleJSON({ + layers: [{id: 'a', type: 'background'}], + schema: {lightPreset: {default: 'day'}} + }); + window.server.respondWith('/style1.json', JSON.stringify(createStyleJSON({ + schema: {lightPreset: {default: 'day'}} + }))); window.server.respondWith('/style2.json', JSON.stringify(data)); const initialStyle = createStyleJSON({ diff --git a/test/unit/ui/map.test.js b/test/unit/ui/map.test.js index 76cf0ae3cc3..c306d37e27a 100755 --- a/test/unit/ui/map.test.js +++ b/test/unit/ui/map.test.js @@ -626,6 +626,46 @@ test('Map', (t) => { }); }); + t.test('Setting terrain to null disables the terrain but does not affect draping', (t) => { + const style = extend(createStyle(), { + terrain: null, + imports: [{ + id: 'basemap', + url: '', + data: extend(createStyle(), { + projection: {name: 'globe'}, + terrain: {source: 'dem', exaggeration: 1}, + sources: {dem: {type: 'raster-dem', tiles: ['http://example.com/{z}/{x}/{y}.png']}} + }) + }, + { + id: 'navigation', + url: '', + data: extend(createStyle(), { + terrain: {source: 'dem', exaggeration: 2}, + sources: {dem: {type: 'raster-dem', tiles: ['http://example.com/{z}/{x}/{y}.png']}} + }) + }] + }); + + const map = createMap(t, {style}); + + map.on('style.load', () => { + map.setZoom(3); + t.ok(map.style.terrain); + t.equal(map.getTerrain(), null); + t.equal(map.getStyle().terrain, null); + + map.setZoom(12); + map.once('render', () => { + t.notOk(map.style.terrain); + t.equal(map.getTerrain(), null); + t.equal(map.getStyle().terrain, null); + t.end(); + }); + }); + }); + t.test('https://github.com/mapbox/mapbox-gl-js/issues/11352', (t) => { const styleSheet = new window.CSSStyleSheet(); styleSheet.insertRule('.mapboxgl-canary { background-color: rgb(250, 128, 114); }', 0); @@ -4369,6 +4409,9 @@ test('Disallow usage of FQID separator in the public APIs', (t) => { map.on('error', spy); map.on('style.load', () => { + map.getLayer(null); + map.getSource(undefined); + map.getLayer(makeFQID('id', 'scope')); map.addLayer({id: makeFQID('id', 'scope')}); map.moveLayer(makeFQID('id', 'scope')); @@ -4401,10 +4444,18 @@ test('Disallow usage of FQID separator in the public APIs', (t) => { map.once('click', makeFQID('id', 'scope'), () => {}); map.off('click', makeFQID('id', 'scope')); - const callCount = 22; + const callCount = 24; t.equal(spy.callCount, callCount); - for (let i = 0; i <= callCount - 1; i++) { + const event0 = spy.getCall(0).firstArg; + t.ok(event0); + t.match(event0.error, /can't be empty/); + + const event1 = spy.getCall(1).firstArg; + t.ok(event1); + t.match(event1.error, /can't be empty/); + + for (let i = 2; i <= callCount - 1; i++) { const event = spy.getCall(i).firstArg; t.ok(event); t.match(event.error, /can't contain special symbols/); diff --git a/test/util/test.js b/test/util/test.js index 995f3f4508e..9d755493365 100644 --- a/test/util/test.js +++ b/test/util/test.js @@ -3,6 +3,7 @@ import tap from 'tap'; /*eslint-disable import/no-named-as-default-member */ import sinon from 'sinon'; +import browser from '../../src/util/browser.js'; // Disable MessageChannel in unit tests since // it prevents a Node.js process from exiting. @@ -37,6 +38,8 @@ export const only = (tap.only: CreateTest); const consoleError = console.error; const consoleWarn = console.warn; +sinon.stub(browser, 'hasCanvasFingerprintNoise').returns(false); + // $FlowFixMe[missing-this-annot] tap.beforeEach(function () { this.sandbox = sinon.createSandbox({ diff --git a/yarn.lock b/yarn.lock index 56ccce9b2be..0ca8fd5256e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -720,10 +720,10 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@puppeteer/browsers@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.9.0.tgz#dfd0aad0bdc039572f1b57648f189525d627b7ff" - integrity sha512-QwguOLy44YBGC8vuPP2nmpX4MUN2FzWbsnvZJtiCzecU3lHmVZkaC1tq6rToi9a200m8RzlVtDyxCS0UIDrxUg== +"@puppeteer/browsers@1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.9.1.tgz#384ee8b09786f0e8f62b1925e4c492424cb549ee" + integrity sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA== dependencies: debug "4.3.4" extract-zip "2.0.1" @@ -1684,16 +1684,6 @@ browserslist@^4.0.0: node-releases "^2.0.6" update-browserslist-db "^1.0.5" -browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - browserslist@^4.22.2: version "4.22.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" @@ -1802,7 +1792,7 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5: +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== @@ -1860,7 +1850,7 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001400: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001370: version "1.0.30001489" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz" integrity sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ== @@ -1950,10 +1940,10 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -chromium-bidi@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.1.tgz#390c1af350c4887824a33d82190de1cc5c5680fc" - integrity sha512-dcCqOgq9fHKExc2R4JZs/oKbOghWpUNFAJODS8WKRtLhp3avtIH5UDCBrutdqZdh3pARogH8y1ObXm87emwb3g== +chromium-bidi@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.5.2.tgz#358b03bb7c53e0f8d0fd77d596ea67ee30f7ff06" + integrity sha512-PbVOSddxgKyj+JByqavWMNqWPCoCaT6XK5Z1EFe168sxnB/BM51LnZEPXSbFcFAJv/+u2B4XNTs9uXxy4GW3cQ== dependencies: mitt "3.0.1" urlpattern-polyfill "9.0.0" @@ -2322,7 +2312,7 @@ crypto-browserify@^3.0.0: randombytes "^2.0.0" randomfill "^1.0.3" -css-declaration-sorter@^7.0.0: +css-declaration-sorter@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz#9796bcc257b4647c39993bda8d431ce32b666f80" integrity sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ== @@ -2343,7 +2333,7 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-tree@^2.2.1, css-tree@^2.3.1: +css-tree@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== @@ -2374,55 +2364,55 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.2.tgz#0cc13e2da462b0d1632b1ebea4af78e7484592e8" - integrity sha512-VnZybFeZ63AiVqIUNlxqMxpj9VU8B5j0oKgP7WyVt/7mkyf97KsYkNzsPTV/RVmy54Pg7cBhOK4WATbdCB44gw== +cssnano-preset-default@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-6.0.3.tgz#b4ce755974f4dc8d3d09ac13bb6281cce3ced45e" + integrity sha512-4y3H370aZCkT9Ev8P4SO4bZbt+AExeKhh8wTbms/X7OLDo5E7AYUUy6YPxa/uF5Grf+AJwNcCnxKhZynJ6luBA== dependencies: - css-declaration-sorter "^7.0.0" + css-declaration-sorter "^7.1.1" cssnano-utils "^4.0.1" postcss-calc "^9.0.1" - postcss-colormin "^6.0.1" - postcss-convert-values "^6.0.1" + postcss-colormin "^6.0.2" + postcss-convert-values "^6.0.2" postcss-discard-comments "^6.0.1" postcss-discard-duplicates "^6.0.1" postcss-discard-empty "^6.0.1" postcss-discard-overridden "^6.0.1" - postcss-merge-longhand "^6.0.1" - postcss-merge-rules "^6.0.2" + postcss-merge-longhand "^6.0.2" + postcss-merge-rules "^6.0.3" postcss-minify-font-values "^6.0.1" postcss-minify-gradients "^6.0.1" - postcss-minify-params "^6.0.1" - postcss-minify-selectors "^6.0.1" + postcss-minify-params "^6.0.2" + postcss-minify-selectors "^6.0.2" postcss-normalize-charset "^6.0.1" postcss-normalize-display-values "^6.0.1" postcss-normalize-positions "^6.0.1" postcss-normalize-repeat-style "^6.0.1" postcss-normalize-string "^6.0.1" postcss-normalize-timing-functions "^6.0.1" - postcss-normalize-unicode "^6.0.1" + postcss-normalize-unicode "^6.0.2" postcss-normalize-url "^6.0.1" postcss-normalize-whitespace "^6.0.1" postcss-ordered-values "^6.0.1" - postcss-reduce-initial "^6.0.1" + postcss-reduce-initial "^6.0.2" postcss-reduce-transforms "^6.0.1" - postcss-svgo "^6.0.1" - postcss-unique-selectors "^6.0.1" + postcss-svgo "^6.0.2" + postcss-unique-selectors "^6.0.2" cssnano-utils@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-4.0.1.tgz#fd18b42f95938bf55ab47967705355d6047bf1da" integrity sha512-6qQuYDqsGoiXssZ3zct6dcMxiqfT6epy7x4R0TQJadd4LWO3sPR6JH6ZByOvVLoZ6EdwPGgd7+DR1EmX3tiXQQ== -cssnano@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.2.tgz#7b49d60ce51e1dea3d569795f751ee49e97124c9" - integrity sha512-Tu9wv8UdN6CoiQnIVkCNvi+0rw/BwFWOJBlg2bVfEyKaadSuE3Gq/DD8tniVvggTJGwK88UjqZp7zL5sv6t1aA== +cssnano@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-6.0.3.tgz#46db972da71aa159437287fb4c6bc9c5d3cc5d93" + integrity sha512-MRq4CIj8pnyZpcI2qs6wswoYoDD1t0aL28n+41c1Ukcpm56m1h6mCexIHBGjfZfnTqtGSSCP4/fB1ovxgjBOiw== dependencies: - cssnano-preset-default "^6.0.2" + cssnano-preset-default "^6.0.3" lilconfig "^3.0.0" -csso@5.0.5: +csso@^5.0.5: version "5.0.5" resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== @@ -2533,15 +2523,15 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-equal@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.2.tgz#9b2635da569a13ba8e1cc159c2f744071b115daa" - integrity sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA== +deep-equal@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== dependencies: array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" + call-bind "^1.0.5" es-get-iterator "^1.1.3" - get-intrinsic "^1.2.1" + get-intrinsic "^1.2.2" is-arguments "^1.1.1" is-array-buffer "^3.0.2" is-date-object "^1.0.5" @@ -2551,11 +2541,11 @@ deep-equal@^2.2.2: object-is "^1.1.5" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" + regexp.prototype.flags "^1.5.1" side-channel "^1.0.4" which-boxed-primitive "^1.0.2" which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-typed-array "^1.1.13" deep-extend@^0.6.0: version "0.6.0" @@ -2613,6 +2603,15 @@ define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + defined@^1.0.0, defined@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.1.tgz#c0b9db27bfaffd95d6f61399419b893df0f91ebf" @@ -2830,11 +2829,6 @@ electron-to-chromium@^1.4.202: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz#aa142e45468bda111b88abc9cc59d573b75d6a60" integrity sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw== -electron-to-chromium@^1.4.251: - version "1.4.254" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.254.tgz#c6203583890abf88dfc0be046cd72d3b48f8beb6" - integrity sha512-Sh/7YsHqQYkA6ZHuHMy24e6TE4eX6KZVsZb9E/DvU1nQRIrH4BflO/4k+83tfdYvDl+MObvlqHPRICzEdC9c6Q== - electron-to-chromium@^1.4.601: version "1.4.610" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz#e17b22203f4aa2e1ed77759c720546d95a51186f" @@ -3166,10 +3160,10 @@ eslint-plugin-import@^2.29.1: semver "^6.3.1" tsconfig-paths "^3.15.0" -eslint-plugin-jsdoc@^47.0.2: - version "47.0.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-47.0.2.tgz#113a6370e623535e5c6e0a59a094ffdc253371ff" - integrity sha512-sIq81Pv+yrhhwY0m1JH79rdZRgDNunehv3S0Yv0UfewpoeJyPkODFn2o4o20nofVoI2tjku9/QBcCYUmmeWFXA== +eslint-plugin-jsdoc@^48.0.2: + version "48.0.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.0.2.tgz#b843107e8caec57b8b463f04797be3b30d6a52da" + integrity sha512-CBFl5Jc7+jlV36RwDm+PQ8Uw5r28pn2/uW/OaB+Gw5bFwn4Py/1eYMZ3hGf9S4meUFZ/sRvS+hVif2mRAp6WqQ== dependencies: "@es-joy/jsdoccomment" "~0.41.0" are-docs-informative "^0.0.2" @@ -3804,6 +3798,16 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: has-proto "^1.0.1" has-symbols "^1.0.3" +get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== + dependencies: + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" @@ -5603,7 +5607,7 @@ mock-geolocation@^1.0.11: resolved "https://registry.yarnpkg.com/mock-geolocation/-/mock-geolocation-1.0.11.tgz#2c7b99242a2c70dbecd317b392b30311722992c8" integrity sha512-F/kvZfwuVnuPNHjHPuSVZlch8HnLwZgq7LVyp83PKSW3sXYm3tJhi/Z1gIHvnbY953YfAxiq5a7wFhgzX+qIkg== -mock-property@^1.0.2: +mock-property@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mock-property/-/mock-property-1.0.3.tgz#3e37c50a56609d548cabd56559fde3dd8767b10c" integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== @@ -5920,13 +5924,13 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" @@ -6364,22 +6368,22 @@ postcss-cli@^11.0.0: slash "^5.0.0" yargs "^17.0.0" -postcss-colormin@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.1.tgz#3aa61d38a88dbdeeb7252fae67809a7ac547a129" - integrity sha512-Tb9aR2wCJCzKuNjIeMzVNd0nXjQy25HDgFmmaRsHnP0eP/k8uQWE4S8voX5S2coO5CeKrp+USFs1Ayv9Tpxx6w== +postcss-colormin@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.0.2.tgz#2af9ce753937b08e058dbc6879e4aedfab42806b" + integrity sha512-TXKOxs9LWcdYo5cgmcSHPkyrLAh86hX1ijmyy6J8SbOhyv6ua053M3ZAM/0j44UsnQNIWdl8gb5L7xX2htKeLw== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" caniuse-api "^3.0.0" colord "^2.9.1" postcss-value-parser "^4.2.0" -postcss-convert-values@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.1.tgz#a1451cb7e53b67b3db95c37276c5decb997409f2" - integrity sha512-zTd4Vh0HxGkhg5aHtfCogcRHzGkvblfdWlQ53lIh1cJhYcGyIxh2hgtKoVh40AMktRERet+JKdB04nNG19kjmA== +postcss-convert-values@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-6.0.2.tgz#c4a7509aeb1cc7ac3f6948fcbffc2bf8cac7c56a" + integrity sha512-aeBmaTnGQ+NUSVQT8aY0sKyAD/BaLJenEKZ03YK0JnDE1w1Rr8XShoxdal2V2H26xTJKr3v5haByOhJuyT4UYw== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" postcss-value-parser "^4.2.0" postcss-discard-comments@^6.0.1: @@ -6420,23 +6424,23 @@ postcss-load-config@^5.0.0: lilconfig "^3.0.0" yaml "^2.3.4" -postcss-merge-longhand@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.1.tgz#5a1145868c615e643ca0996d9e9c3f09ad8de854" - integrity sha512-vmr/HZQzaPXc45FRvSctqFTF05UaDnTn5ABX+UtQPJznDWT/QaFbVc/pJ5C2YPxx2J2XcfmWowlKwtCDwiQ5hA== +postcss-merge-longhand@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.2.tgz#cd4e83014851da59545e9a906b245615550f4064" + integrity sha512-+yfVB7gEM8SrCo9w2lCApKIEzrTKl5yS1F4yGhV3kSim6JzbfLGJyhR1B6X+6vOT0U33Mgx7iv4X9MVWuaSAfw== dependencies: postcss-value-parser "^4.2.0" - stylehacks "^6.0.1" + stylehacks "^6.0.2" -postcss-merge-rules@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.2.tgz#b0f0063a05d671b7093a86f0faa6d2c6695dc036" - integrity sha512-6lm8bl0UfriSfxI+F/cezrebqqP8w702UC6SjZlUlBYwuRVNbmgcJuQU7yePIvD4MNT53r/acQCUAyulrpgmeQ== +postcss-merge-rules@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-6.0.3.tgz#08fcf714faaad75b1980ecd961b080ae2f8ddeb3" + integrity sha512-yfkDqSHGohy8sGYIJwBmIGDv4K4/WrJPX355XrxQb/CSsT4Kc/RxDi6akqn5s9bap85AWgv21ArcUWwWdGNSHA== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" caniuse-api "^3.0.0" cssnano-utils "^4.0.1" - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.15" postcss-minify-font-values@^6.0.1: version "6.0.1" @@ -6454,21 +6458,21 @@ postcss-minify-gradients@^6.0.1: cssnano-utils "^4.0.1" postcss-value-parser "^4.2.0" -postcss-minify-params@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.1.tgz#79b83947bae2aa991df12646c7f463276abb0aef" - integrity sha512-eFvGWArqh4khPIgPDu6SZNcaLctx97nO7c59OXnRtGntAp5/VS4gjMhhW9qUFsK6mQ27pEZGt2kR+mPizI+Z9g== +postcss-minify-params@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-6.0.2.tgz#bd64af642fa5610281b8a9461598bbb91f92ae05" + integrity sha512-zwQtbrPEBDj+ApELZ6QylLf2/c5zmASoOuA4DzolyVGdV38iR2I5QRMsZcHkcdkZzxpN8RS4cN7LPskOkTwTZw== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" cssnano-utils "^4.0.1" postcss-value-parser "^4.2.0" -postcss-minify-selectors@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.1.tgz#7b2f05651a2f734da1fa50dea62cfc47e67d68f9" - integrity sha512-mfReq5wrS6vkunxvJp6GDuOk+Ak6JV7134gp8L+ANRnV9VwqzTvBtX6lpohooVU750AR0D3pVx2Zn6uCCwOAfQ== +postcss-minify-selectors@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-6.0.2.tgz#62065b38d3453ddc6627ba50e4f4a2154b031aa0" + integrity sha512-0b+m+w7OAvZejPQdN2GjsXLv5o0jqYHX3aoV0e7RBKPCsB7TYG5KKWBFhGnB/iP3213Ts8c5H4wLPLMm7z28Sg== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.15" postcss-normalize-charset@^6.0.1: version "6.0.1" @@ -6510,12 +6514,12 @@ postcss-normalize-timing-functions@^6.0.1: dependencies: postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.1.tgz#a652faa02fc8ce5d1429ac0782575d8d66a60d9b" - integrity sha512-ok9DsI94nEF79MkvmLfHfn8ddnKXA7w+8YuUoz5m7b6TOdoaRCpvu/QMHXQs9+DwUbvp+ytzz04J55CPy77PuQ== +postcss-normalize-unicode@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.2.tgz#361026744ff11baebaec771b60c2a5f36f274fd0" + integrity sha512-Ff2VdAYCTGyMUwpevTZPZ4w0+mPjbZzLLyoLh/RMpqUqeQKZ+xMm31hkxBavDcGKcxm6ACzGk0nBfZ8LZkStKA== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" postcss-value-parser "^4.2.0" postcss-normalize-url@^6.0.1: @@ -6540,12 +6544,12 @@ postcss-ordered-values@^6.0.1: cssnano-utils "^4.0.1" postcss-value-parser "^4.2.0" -postcss-reduce-initial@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.1.tgz#37621ba31a18fd75eb9c76e818cca2a2adb13238" - integrity sha512-cgzsI2ThG1PMSdSyM9A+bVxiiVgPIVz9f5c6H+TqEv0CA89iCOO81mwLWRWLgOKFtQkKob9nNpnkxG/1RlgFcA== +postcss-reduce-initial@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-6.0.2.tgz#763d25902406c872264041df69f182eb15a5d9be" + integrity sha512-YGKalhNlCLcjcLvjU5nF8FyeCTkCO5UtvJEt0hrPZVCTtRLSOH4z00T1UntQPj4dUmIYZgMj8qK77JbSX95hSw== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.2" caniuse-api "^3.0.0" postcss-reduce-transforms@^6.0.1: @@ -6573,7 +6577,7 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -6581,30 +6585,38 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.13, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.1.tgz#6bf63713ef5cb40f1bedd2c2cfca2486b41d5184" - integrity sha512-eWV4Rrqa06LzTgqirOv5Ln6WTGyU7Pbeqj9WEyKo9tpnWixNATVJMeaEcOHOW1ZYyjcG8wSJwX/28DvU3oy3HA== +postcss-selector-parser@^6.0.15: + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-6.0.2.tgz#dbc9d03e7f346bc0d82443078602a951e0214836" + integrity sha512-IH5R9SjkTkh0kfFOQDImyy1+mTCb+E830+9SV1O+AaDcoHTvfsvt6WwJeo7KwcHbFnevZVCsXhDmjFiGVuwqFQ== dependencies: postcss-value-parser "^4.2.0" - svgo "^3.0.5" + svgo "^3.2.0" -postcss-unique-selectors@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.1.tgz#e6d071c2ea64ce265eb55ea9c170ff951183c712" - integrity sha512-/KCCEpNNR7oXVJ38/Id7GC9Nt0zxO1T3zVbhVaq6F6LSG+3gU3B7+QuTHfD0v8NPEHlzewAout29S0InmB78EQ== +postcss-unique-selectors@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-6.0.2.tgz#09a34a5a31a649d3e9bca5962af0616f39d071d2" + integrity sha512-8IZGQ94nechdG7Y9Sh9FlIY2b4uS8/k8kdKRX040XHsS3B6d1HrJAkXrBSsSu4SuARruSsUjW3nlSw8BHkaAYQ== dependencies: - postcss-selector-parser "^6.0.5" + postcss-selector-parser "^6.0.15" postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.28, postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== +postcss@^8.4.28, postcss@^8.4.33: + version "8.4.33" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -6770,17 +6782,17 @@ punycode@^2.0.0, punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer-core@^21.6.1: - version "21.6.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.6.1.tgz#10eccb4dc3167c8c26bc21122fabb45a9fda9ca7" - integrity sha512-0chaaK/RL9S1U3bsyR4fUeUfoj51vNnjWvXgG6DcsyMjwYNpLcAThv187i1rZCo7QhJP0wZN8plQkjNyrq2h+A== +puppeteer-core@^21.7.0: + version "21.7.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-21.7.0.tgz#c0abb98cbd17dbd7ee317b4257958337fa25d2c7" + integrity sha512-elPYPozrgiM3phSy7VDUJCVWQ07SPnOm78fpSaaSNFoQx5sur/MqhTSro9Wz8lOEjqCykGC6WRkwxDgmqcy1dQ== dependencies: - "@puppeteer/browsers" "1.9.0" - chromium-bidi "0.5.1" + "@puppeteer/browsers" "1.9.1" + chromium-bidi "0.5.2" cross-fetch "4.0.0" debug "4.3.4" devtools-protocol "0.0.1203626" - ws "8.15.1" + ws "8.16.0" qrcode-terminal@^0.12.0: version "0.12.0" @@ -7008,15 +7020,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - regexp.prototype.flags@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" @@ -7122,16 +7125,7 @@ resolve-protobuf-schema@^2.1.0: dependencies: protocol-buffers-schema "^3.3.1" -resolve@^1.1.4, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.22.1, resolve@^1.4.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.4: +resolve@^1.1.4, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.22.1, resolve@^1.22.4, resolve@^1.4.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -7917,13 +7911,13 @@ styled_string@0.0.1: resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" integrity sha512-DU2KZiB6VbPkO2tGSqQ9n96ZstUPjW7X4sGO6V2m1myIQluX0p1Ol8BrA/l6/EesqhMqXOIXs3cJNOy1UuU2BA== -stylehacks@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.1.tgz#c103f0149e268a290a0dda3fce8fd4c5459a13c3" - integrity sha512-jTqG2aIoX2fYg0YsGvqE4ooE/e75WmaEjnNiP6Ag7irLtHxML8NJRxRxS0HyDpde8DRGuEXTFVHVfR5Tmbxqzg== +stylehacks@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-6.0.2.tgz#5bf2654561752547d4548765f35c9a49659b3742" + integrity sha512-00zvJGnCu64EpMjX8b5iCZ3us2Ptyw8+toEkb92VdmkEaRaSGBNKAoK6aWZckhXxmQP8zWiTaFaiMGIU8Ve8sg== dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" + browserslist "^4.22.2" + postcss-selector-parser "^6.0.15" stylelint-config-recommended@^13.0.0: version "13.0.0" @@ -8029,17 +8023,17 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== -svgo@^3.0.5: - version "3.1.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.1.0.tgz#7e63855c8da73297d5d5765e968f9679a0f8d24a" - integrity sha512-R5SnNA89w1dYgNv570591F66v34b3eQShpIBcQtZtM5trJwm1VvxbIoMpRYY3ybTAutcKTLEmTsdnaknOHbiQA== +svgo@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.2.0.tgz#7a5dff2938d8c6096e00295c2390e8e652fa805d" + integrity sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ== dependencies: "@trysound/sax" "0.2.0" commander "^7.2.0" css-select "^5.1.0" - css-tree "^2.2.1" + css-tree "^2.3.1" css-what "^6.1.0" - csso "5.0.5" + csso "^5.0.5" picocolors "^1.0.0" symbol-tree@^3.2.2: @@ -8143,16 +8137,16 @@ tape-filter@^1.0.4: dependencies: minimist "^1.2.0" -tape@^5.7.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/tape/-/tape-5.7.2.tgz#04ff0e64a0316f648f153fae8ccd69791143f84b" - integrity sha512-cvSyprYahyOYXbtBwV/B7nrx7kINeZ3VZ9fKoSywoPwZN3oQ1WVLvt+Vl0XCz/gi37CDrY3dlW790nzviIzoPw== +tape@^5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-5.7.3.tgz#d10975d79554089230dbada91dd85f38467ece6c" + integrity sha512-un2/TkloCBIxbrLac88Z9WElQ85WLE4t+jjfgrmxrlInWGYQf9r9Wbycc/nNP3zap6GBb7qln7h85QoNBNZdHg== dependencies: "@ljharb/resumer" "^0.0.1" "@ljharb/through" "^2.3.11" array.prototype.every "^1.1.5" call-bind "^1.0.5" - deep-equal "^2.2.2" + deep-equal "^2.2.3" defined "^1.0.1" dotignore "^0.1.2" for-each "^0.3.3" @@ -8163,11 +8157,11 @@ tape@^5.7.2: inherits "^2.0.4" is-regex "^1.1.4" minimist "^1.2.8" - mock-property "^1.0.2" + mock-property "^1.0.3" object-inspect "^1.13.1" object-is "^1.1.5" object-keys "^1.1.1" - object.assign "^4.1.4" + object.assign "^4.1.5" resolve "^2.0.0-next.5" string.prototype.trim "^1.2.8" @@ -8653,14 +8647,6 @@ update-browserslist-db@^1.0.5: escalade "^3.1.1" picocolors "^1.0.0" -update-browserslist-db@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -8858,6 +8844,17 @@ which-typed-array@^1.1.11: gopd "^1.0.1" has-tostringtag "^1.0.0" +which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which-typed-array@^1.1.2: version "1.1.8" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" @@ -8870,18 +8867,6 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.9" -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -8966,10 +8951,10 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@8.15.1, ws@>=8.14.2: - version "8.15.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" - integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== +ws@8.16.0, ws@>=8.14.2: + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== ws@^7, ws@^7.0.0, ws@^7.5.5: version "7.5.9"