@mapwhit/tilerenderer 0.52.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/README.md +7 -0
  2. package/build/min/package.json +2 -1
  3. package/build/min/src/shaders/_prelude.fragment.glsl.js +2 -2
  4. package/build/min/src/shaders/_prelude.vertex.glsl.js +2 -2
  5. package/build/min/src/shaders/background.fragment.glsl.js +2 -2
  6. package/build/min/src/shaders/background.vertex.glsl.js +1 -1
  7. package/build/min/src/shaders/background_pattern.fragment.glsl.js +2 -2
  8. package/build/min/src/shaders/background_pattern.vertex.glsl.js +1 -1
  9. package/build/min/src/shaders/circle.fragment.glsl.js +2 -2
  10. package/build/min/src/shaders/circle.vertex.glsl.js +2 -2
  11. package/build/min/src/shaders/clipping_mask.fragment.glsl.js +1 -1
  12. package/build/min/src/shaders/clipping_mask.vertex.glsl.js +1 -1
  13. package/build/min/src/shaders/collision_box.fragment.glsl.js +1 -1
  14. package/build/min/src/shaders/collision_box.vertex.glsl.js +1 -1
  15. package/build/min/src/shaders/collision_circle.fragment.glsl.js +1 -1
  16. package/build/min/src/shaders/collision_circle.vertex.glsl.js +1 -1
  17. package/build/min/src/shaders/debug.fragment.glsl.js +1 -1
  18. package/build/min/src/shaders/debug.vertex.glsl.js +1 -1
  19. package/build/min/src/shaders/fill.fragment.glsl.js +2 -2
  20. package/build/min/src/shaders/fill.vertex.glsl.js +2 -2
  21. package/build/min/src/shaders/fill_extrusion.fragment.glsl.js +2 -2
  22. package/build/min/src/shaders/fill_extrusion.vertex.glsl.js +2 -2
  23. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.js +2 -2
  24. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.js +2 -2
  25. package/build/min/src/shaders/fill_outline.fragment.glsl.js +2 -2
  26. package/build/min/src/shaders/fill_outline.vertex.glsl.js +2 -2
  27. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.js +2 -2
  28. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.js +2 -2
  29. package/build/min/src/shaders/fill_pattern.fragment.glsl.js +2 -2
  30. package/build/min/src/shaders/fill_pattern.vertex.glsl.js +2 -2
  31. package/build/min/src/shaders/heatmap.fragment.glsl.js +2 -2
  32. package/build/min/src/shaders/heatmap.vertex.glsl.js +2 -2
  33. package/build/min/src/shaders/heatmap_texture.fragment.glsl.js +2 -2
  34. package/build/min/src/shaders/heatmap_texture.vertex.glsl.js +1 -1
  35. package/build/min/src/shaders/hillshade.fragment.glsl.js +2 -2
  36. package/build/min/src/shaders/hillshade.vertex.glsl.js +1 -1
  37. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.js +2 -2
  38. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.js +1 -1
  39. package/build/min/src/shaders/line.fragment.glsl.js +2 -2
  40. package/build/min/src/shaders/line.vertex.glsl.js +2 -2
  41. package/build/min/src/shaders/line_gradient.fragment.glsl.js +2 -2
  42. package/build/min/src/shaders/line_gradient.vertex.glsl.js +2 -2
  43. package/build/min/src/shaders/line_pattern.fragment.glsl.js +2 -2
  44. package/build/min/src/shaders/line_pattern.vertex.glsl.js +2 -2
  45. package/build/min/src/shaders/line_sdf.fragment.glsl.js +2 -2
  46. package/build/min/src/shaders/line_sdf.vertex.glsl.js +2 -2
  47. package/build/min/src/shaders/raster.fragment.glsl.js +2 -2
  48. package/build/min/src/shaders/raster.vertex.glsl.js +1 -1
  49. package/build/min/src/shaders/symbol_icon.fragment.glsl.js +2 -2
  50. package/build/min/src/shaders/symbol_icon.vertex.glsl.js +2 -2
  51. package/build/min/src/shaders/symbol_sdf.fragment.glsl.js +2 -2
  52. package/build/min/src/shaders/symbol_sdf.vertex.glsl.js +2 -2
  53. package/package.json +5 -4
  54. package/src/data/array_types.js +55 -117
  55. package/src/data/bucket/circle_attributes.js +2 -4
  56. package/src/data/bucket/circle_bucket.js +19 -16
  57. package/src/data/bucket/fill_attributes.js +2 -4
  58. package/src/data/bucket/fill_bucket.js +38 -27
  59. package/src/data/bucket/fill_extrusion_attributes.js +2 -4
  60. package/src/data/bucket/fill_extrusion_bucket.js +56 -37
  61. package/src/data/bucket/heatmap_bucket.js +2 -11
  62. package/src/data/bucket/line_attributes.js +2 -4
  63. package/src/data/bucket/line_bucket.js +208 -163
  64. package/src/data/bucket/pattern_attributes.js +2 -4
  65. package/src/data/bucket/pattern_bucket_features.js +7 -9
  66. package/src/data/bucket/symbol_attributes.js +12 -26
  67. package/src/data/bucket/symbol_bucket.js +174 -323
  68. package/src/data/bucket/symbol_buffers.js +62 -0
  69. package/src/data/bucket/symbol_collision_buffers.js +33 -0
  70. package/src/data/bucket.js +26 -25
  71. package/src/data/dem_data.js +11 -10
  72. package/src/data/extent.js +1 -1
  73. package/src/data/feature_index.js +38 -28
  74. package/src/data/index_array_type.js +1 -6
  75. package/src/data/load_geometry.js +6 -9
  76. package/src/data/pos_attributes.js +2 -3
  77. package/src/data/program_configuration.js +47 -38
  78. package/src/data/raster_bounds_attributes.js +2 -2
  79. package/src/data/segment.js +4 -7
  80. package/src/geo/coordinate.js +1 -1
  81. package/src/geo/lng_lat.js +3 -3
  82. package/src/geo/lng_lat_bounds.js +8 -4
  83. package/src/geo/transform.js +69 -30
  84. package/src/gl/color_mode.js +2 -2
  85. package/src/gl/context.js +28 -29
  86. package/src/gl/cull_face_mode.js +1 -1
  87. package/src/gl/depth_mode.js +1 -1
  88. package/src/gl/framebuffer.js +8 -4
  89. package/src/gl/index_buffer.js +2 -2
  90. package/src/gl/stencil_mode.js +1 -1
  91. package/src/gl/value.js +33 -68
  92. package/src/gl/vertex_buffer.js +2 -2
  93. package/src/index.js +49 -25
  94. package/src/render/draw_background.js +17 -12
  95. package/src/render/draw_circle.js +15 -12
  96. package/src/render/draw_collision_debug.js +11 -8
  97. package/src/render/draw_debug.js +16 -14
  98. package/src/render/draw_fill.js +27 -20
  99. package/src/render/draw_fill_extrusion.js +20 -17
  100. package/src/render/draw_heatmap.js +21 -16
  101. package/src/render/draw_hillshade.js +12 -9
  102. package/src/render/draw_line.js +36 -22
  103. package/src/render/draw_raster.js +22 -18
  104. package/src/render/draw_symbol.js +38 -33
  105. package/src/render/glyph_atlas.js +9 -8
  106. package/src/render/glyph_manager.js +2 -3
  107. package/src/render/image_atlas.js +4 -11
  108. package/src/render/image_manager.js +39 -28
  109. package/src/render/line_atlas.js +2 -2
  110. package/src/render/painter.js +78 -61
  111. package/src/render/program/background_program.js +6 -13
  112. package/src/render/program/circle_program.js +8 -10
  113. package/src/render/program/clipping_mask_program.js +3 -5
  114. package/src/render/program/collision_program.js +4 -6
  115. package/src/render/program/debug_program.js +3 -5
  116. package/src/render/program/fill_extrusion_program.js +9 -15
  117. package/src/render/program/fill_program.js +10 -21
  118. package/src/render/program/heatmap_program.js +9 -15
  119. package/src/render/program/hillshade_program.js +16 -22
  120. package/src/render/program/line_program.js +14 -25
  121. package/src/render/program/pattern.js +5 -7
  122. package/src/render/program/program_uniforms.js +13 -20
  123. package/src/render/program/raster_program.js +9 -11
  124. package/src/render/program/symbol_program.js +5 -7
  125. package/src/render/program.js +5 -6
  126. package/src/render/texture.js +1 -1
  127. package/src/render/tile_mask.js +6 -4
  128. package/src/render/uniform_binding.js +9 -20
  129. package/src/render/vertex_array_object.js +5 -3
  130. package/src/shaders/encode_attribute.js +2 -6
  131. package/src/shaders/index.js +103 -51
  132. package/src/source/geojson_source.js +25 -30
  133. package/src/source/geojson_worker_source.js +46 -74
  134. package/src/source/geojson_wrapper.js +13 -5
  135. package/src/source/image_source.js +17 -28
  136. package/src/source/load_tilejson.js +3 -3
  137. package/src/source/pixels_to_tile_units.js +3 -3
  138. package/src/source/query_features.js +17 -15
  139. package/src/source/raster_dem_tile_source.js +54 -71
  140. package/src/source/raster_tile_source.js +14 -15
  141. package/src/source/resources/glyphs.js +4 -5
  142. package/src/source/resources/index.js +4 -12
  143. package/src/source/rtl_text_plugin.js +62 -35
  144. package/src/source/source.js +14 -22
  145. package/src/source/source_cache.js +221 -179
  146. package/src/source/source_state.js +125 -13
  147. package/src/source/tile.js +67 -66
  148. package/src/source/tile_bounds.js +36 -29
  149. package/src/source/tile_cache.js +2 -2
  150. package/src/source/tile_id.js +30 -26
  151. package/src/source/vector_tile_source.js +23 -21
  152. package/src/source/vector_tile_worker_source.js +22 -26
  153. package/src/source/worker_tile.js +139 -134
  154. package/src/style/create_style_layer.js +11 -11
  155. package/src/style/evaluation_parameters.js +4 -6
  156. package/src/style/light.js +5 -5
  157. package/src/style/load_sprite.js +6 -6
  158. package/src/style/parse_glyph_pbf.js +21 -17
  159. package/src/style/pauseable_placement.js +7 -9
  160. package/src/style/properties.js +21 -51
  161. package/src/style/query_utils.js +7 -13
  162. package/src/style/style.js +314 -221
  163. package/src/style/style_layer/background_style_layer.js +3 -4
  164. package/src/style/style_layer/background_style_layer_properties.js +2 -2
  165. package/src/style/style_layer/circle_style_layer.js +25 -20
  166. package/src/style/style_layer/circle_style_layer_properties.js +2 -2
  167. package/src/style/style_layer/fill_extrusion_style_layer.js +55 -37
  168. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +2 -2
  169. package/src/style/style_layer/fill_style_layer.js +11 -12
  170. package/src/style/style_layer/fill_style_layer_properties.js +2 -2
  171. package/src/style/style_layer/heatmap_style_layer.js +6 -7
  172. package/src/style/style_layer/heatmap_style_layer_properties.js +2 -2
  173. package/src/style/style_layer/hillshade_style_layer.js +4 -5
  174. package/src/style/style_layer/hillshade_style_layer_properties.js +2 -2
  175. package/src/style/style_layer/line_style_layer.js +33 -30
  176. package/src/style/style_layer/line_style_layer_properties.js +5 -5
  177. package/src/style/style_layer/raster_style_layer.js +3 -4
  178. package/src/style/style_layer/raster_style_layer_properties.js +2 -2
  179. package/src/style/style_layer/symbol_style_layer.js +20 -21
  180. package/src/style/style_layer/symbol_style_layer_properties.js +2 -2
  181. package/src/style/style_layer.js +66 -47
  182. package/src/style/style_layer_index.js +17 -42
  183. package/src/style/zoom_history.js +1 -1
  184. package/src/style-spec/error/parsing_error.js +1 -1
  185. package/src/style-spec/error/validation_error.js +5 -3
  186. package/src/style-spec/feature_filter/convert.js +17 -9
  187. package/src/style-spec/feature_filter/index.js +13 -9
  188. package/src/style-spec/util/eval_support.js +2 -2
  189. package/src/style-spec/util/ref_properties.js +1 -1
  190. package/src/symbol/anchor.js +2 -6
  191. package/src/symbol/check_max_angle.js +13 -5
  192. package/src/symbol/clip_line.js +2 -3
  193. package/src/symbol/collision_feature.js +8 -4
  194. package/src/symbol/collision_index.js +5 -7
  195. package/src/symbol/cross_tile_symbol_index.js +7 -10
  196. package/src/symbol/get_anchors.js +15 -8
  197. package/src/symbol/grid_index.js +5 -3
  198. package/src/symbol/mergelines.js +2 -2
  199. package/src/symbol/opacity_state.js +1 -5
  200. package/src/symbol/placement.js +28 -23
  201. package/src/symbol/projection.js +29 -28
  202. package/src/symbol/quads.js +14 -16
  203. package/src/symbol/shaping.js +27 -19
  204. package/src/symbol/symbol_layout.js +24 -28
  205. package/src/symbol/symbol_size.js +13 -12
  206. package/src/symbol/transform_text.js +4 -4
  207. package/src/ui/camera.js +34 -18
  208. package/src/ui/map.js +102 -44
  209. package/src/util/async.js +11 -5
  210. package/src/util/browser.js +1 -1
  211. package/src/util/callback.js +3 -9
  212. package/src/util/classify_rings.js +13 -8
  213. package/src/util/color_ramp.js +3 -3
  214. package/src/util/config.js +4 -4
  215. package/src/util/dictionary_coder.js +2 -3
  216. package/src/util/dom.js +7 -3
  217. package/src/util/find_pole_of_inaccessibility.js +29 -14
  218. package/src/util/group_layers.js +41 -0
  219. package/src/util/image.js +3 -13
  220. package/src/util/interpolate.js +1 -1
  221. package/src/util/intersection_tests.js +80 -42
  222. package/src/util/is_char_in_unicode_block.js +1 -1
  223. package/src/util/key.js +25 -0
  224. package/src/util/loader/image.js +1 -1
  225. package/src/util/object.js +33 -76
  226. package/src/util/script_detection.js +212 -91
  227. package/src/util/struct_array.js +8 -40
  228. package/src/util/task_queue.js +11 -7
  229. package/src/util/throttle.js +2 -2
  230. package/src/util/tile_cover.js +8 -5
  231. package/src/util/token.js +1 -1
  232. package/src/util/unique_id.js +2 -2
  233. package/src/util/util.js +21 -29
  234. package/src/util/vectortile_to_geojson.js +4 -2
  235. package/src/util/verticalize_punctuation.js +3 -7
  236. package/src/util/warn.js +4 -4
  237. package/src/util/web_worker.js +3 -3
  238. package/src/worker.js +1 -4
  239. package/src/source/resources/images.js +0 -68
  240. package/src/source/worker.js +0 -110
  241. package/src/source/worker_source.js +0 -14
  242. package/src/style-spec/deref.js +0 -51
  243. package/src/style-spec/group_by_layout.js +0 -46
  244. package/src/util/actor.js +0 -108
  245. package/src/util/dispatcher.js +0 -65
  246. package/src/util/global_worker_pool.js +0 -15
  247. package/src/util/transfer_registry.js +0 -168
  248. package/src/util/web_worker_transfer.js +0 -43
  249. package/src/util/worker_pool.js +0 -41
@@ -1,48 +1,26 @@
1
- const {
2
- symbolLayoutAttributes,
3
- collisionVertexAttributes,
4
- collisionBoxLayout,
5
- collisionCircleLayout,
6
- dynamicLayoutAttributes
7
- } = require('./symbol_attributes');
8
-
9
- const {
10
- SymbolLayoutArray,
11
- SymbolDynamicLayoutArray,
12
- SymbolOpacityArray,
1
+ import { Formatted } from '@mapwhit/style-expressions';
2
+ import { VectorTileFeature } from '@mapwhit/vector-tile';
3
+ import EvaluationParameters from '../../style/evaluation_parameters.js';
4
+ import mergeLines from '../../symbol/mergelines.js';
5
+ import { getSizeData } from '../../symbol/symbol_size.js';
6
+ import transformText from '../../symbol/transform_text.js';
7
+ import { allowsVerticalWritingMode } from '../../util/script_detection.js';
8
+ import { verticalizedCharacterMap } from '../../util/verticalize_punctuation.js';
9
+ import {
13
10
  CollisionBoxLayoutArray,
14
11
  CollisionCircleLayoutArray,
15
- CollisionVertexArray,
16
- PlacedSymbolArray,
17
- SymbolInstanceArray,
18
12
  GlyphOffsetArray,
13
+ SymbolInstanceArray,
19
14
  SymbolLineVertexArray
20
- } = require('../array_types');
21
- const { default: Point } = require('@mapbox/point-geometry');
22
- const SegmentVector = require('../segment');
23
- const { ProgramConfigurationSet } = require('../program_configuration');
24
- const { TriangleIndexArray, LineIndexArray } = require('../index_array_type');
25
- const transformText = require('../../symbol/transform_text');
26
- const mergeLines = require('../../symbol/mergelines');
27
- const { allowsVerticalWritingMode } = require('../../util/script_detection');
28
- const loadGeometry = require('../load_geometry');
29
- const mvt = require('@mapwhit/vector-tile');
30
- const vectorTileFeatureTypes = mvt.VectorTileFeature.types;
31
- const { verticalizedCharacterMap } = require('../../util/verticalize_punctuation');
32
- const { getSizeData } = require('../../symbol/symbol_size');
33
- const { register } = require('../../util/transfer_registry');
34
- const EvaluationParameters = require('../../style/evaluation_parameters');
35
- const { Formatted } = require('@mapwhit/style-expressions');
36
-
37
- // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them
38
- // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph
39
- // 7 bits are for the current opacity, and the lowest bit is the target opacity
40
-
41
- // actually defined in symbol_attributes.js
42
- // const placementOpacityAttributes = [
43
- // { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
44
- // ];
45
- const shaderOpacityAttributes = [{ name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 }];
15
+ } from '../array_types.js';
16
+ import { LineIndexArray, TriangleIndexArray } from '../index_array_type.js';
17
+ import loadGeometry from '../load_geometry.js';
18
+ import { ProgramConfigurationSet } from '../program_configuration.js';
19
+ import { collisionBoxLayout, collisionCircleLayout, symbolLayoutAttributes } from './symbol_attributes.js';
20
+ import SymbolBuffers from './symbol_buffers.js';
21
+ import CollisionBuffers from './symbol_collision_buffers.js';
22
+
23
+ const vectorTileFeatureTypes = VectorTileFeature.types;
46
24
 
47
25
  function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) {
48
26
  array.emplaceBack(
@@ -60,86 +38,13 @@ function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) {
60
38
  );
61
39
  }
62
40
 
63
- function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
41
+ export function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
64
42
  dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
65
43
  dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
66
44
  dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
67
45
  dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
68
46
  }
69
47
 
70
- class SymbolBuffers {
71
- constructor(programConfigurations) {
72
- this.layoutVertexArray = new SymbolLayoutArray();
73
- this.indexArray = new TriangleIndexArray();
74
- this.programConfigurations = programConfigurations;
75
- this.segments = new SegmentVector();
76
- this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray();
77
- this.opacityVertexArray = new SymbolOpacityArray();
78
- this.placedSymbolArray = new PlacedSymbolArray();
79
- }
80
-
81
- upload(context, dynamicIndexBuffer, upload, update) {
82
- if (upload) {
83
- this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members);
84
- this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);
85
- this.dynamicLayoutVertexBuffer = context.createVertexBuffer(
86
- this.dynamicLayoutVertexArray,
87
- dynamicLayoutAttributes.members,
88
- true
89
- );
90
- this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);
91
- // This is a performance hack so that we can write to opacityVertexArray with uint32s
92
- // even though the shaders read uint8s
93
- this.opacityVertexBuffer.itemSize = 1;
94
- }
95
- if (upload || update) {
96
- this.programConfigurations.upload(context);
97
- }
98
- }
99
-
100
- destroy() {
101
- if (!this.layoutVertexBuffer) return;
102
- this.layoutVertexBuffer.destroy();
103
- this.indexBuffer.destroy();
104
- this.programConfigurations.destroy();
105
- this.segments.destroy();
106
- this.dynamicLayoutVertexBuffer.destroy();
107
- this.opacityVertexBuffer.destroy();
108
- }
109
- }
110
-
111
- register('SymbolBuffers', SymbolBuffers);
112
-
113
- class CollisionBuffers {
114
- constructor(LayoutArray, layoutAttributes, IndexArray) {
115
- this.layoutVertexArray = new LayoutArray();
116
- this.layoutAttributes = layoutAttributes;
117
- this.indexArray = new IndexArray();
118
- this.segments = new SegmentVector();
119
- this.collisionVertexArray = new CollisionVertexArray();
120
- }
121
-
122
- upload(context) {
123
- this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);
124
- this.indexBuffer = context.createIndexBuffer(this.indexArray);
125
- this.collisionVertexBuffer = context.createVertexBuffer(
126
- this.collisionVertexArray,
127
- collisionVertexAttributes.members,
128
- true
129
- );
130
- }
131
-
132
- destroy() {
133
- if (!this.layoutVertexBuffer) return;
134
- this.layoutVertexBuffer.destroy();
135
- this.indexBuffer.destroy();
136
- this.segments.destroy();
137
- this.collisionVertexBuffer.destroy();
138
- }
139
- }
140
-
141
- register('CollisionBuffers', CollisionBuffers);
142
-
143
48
  /**
144
49
  * Unlike other buckets, which simply implement #addFeature with type-specific
145
50
  * logic for (essentially) triangulating feature geometries, SymbolBucket
@@ -172,14 +77,13 @@ register('CollisionBuffers', CollisionBuffers);
172
77
  *
173
78
  * @private
174
79
  */
175
- class SymbolBucket {
80
+ export default class SymbolBucket {
176
81
  constructor(options) {
177
82
  this.collisionBoxArray = options.collisionBoxArray;
178
83
  this.zoom = options.zoom;
179
84
  this.globalState = options.globalState;
180
85
  this.overscaling = options.overscaling;
181
86
  this.layers = options.layers;
182
- this.layerIds = this.layers.map(layer => layer.id);
183
87
  this.index = options.index;
184
88
  this.pixelRatio = options.pixelRatio;
185
89
  this.sourceLayerIndex = options.sourceLayerIndex;
@@ -191,7 +95,7 @@ class SymbolBucket {
191
95
  this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);
192
96
  this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);
193
97
 
194
- const layout = this.layers[0].layout;
98
+ const layout = this.layers[0]._layout;
195
99
  const zOrderByViewportY = layout.get('symbol-z-order') === 'viewport-y';
196
100
  this.sortFeaturesByY =
197
101
  zOrderByViewportY &&
@@ -227,21 +131,9 @@ class SymbolBucket {
227
131
  this.symbolInstances = new SymbolInstanceArray();
228
132
  }
229
133
 
230
- calculateGlyphDependencies(text, stack, textAlongLine, doesAllowVerticalWritingMode) {
231
- for (let i = 0; i < text.length; i++) {
232
- stack[text.charCodeAt(i)] = true;
233
- if (textAlongLine && doesAllowVerticalWritingMode) {
234
- const verticalChar = verticalizedCharacterMap[text.charAt(i)];
235
- if (verticalChar) {
236
- stack[verticalChar.charCodeAt(0)] = true;
237
- }
238
- }
239
- }
240
- }
241
-
242
134
  populate(features, options) {
243
135
  const layer = this.layers[0];
244
- const layout = layer.layout;
136
+ const layout = layer._layout;
245
137
 
246
138
  const textFont = layout.get('text-font');
247
139
  const textField = layout.get('text-field');
@@ -249,7 +141,7 @@ class SymbolBucket {
249
141
  const hasText =
250
142
  (textField.value.kind !== 'constant' || textField.value.value.toString().length > 0) &&
251
143
  (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);
252
- const hasIcon = iconImage.value.kind !== 'constant' || (iconImage.value.value && iconImage.value.value.length > 0);
144
+ const hasIcon = iconImage.value.kind !== 'constant' || iconImage.value.value?.length > 0;
253
145
 
254
146
  this.features = [];
255
147
 
@@ -314,7 +206,7 @@ class SymbolBucket {
314
206
  const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text.toString());
315
207
  const sectionFont = section.fontStack || fontStack;
316
208
  const sectionStack = (stacks[sectionFont] = stacks[sectionFont] || {});
317
- this.calculateGlyphDependencies(section.text, sectionStack, textAlongLine, doesAllowVerticalWritingMode);
209
+ calculateGlyphDependencies(section.text, sectionStack, textAlongLine, doesAllowVerticalWritingMode);
318
210
  }
319
211
  }
320
212
  }
@@ -327,7 +219,9 @@ class SymbolBucket {
327
219
  }
328
220
 
329
221
  update(states, vtLayer, imagePositions) {
330
- if (!this.stateDependentLayers.length) return;
222
+ if (!this.stateDependentLayers.length) {
223
+ return;
224
+ }
331
225
  this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, {
332
226
  imagePositions,
333
227
  globalState: this.globalState
@@ -404,52 +298,36 @@ class SymbolBucket {
404
298
  lineStartIndex,
405
299
  lineLength
406
300
  ) {
407
- const indexArray = arrays.indexArray;
408
- const layoutVertexArray = arrays.layoutVertexArray;
409
- const dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray;
410
-
411
- const segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray);
301
+ const { indexArray, layoutVertexArray, dynamicLayoutVertexArray, segments } = arrays;
302
+ const segment = segments.prepareSegment(4 * quads.length, layoutVertexArray, indexArray);
412
303
  const glyphOffsetArrayStart = this.glyphOffsetArray.length;
413
304
  const vertexStartIndex = segment.vertexLength;
305
+ const { x: lax, y: lay } = labelAnchor;
414
306
 
415
- for (const symbol of quads) {
416
- const tl = symbol.tl;
417
- const tr = symbol.tr;
418
- const bl = symbol.bl;
419
- const br = symbol.br;
420
- const tex = symbol.tex;
421
-
422
- const index = segment.vertexLength;
307
+ for (const { tl, tr, bl, br, tex, glyphOffset } of quads) {
308
+ const y = glyphOffset[1];
423
309
 
424
- const y = symbol.glyphOffset[1];
425
- addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex);
426
- addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex);
427
- addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex);
428
- addVertex(
429
- layoutVertexArray,
430
- labelAnchor.x,
431
- labelAnchor.y,
432
- br.x,
433
- y + br.y,
434
- tex.x + tex.w,
435
- tex.y + tex.h,
436
- sizeVertex
437
- );
310
+ addVertex(layoutVertexArray, lax, lay, tl.x, y + tl.y, tex.x, tex.y, sizeVertex);
311
+ addVertex(layoutVertexArray, lax, lay, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex);
312
+ addVertex(layoutVertexArray, lax, lay, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex);
313
+ addVertex(layoutVertexArray, lax, lay, br.x, y + br.y, tex.x + tex.w, tex.y + tex.h, sizeVertex);
438
314
 
439
315
  addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, 0);
440
316
 
317
+ const index = segment.vertexLength;
318
+
441
319
  indexArray.emplaceBack(index, index + 1, index + 2);
442
320
  indexArray.emplaceBack(index + 1, index + 2, index + 3);
443
321
 
444
322
  segment.vertexLength += 4;
445
323
  segment.primitiveLength += 2;
446
324
 
447
- this.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]);
325
+ this.glyphOffsetArray.emplaceBack(glyphOffset[0]);
448
326
  }
449
327
 
450
328
  arrays.placedSymbolArray.emplaceBack(
451
- labelAnchor.x,
452
- labelAnchor.y,
329
+ lax,
330
+ lay,
453
331
  glyphOffsetArrayStart,
454
332
  this.glyphOffsetArray.length - glyphOffsetArrayStart,
455
333
  vertexStartIndex,
@@ -470,73 +348,25 @@ class SymbolBucket {
470
348
  });
471
349
  }
472
350
 
473
- _addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchorX, anchorY, extrude) {
474
- collisionVertexArray.emplaceBack(0, 0);
475
- return layoutVertexArray.emplaceBack(
476
- // pos
477
- point.x,
478
- point.y,
479
- // a_anchor_pos
480
- anchorX,
481
- anchorY,
482
- // extrude
483
- Math.round(extrude.x),
484
- Math.round(extrude.y)
485
- );
486
- }
487
-
488
351
  addCollisionDebugVertices(x1, y1, x2, y2, arrays, boxAnchorPoint, symbolInstance, isCircle) {
489
- const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);
490
- const index = segment.vertexLength;
491
-
492
- const layoutVertexArray = arrays.layoutVertexArray;
493
- const collisionVertexArray = arrays.collisionVertexArray;
352
+ const { layoutVertexArray, collisionVertexArray, indexArray } = arrays;
353
+ const { anchorX, anchorY } = symbolInstance;
494
354
 
495
- const anchorX = symbolInstance.anchorX;
496
- const anchorY = symbolInstance.anchorY;
355
+ const segment = arrays.segments.prepareSegment(4, layoutVertexArray, indexArray);
356
+ const index = segment.vertexLength;
497
357
 
498
- this._addCollisionDebugVertex(
499
- layoutVertexArray,
500
- collisionVertexArray,
501
- boxAnchorPoint,
502
- anchorX,
503
- anchorY,
504
- new Point(x1, y1)
505
- );
506
- this._addCollisionDebugVertex(
507
- layoutVertexArray,
508
- collisionVertexArray,
509
- boxAnchorPoint,
510
- anchorX,
511
- anchorY,
512
- new Point(x2, y1)
513
- );
514
- this._addCollisionDebugVertex(
515
- layoutVertexArray,
516
- collisionVertexArray,
517
- boxAnchorPoint,
518
- anchorX,
519
- anchorY,
520
- new Point(x2, y2)
521
- );
522
- this._addCollisionDebugVertex(
523
- layoutVertexArray,
524
- collisionVertexArray,
525
- boxAnchorPoint,
526
- anchorX,
527
- anchorY,
528
- new Point(x1, y2)
529
- );
358
+ addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, x1, y1);
359
+ addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, x2, y1);
360
+ addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, x2, y2);
361
+ addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, boxAnchorPoint, anchorX, anchorY, x1, y2);
530
362
 
531
363
  segment.vertexLength += 4;
532
364
  if (isCircle) {
533
- const indexArray = arrays.indexArray;
534
365
  indexArray.emplaceBack(index, index + 1, index + 2);
535
366
  indexArray.emplaceBack(index, index + 2, index + 3);
536
367
 
537
368
  segment.primitiveLength += 2;
538
369
  } else {
539
- const indexArray = arrays.indexArray;
540
370
  indexArray.emplaceBack(index, index + 1);
541
371
  indexArray.emplaceBack(index + 1, index + 2);
542
372
  indexArray.emplaceBack(index + 2, index + 3);
@@ -548,22 +378,18 @@ class SymbolBucket {
548
378
 
549
379
  addDebugCollisionBoxes(startIndex, endIndex, symbolInstance) {
550
380
  for (let b = startIndex; b < endIndex; b++) {
551
- const box = this.collisionBoxArray.get(b);
552
- const x1 = box.x1;
553
- const y1 = box.y1;
554
- const x2 = box.x2;
555
- const y2 = box.y2;
381
+ const { x1, y1, x2, y2, radius, anchorPoint } = this.collisionBoxArray.get(b);
556
382
 
557
383
  // If the radius > 0, this collision box is actually a circle
558
384
  // The data we add to the buffers is exactly the same, but we'll render with a different shader.
559
- const isCircle = box.radius > 0;
385
+ const isCircle = radius > 0;
560
386
  this.addCollisionDebugVertices(
561
387
  x1,
562
388
  y1,
563
389
  x2,
564
390
  y2,
565
391
  isCircle ? this.collisionCircle : this.collisionBox,
566
- box.anchorPoint,
392
+ anchorPoint,
567
393
  symbolInstance,
568
394
  isCircle
569
395
  );
@@ -578,68 +404,16 @@ class SymbolBucket {
578
404
  }
579
405
  }
580
406
 
581
- // These flat arrays are meant to be quicker to iterate over than the source
582
- // CollisionBoxArray
583
- _deserializeCollisionBoxesForSymbol(collisionBoxArray, textStartIndex, textEndIndex, iconStartIndex, iconEndIndex) {
584
- const collisionArrays = {};
585
- for (let k = textStartIndex; k < textEndIndex; k++) {
586
- const box = collisionBoxArray.get(k);
587
- if (box.radius === 0) {
588
- collisionArrays.textBox = {
589
- x1: box.x1,
590
- y1: box.y1,
591
- x2: box.x2,
592
- y2: box.y2,
593
- anchorPointX: box.anchorPointX,
594
- anchorPointY: box.anchorPointY
595
- };
596
- collisionArrays.textFeatureIndex = box.featureIndex;
597
- break; // Only one box allowed per instance
598
- }
599
- if (!collisionArrays.textCircles) {
600
- collisionArrays.textCircles = [];
601
- collisionArrays.textFeatureIndex = box.featureIndex;
602
- }
603
- const used = 1; // May be updated at collision detection time
604
- collisionArrays.textCircles.push(
605
- box.anchorPointX,
606
- box.anchorPointY,
607
- box.radius,
608
- box.signedDistanceFromAnchor,
609
- used
610
- );
611
- }
612
- for (let k = iconStartIndex; k < iconEndIndex; k++) {
613
- // An icon can only have one box now, so this indexing is a bit vestigial...
614
- const box = collisionBoxArray.get(k);
615
- if (box.radius === 0) {
616
- collisionArrays.iconBox = {
617
- x1: box.x1,
618
- y1: box.y1,
619
- x2: box.x2,
620
- y2: box.y2,
621
- anchorPointX: box.anchorPointX,
622
- anchorPointY: box.anchorPointY
623
- };
624
- collisionArrays.iconFeatureIndex = box.featureIndex;
625
- break; // Only one box allowed per instance
626
- }
627
- }
628
- return collisionArrays;
629
- }
630
-
631
407
  deserializeCollisionBoxes(collisionBoxArray) {
632
- this.collisionArrays = [];
408
+ this.collisionArrays = new Array(this.symbolInstances.length);
633
409
  for (let i = 0; i < this.symbolInstances.length; i++) {
634
410
  const symbolInstance = this.symbolInstances.get(i);
635
- this.collisionArrays.push(
636
- this._deserializeCollisionBoxesForSymbol(
637
- collisionBoxArray,
638
- symbolInstance.textBoxStartIndex,
639
- symbolInstance.textBoxEndIndex,
640
- symbolInstance.iconBoxStartIndex,
641
- symbolInstance.iconBoxEndIndex
642
- )
411
+ this.collisionArrays[i] = deserializeCollisionBoxesForSymbol(
412
+ collisionBoxArray,
413
+ symbolInstance.textBoxStartIndex,
414
+ symbolInstance.textBoxEndIndex,
415
+ symbolInstance.iconBoxStartIndex,
416
+ symbolInstance.iconBoxEndIndex
643
417
  );
644
418
  }
645
419
  }
@@ -671,72 +445,141 @@ class SymbolBucket {
671
445
  }
672
446
 
673
447
  sortFeatures(angle) {
674
- if (!this.sortFeaturesByY) return;
448
+ if (!this.sortFeaturesByY) {
449
+ return;
450
+ }
675
451
 
676
- if (this.sortedAngle === angle) return;
452
+ if (this.sortedAngle === angle) {
453
+ return;
454
+ }
677
455
  this.sortedAngle = angle;
678
456
 
679
457
  // The current approach to sorting doesn't sort across segments so don't try.
680
458
  // Sorting within segments separately seemed not to be worth the complexity.
681
- if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) return;
459
+ if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) {
460
+ return;
461
+ }
682
462
 
683
463
  // If the symbols are allowed to overlap sort them by their vertical screen position.
684
464
  // The index array buffer is rewritten to reference the (unchanged) vertices in the
685
465
  // sorted order.
686
466
 
687
467
  // To avoid sorting the actual symbolInstance array we sort an array of indexes.
688
- const symbolInstanceIndexes = [];
689
- for (let i = 0; i < this.symbolInstances.length; i++) {
690
- symbolInstanceIndexes.push(i);
691
- }
692
-
468
+ const slen = this.symbolInstances.length;
469
+ const symbolInstanceIndexes = new Array(slen);
470
+ const rotatedYs = new Array(slen);
471
+ const featureIndexes = new Array(slen);
693
472
  const sin = Math.sin(angle);
694
473
  const cos = Math.cos(angle);
695
-
696
- const rotatedYs = [];
697
- const featureIndexes = [];
698
- for (let i = 0; i < this.symbolInstances.length; i++) {
699
- const symbolInstance = this.symbolInstances.get(i);
700
- rotatedYs.push(Math.round(sin * symbolInstance.anchorX + cos * symbolInstance.anchorY) | 0);
701
- featureIndexes.push(symbolInstance.featureIndex);
474
+ for (let i = 0; i < slen; i++) {
475
+ symbolInstanceIndexes[i] = i;
476
+ const { anchorX, anchorY, featureIndex } = this.symbolInstances.get(i);
477
+ rotatedYs[i] = Math.round(sin * anchorX + cos * anchorY) | 0;
478
+ featureIndexes[i] = featureIndex;
702
479
  }
703
480
 
704
- symbolInstanceIndexes.sort((aIndex, bIndex) => {
705
- return rotatedYs[aIndex] - rotatedYs[bIndex] || featureIndexes[bIndex] - featureIndexes[aIndex];
706
- });
481
+ symbolInstanceIndexes.sort((a, b) => rotatedYs[a] - rotatedYs[b] || featureIndexes[b] - featureIndexes[a]);
707
482
 
708
483
  this.text.indexArray.clear();
709
484
  this.icon.indexArray.clear();
710
485
 
711
- this.featureSortOrder = [];
486
+ this.featureSortOrder = new Array(slen);
712
487
 
713
- for (const i of symbolInstanceIndexes) {
714
- const symbolInstance = this.symbolInstances.get(i);
715
- this.featureSortOrder.push(symbolInstance.featureIndex);
488
+ for (let i = 0; i < slen; i++) {
489
+ const index = symbolInstanceIndexes[i];
490
+ const { featureIndex, horizontalPlacedTextSymbolIndex, verticalPlacedTextSymbolIndex } =
491
+ this.symbolInstances.get(index);
492
+ this.featureSortOrder[i] = featureIndex;
716
493
 
717
- if (symbolInstance.horizontalPlacedTextSymbolIndex >= 0) {
718
- this.addIndicesForPlacedTextSymbol(symbolInstance.horizontalPlacedTextSymbolIndex);
494
+ if (horizontalPlacedTextSymbolIndex >= 0) {
495
+ this.addIndicesForPlacedTextSymbol(horizontalPlacedTextSymbolIndex);
719
496
  }
720
- if (symbolInstance.verticalPlacedTextSymbolIndex >= 0) {
721
- this.addIndicesForPlacedTextSymbol(symbolInstance.verticalPlacedTextSymbolIndex);
497
+ if (verticalPlacedTextSymbolIndex >= 0) {
498
+ this.addIndicesForPlacedTextSymbol(verticalPlacedTextSymbolIndex);
722
499
  }
723
500
 
724
- const placedIcon = this.icon.placedSymbolArray.get(i);
725
- if (placedIcon.numGlyphs) {
726
- const vertexIndex = placedIcon.vertexStartIndex;
501
+ const { numGlyphs, vertexStartIndex: vertexIndex } = this.icon.placedSymbolArray.get(index);
502
+ if (numGlyphs) {
727
503
  this.icon.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
728
504
  this.icon.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
729
505
  }
730
506
  }
731
507
 
732
- if (this.text.indexBuffer) this.text.indexBuffer.updateData(this.text.indexArray);
733
- if (this.icon.indexBuffer) this.icon.indexBuffer.updateData(this.icon.indexArray);
508
+ if (this.text.indexBuffer) {
509
+ this.text.indexBuffer.updateData(this.text.indexArray);
510
+ }
511
+ if (this.icon.indexBuffer) {
512
+ this.icon.indexBuffer.updateData(this.icon.indexArray);
513
+ }
734
514
  }
735
515
  }
736
516
 
737
- register('SymbolBucket', SymbolBucket, {
738
- omit: ['layers', 'collisionBoxArray', 'features', 'compareText']
739
- });
517
+ function addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchorX, anchorY, extrudeX, extrudeY) {
518
+ collisionVertexArray.emplaceBack(0, 0);
519
+ return layoutVertexArray.emplaceBack(
520
+ // pos
521
+ point.x,
522
+ point.y,
523
+ // a_anchor_pos
524
+ anchorX,
525
+ anchorY,
526
+ // extrude
527
+ Math.round(extrudeX),
528
+ Math.round(extrudeY)
529
+ );
530
+ }
531
+
532
+ // These flat arrays are meant to be quicker to iterate over than the source
533
+ // CollisionBoxArray
534
+ function deserializeCollisionBoxesForSymbol(
535
+ collisionBoxArray,
536
+ textStartIndex,
537
+ textEndIndex,
538
+ iconStartIndex,
539
+ iconEndIndex
540
+ ) {
541
+ const collisionArrays = {};
542
+ for (let k = textStartIndex; k < textEndIndex; k++) {
543
+ const { x1, y1, x2, y2, anchorPointX, anchorPointY, featureIndex, radius, signedDistanceFromAnchor } =
544
+ collisionBoxArray.get(k);
545
+ if (radius === 0) {
546
+ collisionArrays.textBox = {
547
+ x1,
548
+ y1,
549
+ x2,
550
+ y2,
551
+ anchorPointX,
552
+ anchorPointY
553
+ };
554
+ collisionArrays.textFeatureIndex = featureIndex;
555
+ break; // Only one box allowed per instance
556
+ }
557
+ if (!collisionArrays.textCircles) {
558
+ collisionArrays.textCircles = [];
559
+ collisionArrays.textFeatureIndex = featureIndex;
560
+ }
561
+ const used = 1; // May be updated at collision detection time
562
+ collisionArrays.textCircles.push(anchorPointX, anchorPointY, radius, signedDistanceFromAnchor, used);
563
+ }
564
+ for (let k = iconStartIndex; k < iconEndIndex; k++) {
565
+ // An icon can only have one box now, so this indexing is a bit vestigial...
566
+ const box = collisionBoxArray.get(k);
567
+ if (box.radius === 0) {
568
+ const { x1, y1, x2, y2, anchorPointX, anchorPointY, featureIndex } = box;
569
+ collisionArrays.iconBox = {
570
+ x1,
571
+ y1,
572
+ x2,
573
+ y2,
574
+ anchorPointX,
575
+ anchorPointY
576
+ };
577
+ collisionArrays.iconFeatureIndex = featureIndex;
578
+ break; // Only one box allowed per instance
579
+ }
580
+ }
581
+ return collisionArrays;
582
+ }
740
583
 
741
584
  // this constant is based on the size of StructArray indexes used in a symbol
742
585
  // bucket--namely, glyphOffsetArrayStart
@@ -746,6 +589,14 @@ register('SymbolBucket', SymbolBucket, {
746
589
  // but we expect there to be many fewer boxes/lines than glyphs
747
590
  SymbolBucket.MAX_GLYPHS = 65535;
748
591
 
749
- SymbolBucket.addDynamicAttributes = addDynamicAttributes;
750
-
751
- module.exports = SymbolBucket;
592
+ function calculateGlyphDependencies(text, stack, textAlongLine, doesAllowVerticalWritingMode) {
593
+ for (let i = 0; i < text.length; i++) {
594
+ stack[text.charCodeAt(i)] = true;
595
+ if (textAlongLine && doesAllowVerticalWritingMode) {
596
+ const verticalChar = verticalizedCharacterMap[text.charAt(i)];
597
+ if (verticalChar) {
598
+ stack[verticalChar.charCodeAt(0)] = true;
599
+ }
600
+ }
601
+ }
602
+ }