@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.
- package/README.md +7 -0
- package/build/min/package.json +2 -1
- package/build/min/src/shaders/_prelude.fragment.glsl.js +2 -2
- package/build/min/src/shaders/_prelude.vertex.glsl.js +2 -2
- package/build/min/src/shaders/background.fragment.glsl.js +2 -2
- package/build/min/src/shaders/background.vertex.glsl.js +1 -1
- package/build/min/src/shaders/background_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/background_pattern.vertex.glsl.js +1 -1
- package/build/min/src/shaders/circle.fragment.glsl.js +2 -2
- package/build/min/src/shaders/circle.vertex.glsl.js +2 -2
- package/build/min/src/shaders/clipping_mask.fragment.glsl.js +1 -1
- package/build/min/src/shaders/clipping_mask.vertex.glsl.js +1 -1
- package/build/min/src/shaders/collision_box.fragment.glsl.js +1 -1
- package/build/min/src/shaders/collision_box.vertex.glsl.js +1 -1
- package/build/min/src/shaders/collision_circle.fragment.glsl.js +1 -1
- package/build/min/src/shaders/collision_circle.vertex.glsl.js +1 -1
- package/build/min/src/shaders/debug.fragment.glsl.js +1 -1
- package/build/min/src/shaders/debug.vertex.glsl.js +1 -1
- package/build/min/src/shaders/fill.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/heatmap.fragment.glsl.js +2 -2
- package/build/min/src/shaders/heatmap.vertex.glsl.js +2 -2
- package/build/min/src/shaders/heatmap_texture.fragment.glsl.js +2 -2
- package/build/min/src/shaders/heatmap_texture.vertex.glsl.js +1 -1
- package/build/min/src/shaders/hillshade.fragment.glsl.js +2 -2
- package/build/min/src/shaders/hillshade.vertex.glsl.js +1 -1
- package/build/min/src/shaders/hillshade_prepare.fragment.glsl.js +2 -2
- package/build/min/src/shaders/hillshade_prepare.vertex.glsl.js +1 -1
- package/build/min/src/shaders/line.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_gradient.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_gradient.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_sdf.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_sdf.vertex.glsl.js +2 -2
- package/build/min/src/shaders/raster.fragment.glsl.js +2 -2
- package/build/min/src/shaders/raster.vertex.glsl.js +1 -1
- package/build/min/src/shaders/symbol_icon.fragment.glsl.js +2 -2
- package/build/min/src/shaders/symbol_icon.vertex.glsl.js +2 -2
- package/build/min/src/shaders/symbol_sdf.fragment.glsl.js +2 -2
- package/build/min/src/shaders/symbol_sdf.vertex.glsl.js +2 -2
- package/package.json +5 -4
- package/src/data/array_types.js +55 -117
- package/src/data/bucket/circle_attributes.js +2 -4
- package/src/data/bucket/circle_bucket.js +19 -16
- package/src/data/bucket/fill_attributes.js +2 -4
- package/src/data/bucket/fill_bucket.js +38 -27
- package/src/data/bucket/fill_extrusion_attributes.js +2 -4
- package/src/data/bucket/fill_extrusion_bucket.js +56 -37
- package/src/data/bucket/heatmap_bucket.js +2 -11
- package/src/data/bucket/line_attributes.js +2 -4
- package/src/data/bucket/line_bucket.js +208 -163
- package/src/data/bucket/pattern_attributes.js +2 -4
- package/src/data/bucket/pattern_bucket_features.js +7 -9
- package/src/data/bucket/symbol_attributes.js +12 -26
- package/src/data/bucket/symbol_bucket.js +174 -323
- package/src/data/bucket/symbol_buffers.js +62 -0
- package/src/data/bucket/symbol_collision_buffers.js +33 -0
- package/src/data/bucket.js +26 -25
- package/src/data/dem_data.js +11 -10
- package/src/data/extent.js +1 -1
- package/src/data/feature_index.js +38 -28
- package/src/data/index_array_type.js +1 -6
- package/src/data/load_geometry.js +6 -9
- package/src/data/pos_attributes.js +2 -3
- package/src/data/program_configuration.js +47 -38
- package/src/data/raster_bounds_attributes.js +2 -2
- package/src/data/segment.js +4 -7
- package/src/geo/coordinate.js +1 -1
- package/src/geo/lng_lat.js +3 -3
- package/src/geo/lng_lat_bounds.js +8 -4
- package/src/geo/transform.js +69 -30
- package/src/gl/color_mode.js +2 -2
- package/src/gl/context.js +28 -29
- package/src/gl/cull_face_mode.js +1 -1
- package/src/gl/depth_mode.js +1 -1
- package/src/gl/framebuffer.js +8 -4
- package/src/gl/index_buffer.js +2 -2
- package/src/gl/stencil_mode.js +1 -1
- package/src/gl/value.js +33 -68
- package/src/gl/vertex_buffer.js +2 -2
- package/src/index.js +49 -25
- package/src/render/draw_background.js +17 -12
- package/src/render/draw_circle.js +15 -12
- package/src/render/draw_collision_debug.js +11 -8
- package/src/render/draw_debug.js +16 -14
- package/src/render/draw_fill.js +27 -20
- package/src/render/draw_fill_extrusion.js +20 -17
- package/src/render/draw_heatmap.js +21 -16
- package/src/render/draw_hillshade.js +12 -9
- package/src/render/draw_line.js +36 -22
- package/src/render/draw_raster.js +22 -18
- package/src/render/draw_symbol.js +38 -33
- package/src/render/glyph_atlas.js +9 -8
- package/src/render/glyph_manager.js +2 -3
- package/src/render/image_atlas.js +4 -11
- package/src/render/image_manager.js +39 -28
- package/src/render/line_atlas.js +2 -2
- package/src/render/painter.js +78 -61
- package/src/render/program/background_program.js +6 -13
- package/src/render/program/circle_program.js +8 -10
- package/src/render/program/clipping_mask_program.js +3 -5
- package/src/render/program/collision_program.js +4 -6
- package/src/render/program/debug_program.js +3 -5
- package/src/render/program/fill_extrusion_program.js +9 -15
- package/src/render/program/fill_program.js +10 -21
- package/src/render/program/heatmap_program.js +9 -15
- package/src/render/program/hillshade_program.js +16 -22
- package/src/render/program/line_program.js +14 -25
- package/src/render/program/pattern.js +5 -7
- package/src/render/program/program_uniforms.js +13 -20
- package/src/render/program/raster_program.js +9 -11
- package/src/render/program/symbol_program.js +5 -7
- package/src/render/program.js +5 -6
- package/src/render/texture.js +1 -1
- package/src/render/tile_mask.js +6 -4
- package/src/render/uniform_binding.js +9 -20
- package/src/render/vertex_array_object.js +5 -3
- package/src/shaders/encode_attribute.js +2 -6
- package/src/shaders/index.js +103 -51
- package/src/source/geojson_source.js +25 -30
- package/src/source/geojson_worker_source.js +46 -74
- package/src/source/geojson_wrapper.js +13 -5
- package/src/source/image_source.js +17 -28
- package/src/source/load_tilejson.js +3 -3
- package/src/source/pixels_to_tile_units.js +3 -3
- package/src/source/query_features.js +17 -15
- package/src/source/raster_dem_tile_source.js +54 -71
- package/src/source/raster_tile_source.js +14 -15
- package/src/source/resources/glyphs.js +4 -5
- package/src/source/resources/index.js +4 -12
- package/src/source/rtl_text_plugin.js +62 -35
- package/src/source/source.js +14 -22
- package/src/source/source_cache.js +221 -179
- package/src/source/source_state.js +125 -13
- package/src/source/tile.js +67 -66
- package/src/source/tile_bounds.js +36 -29
- package/src/source/tile_cache.js +2 -2
- package/src/source/tile_id.js +30 -26
- package/src/source/vector_tile_source.js +23 -21
- package/src/source/vector_tile_worker_source.js +22 -26
- package/src/source/worker_tile.js +139 -134
- package/src/style/create_style_layer.js +11 -11
- package/src/style/evaluation_parameters.js +4 -6
- package/src/style/light.js +5 -5
- package/src/style/load_sprite.js +6 -6
- package/src/style/parse_glyph_pbf.js +21 -17
- package/src/style/pauseable_placement.js +7 -9
- package/src/style/properties.js +21 -51
- package/src/style/query_utils.js +7 -13
- package/src/style/style.js +314 -221
- package/src/style/style_layer/background_style_layer.js +3 -4
- package/src/style/style_layer/background_style_layer_properties.js +2 -2
- package/src/style/style_layer/circle_style_layer.js +25 -20
- package/src/style/style_layer/circle_style_layer_properties.js +2 -2
- package/src/style/style_layer/fill_extrusion_style_layer.js +55 -37
- package/src/style/style_layer/fill_extrusion_style_layer_properties.js +2 -2
- package/src/style/style_layer/fill_style_layer.js +11 -12
- package/src/style/style_layer/fill_style_layer_properties.js +2 -2
- package/src/style/style_layer/heatmap_style_layer.js +6 -7
- package/src/style/style_layer/heatmap_style_layer_properties.js +2 -2
- package/src/style/style_layer/hillshade_style_layer.js +4 -5
- package/src/style/style_layer/hillshade_style_layer_properties.js +2 -2
- package/src/style/style_layer/line_style_layer.js +33 -30
- package/src/style/style_layer/line_style_layer_properties.js +5 -5
- package/src/style/style_layer/raster_style_layer.js +3 -4
- package/src/style/style_layer/raster_style_layer_properties.js +2 -2
- package/src/style/style_layer/symbol_style_layer.js +20 -21
- package/src/style/style_layer/symbol_style_layer_properties.js +2 -2
- package/src/style/style_layer.js +66 -47
- package/src/style/style_layer_index.js +17 -42
- package/src/style/zoom_history.js +1 -1
- package/src/style-spec/error/parsing_error.js +1 -1
- package/src/style-spec/error/validation_error.js +5 -3
- package/src/style-spec/feature_filter/convert.js +17 -9
- package/src/style-spec/feature_filter/index.js +13 -9
- package/src/style-spec/util/eval_support.js +2 -2
- package/src/style-spec/util/ref_properties.js +1 -1
- package/src/symbol/anchor.js +2 -6
- package/src/symbol/check_max_angle.js +13 -5
- package/src/symbol/clip_line.js +2 -3
- package/src/symbol/collision_feature.js +8 -4
- package/src/symbol/collision_index.js +5 -7
- package/src/symbol/cross_tile_symbol_index.js +7 -10
- package/src/symbol/get_anchors.js +15 -8
- package/src/symbol/grid_index.js +5 -3
- package/src/symbol/mergelines.js +2 -2
- package/src/symbol/opacity_state.js +1 -5
- package/src/symbol/placement.js +28 -23
- package/src/symbol/projection.js +29 -28
- package/src/symbol/quads.js +14 -16
- package/src/symbol/shaping.js +27 -19
- package/src/symbol/symbol_layout.js +24 -28
- package/src/symbol/symbol_size.js +13 -12
- package/src/symbol/transform_text.js +4 -4
- package/src/ui/camera.js +34 -18
- package/src/ui/map.js +102 -44
- package/src/util/async.js +11 -5
- package/src/util/browser.js +1 -1
- package/src/util/callback.js +3 -9
- package/src/util/classify_rings.js +13 -8
- package/src/util/color_ramp.js +3 -3
- package/src/util/config.js +4 -4
- package/src/util/dictionary_coder.js +2 -3
- package/src/util/dom.js +7 -3
- package/src/util/find_pole_of_inaccessibility.js +29 -14
- package/src/util/group_layers.js +41 -0
- package/src/util/image.js +3 -13
- package/src/util/interpolate.js +1 -1
- package/src/util/intersection_tests.js +80 -42
- package/src/util/is_char_in_unicode_block.js +1 -1
- package/src/util/key.js +25 -0
- package/src/util/loader/image.js +1 -1
- package/src/util/object.js +33 -76
- package/src/util/script_detection.js +212 -91
- package/src/util/struct_array.js +8 -40
- package/src/util/task_queue.js +11 -7
- package/src/util/throttle.js +2 -2
- package/src/util/tile_cover.js +8 -5
- package/src/util/token.js +1 -1
- package/src/util/unique_id.js +2 -2
- package/src/util/util.js +21 -29
- package/src/util/vectortile_to_geojson.js +4 -2
- package/src/util/verticalize_punctuation.js +3 -7
- package/src/util/warn.js +4 -4
- package/src/util/web_worker.js +3 -3
- package/src/worker.js +1 -4
- package/src/source/resources/images.js +0 -68
- package/src/source/worker.js +0 -110
- package/src/source/worker_source.js +0 -14
- package/src/style-spec/deref.js +0 -51
- package/src/style-spec/group_by_layout.js +0 -46
- package/src/util/actor.js +0 -108
- package/src/util/dispatcher.js +0 -65
- package/src/util/global_worker_pool.js +0 -15
- package/src/util/transfer_registry.js +0 -168
- package/src/util/web_worker_transfer.js +0 -43
- package/src/util/worker_pool.js +0 -41
|
@@ -1,48 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
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].
|
|
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.
|
|
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' ||
|
|
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
|
-
|
|
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)
|
|
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
|
|
408
|
-
const
|
|
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
|
|
416
|
-
const
|
|
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
|
-
|
|
425
|
-
addVertex(layoutVertexArray,
|
|
426
|
-
addVertex(layoutVertexArray,
|
|
427
|
-
addVertex(layoutVertexArray,
|
|
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(
|
|
325
|
+
this.glyphOffsetArray.emplaceBack(glyphOffset[0]);
|
|
448
326
|
}
|
|
449
327
|
|
|
450
328
|
arrays.placedSymbolArray.emplaceBack(
|
|
451
|
-
|
|
452
|
-
|
|
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
|
|
490
|
-
const
|
|
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
|
|
496
|
-
const
|
|
355
|
+
const segment = arrays.segments.prepareSegment(4, layoutVertexArray, indexArray);
|
|
356
|
+
const index = segment.vertexLength;
|
|
497
357
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
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)
|
|
448
|
+
if (!this.sortFeaturesByY) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
675
451
|
|
|
676
|
-
if (this.sortedAngle === angle)
|
|
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)
|
|
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
|
|
689
|
-
|
|
690
|
-
|
|
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
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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((
|
|
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 (
|
|
714
|
-
const
|
|
715
|
-
|
|
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 (
|
|
718
|
-
this.addIndicesForPlacedTextSymbol(
|
|
494
|
+
if (horizontalPlacedTextSymbolIndex >= 0) {
|
|
495
|
+
this.addIndicesForPlacedTextSymbol(horizontalPlacedTextSymbolIndex);
|
|
719
496
|
}
|
|
720
|
-
if (
|
|
721
|
-
this.addIndicesForPlacedTextSymbol(
|
|
497
|
+
if (verticalPlacedTextSymbolIndex >= 0) {
|
|
498
|
+
this.addIndicesForPlacedTextSymbol(verticalPlacedTextSymbolIndex);
|
|
722
499
|
}
|
|
723
500
|
|
|
724
|
-
const
|
|
725
|
-
if (
|
|
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)
|
|
733
|
-
|
|
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
|
-
|
|
738
|
-
|
|
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
|
-
|
|
750
|
-
|
|
751
|
-
|
|
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
|
+
}
|