summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorM.Stephen <truestyle2005@163.com>2019-09-19 18:48:22 +0800
committerM.Stephen <truestyle2005@163.com>2019-09-19 18:48:22 +0800
commitf2e649c142281572e66ee013accc57dd6ac74cd8 (patch)
treef09c3b550fb970be133c68132820b55805ee4d73
parenteb1f8eb32286dd7b89ae76b839b774b0071ca5a5 (diff)
parent80e8d7a2fcb9f75e585bb7dd26c2f2a893b6f560 (diff)
downloadqtlocation-mapboxgl-upstream/stephen-ios-error-report.tar.gz
Merge branch 'master' into stephen-ios-error-reportupstream/stephen-ios-error-report
-rw-r--r--.clang-format23
-rw-r--r--.clang-tidy3
-rw-r--r--.cmake-format91
-rw-r--r--Makefile95
-rw-r--r--appveyor.yml66
-rw-r--r--benchmark/fixtures/api/cache.dbbin1298432 -> 1298432 bytes
-rw-r--r--benchmark/include/mbgl/benchmark.hpp4
-rw-r--r--circle.yml447
-rw-r--r--cmake/benchmark.cmake2
-rw-r--r--cmake/core.cmake24
-rw-r--r--cmake/filesource.cmake2
-rw-r--r--cmake/glfw.cmake3
-rw-r--r--cmake/offline.cmake4
-rw-r--r--cmake/render-test.cmake2
-rw-r--r--cmake/test.cmake6
-rw-r--r--expression-test/filesystem.hpp9
-rw-r--r--include/mbgl/renderer/renderer.hpp9
-rw-r--r--include/mbgl/style/expression/expression.hpp8
-rw-r--r--include/mbgl/style/layer.hpp6
-rw-r--r--include/mbgl/style/property_expression.hpp4
-rw-r--r--include/mbgl/style/source.hpp3
-rw-r--r--include/mbgl/style/sources/custom_geometry_source.hpp1
-rw-r--r--include/mbgl/style/sources/geojson_source.hpp2
-rw-r--r--include/mbgl/style/sources/image_source.hpp2
-rw-r--r--include/mbgl/style/sources/raster_dem_source.hpp2
-rw-r--r--include/mbgl/style/sources/raster_source.hpp2
-rw-r--r--include/mbgl/style/sources/vector_source.hpp7
-rw-r--r--include/mbgl/util/default_styles.hpp (renamed from platform/default/include/mbgl/util/default_styles.hpp)13
-rw-r--r--include/mbgl/util/feature.hpp15
-rw-r--r--include/mbgl/util/util.hpp23
m---------mapbox-gl-js0
-rw-r--r--next/CMakeLists.txt943
-rw-r--r--next/README.md42
-rw-r--r--next/benchmark/CMakeLists.txt41
-rw-r--r--next/bin/CMakeLists.txt26
-rw-r--r--next/expression-test/CMakeLists.txt36
-rw-r--r--next/platform/android/android.cmake306
-rw-r--r--next/platform/glfw/CMakeLists.txt38
-rw-r--r--next/platform/ios/ios.cmake70
-rw-r--r--next/platform/linux/linux.cmake126
-rw-r--r--next/platform/macos/macos.cmake187
-rw-r--r--next/platform/node/CMakeLists.txt52
-rw-r--r--next/platform/qt/qt.cmake190
-rw-r--r--next/render-test/CMakeLists.txt50
-rw-r--r--next/test/CMakeLists.txt167
l---------next/vendor1
-rw-r--r--package.json8
-rw-r--r--platform/android/CHANGELOG.md8
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java32
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java2
-rw-r--r--platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt60
-rw-r--r--platform/android/src/jni.hpp2
-rw-r--r--platform/android/src/jni_native.hpp4
-rw-r--r--platform/android/src/test/runtime.cpp1
-rw-r--r--platform/darwin/src/MGLMapSnapshotter.h1
-rw-r--r--platform/darwin/src/MGLOfflinePack.mm11
-rw-r--r--platform/darwin/src/MGLOfflineStorage.mm4
-rw-r--r--platform/darwin/src/MGLRasterDEMSource.mm11
-rw-r--r--platform/darwin/src/MGLRasterTileSource.mm15
-rw-r--r--platform/darwin/src/MGLRasterTileSource_Private.h4
-rw-r--r--platform/darwin/src/MGLSDKMetricsManager.m15
-rw-r--r--platform/darwin/test/MGLOfflinePackTests.mm (renamed from platform/darwin/test/MGLOfflinePackTests.m)18
-rw-r--r--platform/darwin/test/MGLOfflineStorageTests.mm198
-rw-r--r--platform/darwin/test/MGLStyleTests.mm95
-rw-r--r--platform/darwin/test/MGLTestAssertionHandler.h18
-rw-r--r--platform/darwin/test/MGLTestAssertionHandler.m77
-rw-r--r--platform/default/include/mbgl/storage/offline_database.hpp1
-rw-r--r--platform/default/src/mbgl/storage/http_file_source.cpp168
-rw-r--r--platform/default/src/mbgl/storage/offline_database.cpp9
-rw-r--r--platform/default/src/mbgl/util/format_number.cpp10
-rw-r--r--platform/glfw/glfw_view.cpp103
-rw-r--r--platform/glfw/glfw_view.hpp4
-rw-r--r--platform/ios/CHANGELOG.md20
-rw-r--r--platform/ios/Integration Tests/MGLStyleLayerIntegrationTests.m16
-rw-r--r--platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterSwiftTests.swift18
-rw-r--r--platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterTest.m37
-rw-r--r--platform/ios/app/MBXAnnotationView.h2
-rw-r--r--platform/ios/app/MBXAppDelegate.m3
-rw-r--r--platform/ios/app/MBXCustomCalloutView.h3
-rw-r--r--platform/ios/app/MBXCustomLocationViewController.m4
-rw-r--r--platform/ios/app/MBXEmbeddedMapViewController.m3
-rw-r--r--platform/ios/app/MBXOfflinePacksTableViewController.m3
-rw-r--r--platform/ios/app/MBXOrnamentsViewController.m4
-rw-r--r--platform/ios/app/MBXSnapshotsViewController.m4
-rw-r--r--platform/ios/app/MBXState.h3
-rw-r--r--platform/ios/app/MBXStateManager.m1
-rw-r--r--platform/ios/app/MBXUserLocationAnnotationView.h2
-rw-r--r--platform/ios/app/MBXViewController.m6
-rw-r--r--platform/ios/benchmark/MBXBenchAppDelegate.m1
-rw-r--r--platform/ios/benchmark/MBXBenchViewController.mm3
-rw-r--r--platform/ios/config.cmake2
-rw-r--r--platform/ios/core-files.json3
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj32
-rw-r--r--platform/ios/src/MGLCompassButton.mm2
-rw-r--r--platform/ios/src/MGLCompassButton_Private.h2
-rw-r--r--platform/ios/src/MGLScaleBar.mm2
-rw-r--r--platform/ios/src/UIImage+MGLAdditions.h2
-rw-r--r--platform/linux/config.cmake2
-rw-r--r--platform/macos/CHANGELOG.md2
-rw-r--r--platform/macos/macos.xcodeproj/project.pbxproj22
-rw-r--r--platform/macos/src/MGLAnnotationImage_Private.h2
-rw-r--r--platform/node/CHANGELOG.md4
-rw-r--r--platform/node/src/node_feature.cpp6
-rw-r--r--platform/node/src/node_map.cpp221
-rw-r--r--platform/node/src/node_map.hpp4
-rw-r--r--platform/node/test/ignores.json16
-rw-r--r--platform/node/test/js/map.test.js3
-rw-r--r--platform/node/test/suite_implementation.js6
-rw-r--r--platform/qt/config.cmake75
-rw-r--r--platform/qt/qnx.cmake77
-rw-r--r--platform/qt/qt.cmake187
-rw-r--r--platform/qt/test/qmapboxgl.test.cpp15
-rw-r--r--platform/qt/test/qmapboxgl.test.hpp5
-rw-r--r--render-test/main.cpp2
-rw-r--r--render-test/runner.cpp143
-rw-r--r--scripts/ci/Dockerfile110
-rw-r--r--scripts/ci/etc/apt/sources.list10
-rwxr-xr-xscripts/trigger-maps-documentation-deploy-steps.sh (renamed from platform/ios/scripts/trigger-external-deploy-steps.sh)4
-rw-r--r--src/core-files.json3
-rw-r--r--src/mbgl/annotation/annotation_source.cpp7
-rw-r--r--src/mbgl/annotation/annotation_source.hpp7
-rw-r--r--src/mbgl/annotation/render_annotation_source.cpp2
-rw-r--r--src/mbgl/geometry/feature_index.cpp71
-rw-r--r--src/mbgl/geometry/feature_index.hpp33
-rw-r--r--src/mbgl/gfx/vertex_vector.hpp5
-rw-r--r--src/mbgl/layout/pattern_layout.hpp2
-rw-r--r--src/mbgl/layout/symbol_layout.cpp6
-rw-r--r--src/mbgl/renderer/bucket.hpp8
-rw-r--r--src/mbgl/renderer/buckets/circle_bucket.cpp23
-rw-r--r--src/mbgl/renderer/buckets/circle_bucket.hpp8
-rw-r--r--src/mbgl/renderer/buckets/fill_bucket.cpp29
-rw-r--r--src/mbgl/renderer/buckets/fill_bucket.hpp8
-rw-r--r--src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp26
-rw-r--r--src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp8
-rw-r--r--src/mbgl/renderer/buckets/heatmap_bucket.cpp8
-rw-r--r--src/mbgl/renderer/buckets/heatmap_bucket.hpp6
-rw-r--r--src/mbgl/renderer/buckets/line_bucket.cpp27
-rw-r--r--src/mbgl/renderer/buckets/line_bucket.hpp8
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.cpp15
-rw-r--r--src/mbgl/renderer/layers/render_circle_layer.hpp9
-rw-r--r--src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp12
-rw-r--r--src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp9
-rw-r--r--src/mbgl/renderer/layers/render_fill_layer.cpp12
-rw-r--r--src/mbgl/renderer/layers/render_fill_layer.hpp9
-rw-r--r--src/mbgl/renderer/layers/render_heatmap_layer.cpp11
-rw-r--r--src/mbgl/renderer/layers/render_heatmap_layer.hpp9
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.cpp29
-rw-r--r--src/mbgl/renderer/layers/render_line_layer.hpp11
-rw-r--r--src/mbgl/renderer/paint_property_binder.hpp137
-rw-r--r--src/mbgl/renderer/possibly_evaluated_property_value.hpp8
-rw-r--r--src/mbgl/renderer/render_layer.hpp11
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp23
-rw-r--r--src/mbgl/renderer/render_orchestrator.hpp9
-rw-r--r--src/mbgl/renderer/render_source.hpp7
-rw-r--r--src/mbgl/renderer/render_tile.cpp4
-rw-r--r--src/mbgl/renderer/render_tile.hpp3
-rw-r--r--src/mbgl/renderer/renderer.cpp15
-rw-r--r--src/mbgl/renderer/source_state.cpp132
-rw-r--r--src/mbgl/renderer/source_state.hpp29
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.cpp19
-rw-r--r--src/mbgl/renderer/sources/render_tile_source.hpp13
-rw-r--r--src/mbgl/renderer/tile_pyramid.cpp18
-rw-r--r--src/mbgl/renderer/tile_pyramid.hpp10
-rw-r--r--src/mbgl/style/conversion/source.cpp21
-rw-r--r--src/mbgl/style/expression/compound_expression.cpp167
-rw-r--r--src/mbgl/style/expression/is_constant.cpp6
-rw-r--r--src/mbgl/style/layer.cpp14
-rw-r--r--src/mbgl/style/layers/background_layer.cpp15
-rw-r--r--src/mbgl/style/layers/circle_layer.cpp15
-rw-r--r--src/mbgl/style/layers/custom_layer.cpp14
-rw-r--r--src/mbgl/style/layers/fill_extrusion_layer.cpp15
-rw-r--r--src/mbgl/style/layers/fill_layer.cpp15
-rw-r--r--src/mbgl/style/layers/heatmap_layer.cpp15
-rw-r--r--src/mbgl/style/layers/hillshade_layer.cpp15
-rw-r--r--src/mbgl/style/layers/layer.cpp.ejs36
-rw-r--r--src/mbgl/style/layers/line_layer.cpp15
-rw-r--r--src/mbgl/style/layers/raster_layer.cpp15
-rw-r--r--src/mbgl/style/layers/symbol_layer.cpp15
-rw-r--r--src/mbgl/style/layers/symbol_layer_impl.hpp15
-rw-r--r--src/mbgl/style/properties.hpp12
-rw-r--r--src/mbgl/style/sources/custom_geometry_source.cpp17
-rw-r--r--src/mbgl/style/sources/geojson_source.cpp14
-rw-r--r--src/mbgl/style/sources/image_source.cpp10
-rw-r--r--src/mbgl/style/sources/raster_dem_source.cpp12
-rw-r--r--src/mbgl/style/sources/raster_source.cpp16
-rw-r--r--src/mbgl/style/sources/vector_source.cpp31
-rw-r--r--src/mbgl/style/style_impl.cpp38
-rw-r--r--src/mbgl/tile/geometry_tile.cpp56
-rw-r--r--src/mbgl/tile/geometry_tile.hpp16
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp2
-rw-r--r--src/mbgl/tile/tile.cpp10
-rw-r--r--src/mbgl/tile/tile.hpp17
-rw-r--r--test/api/query.test.cpp16
-rw-r--r--test/gl/bucket.test.cpp15
-rw-r--r--test/include/mbgl/test.hpp4
-rw-r--r--test/include/mbgl/test/util.hpp (renamed from test/src/mbgl/test/util.hpp)0
-rw-r--r--test/style/expression/expression.test.cpp3
-rw-r--r--test/style/style_layer.test.cpp18
-rw-r--r--test/test-files.json6
-rw-r--r--vendor/benchmark.cmake44
-rw-r--r--vendor/boost.cmake10
-rw-r--r--vendor/cheap-ruler-cpp.cmake10
m---------vendor/earcut.hpp0
-rw-r--r--vendor/earcut.hpp.cmake10
-rw-r--r--vendor/eternal.cmake10
-rw-r--r--vendor/expected.cmake10
-rw-r--r--vendor/geojson-vt-cpp.cmake10
-rw-r--r--vendor/googletest.cmake28
-rw-r--r--vendor/icu.cmake46
m---------vendor/mapbox-base0
-rw-r--r--vendor/nunicode.cmake28
-rw-r--r--vendor/polylabel.cmake10
-rw-r--r--vendor/protozero.cmake10
-rw-r--r--vendor/shelf-pack-cpp.cmake10
-rw-r--r--vendor/sqlite.cmake26
-rw-r--r--vendor/unique_resource.cmake10
-rw-r--r--vendor/vector-tile.cmake10
-rw-r--r--vendor/wagyu.cmake10
218 files changed, 5407 insertions, 1591 deletions
diff --git a/.clang-format b/.clang-format
index ff0f39e73b..956884c1b6 100644
--- a/.clang-format
+++ b/.clang-format
@@ -1,18 +1,11 @@
-Standard: Cpp11
-IndentWidth: 4
+---
+Language: Cpp
+BasedOnStyle: Google
AccessModifierOffset: -4
-UseTab: Never
+AllowShortFunctionsOnASingleLine: Inline
+BinPackArguments: false
BinPackParameters: false
-AllowShortIfStatementsOnASingleLine: false
-AllowShortLoopsOnASingleLine: false
-AllowShortBlocksOnASingleLine: false
-AllowShortFunctionsOnASingleLine: false
-ConstructorInitializerAllOnOneLineOrOnePerLine: true
-AlwaysBreakTemplateDeclarations: true
-NamespaceIndentation: None
-PointerBindsToType: true
-SpacesInParentheses: false
-BreakBeforeBraces: Attach
-ColumnLimit: 100
-Cpp11BracedListStyle: false
+ColumnLimit: 120
+IndentWidth: 4
SpacesBeforeTrailingComments: 1
+...
diff --git a/.clang-tidy b/.clang-tidy
index 97600637ed..e8a74962be 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -1,3 +1,4 @@
-Checks: 'modernize-*,misc-static-assert,llvm-namespace-comment,-clang-analyzer-security.insecureAPI.rand,-clang-analyzer-core.uninitialized.UndefReturn,-clang-analyzer-core.StackAddressEscape,-clang-analyzer-core.CallAndMessage,-clang-diagnostic-unused-command-line-argument,-clang-analyzer-core.uninitialized.*,-clang-analyzer-core.NullDereference,-clang-analyzer-core.NonNullParamChecker'
+Checks: 'bugprone-*,clang-analyzer-*,cppcoreguidelines-*,google-*,misc-*,modernize-*,performance-*,readability-*,-cppcoreguidelines-avoid-magic-numbers,-cppcoreguidelines-pro-bounds-array-to-pointer-decay,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-special-member-functions,-google-readability-todo,-google-runtime-int,-misc-non-private-member-variables-in-classes,-readability-magic-numbers,-readability-named-parameter'
WarningsAsErrors: '*'
+HeaderFilterRegex: '.*'
FormatStyle: file
diff --git a/.cmake-format b/.cmake-format
new file mode 100644
index 0000000000..abd1e46cb8
--- /dev/null
+++ b/.cmake-format
@@ -0,0 +1,91 @@
+
+# --------------------------
+# General Formatting Options
+# --------------------------
+# How wide to allow formatted cmake files
+line_width = 140
+
+# How many spaces to tab for indent
+tab_size = 4
+
+# If arglists are longer than this, break them always
+max_subargs_per_line = 3
+
+# If true, separate flow control names from their parentheses with a space
+separate_ctrl_name_with_space = False
+
+# If true, separate function names from parentheses with a space
+separate_fn_name_with_space = False
+
+# If a statement is wrapped to more than one line, than dangle the closing
+# parenthesis on it's own line
+dangle_parens = True
+
+# If the statement spelling length (including space and parenthesis is larger
+# than the tab width by more than this amoung, then force reject un-nested
+# layouts.
+max_prefix_chars = 2
+
+# If a candidate layout is wrapped horizontally but it exceeds this many lines,
+# then reject the layout.
+max_lines_hwrap = 8
+
+# What style line endings to use in the output.
+line_ending = u'unix'
+
+# Format command names consistently as 'lower' or 'upper' case
+command_case = u'canonical'
+
+# Format keywords consistently as 'lower' or 'upper' case
+keyword_case = u'unchanged'
+
+# Specify structure for custom cmake functions
+additional_commands = {
+ "add_node_module": {
+ "kwargs": {
+ "INSTALL_PATH": "*",
+ "NAN_VERSION": "*",
+ "EXCLUDE_NODE_ABIS": "*"
+ }
+ },
+ "target_compile_definitions": {
+ "kwargs": {
+ "PRIVATE": "*",
+ "PUBLIC": "*"
+ }
+ },
+ "target_sources": {
+ "kwargs": {
+ "INTERFACE": "*",
+ "PRIVATE": "*",
+ "PUBLIC": "*"
+ }
+ }
+}
+
+# A list of command names which should always be wrapped
+always_wrap = [
+ "add_executable",
+ "add_library",
+ "set_source_files_properties",
+ "target_compile_definitions",
+ "target_include_directories",
+ "target_link_libraries",
+ "target_sources"
+]
+
+# Specify the order of wrapping algorithms during successive reflow attempts
+algorithm_order = [0, 1, 2, 3, 4]
+
+# If true, the argument lists which are known to be sortable will be sorted
+# lexicographicall
+enable_sort = True
+
+# If true, the parsers may infer whether or not an argument list is sortable
+# (without annotation).
+autosort = True
+
+# If a comment line starts with at least this many consecutive hash characters,
+# then don't lstrip() them off. This allows for lazy hash rulers where the first
+# hash char is not separated by space
+hashruler_min_length = 10
diff --git a/Makefile b/Makefile
index 916c01fed0..1c1199932e 100644
--- a/Makefile
+++ b/Makefile
@@ -453,101 +453,6 @@ check: compdb
endif
-#### Qt targets #####################################################
-
-QT_QMAKE_FOUND := $(shell command -v qmake 2> /dev/null)
-ifdef QT_QMAKE_FOUND
- export QT_INSTALL_DOCS = $(shell qmake -query QT_INSTALL_DOCS)
- QT_ROOT_PATH = build/qt-$(BUILD_PLATFORM)-$(BUILD_PLATFORM_VERSION)
-endif
-
-export QT_OUTPUT_PATH = $(QT_ROOT_PATH)/$(BUILDTYPE)
-QT_BUILD = $(QT_OUTPUT_PATH)/build.ninja
-
-$(QT_BUILD): $(BUILD_DEPS)
- @scripts/check-qt.sh
- mkdir -p $(QT_OUTPUT_PATH)
- (cd $(QT_OUTPUT_PATH) && $(CMAKE) -G Ninja ../../.. \
- -DCMAKE_BUILD_TYPE=$(BUILDTYPE) \
- -DMBGL_PLATFORM=qt \
- -DMASON_PLATFORM=$(MASON_PLATFORM) \
- -DMASON_PLATFORM_VERSION=$(MASON_PLATFORM_VERSION) \
- -DWITH_QT_DECODERS=${WITH_QT_DECODERS} \
- -DWITH_QT_I18N=${WITH_QT_I18N} \
- -DWITH_COVERAGE=${WITH_COVERAGE})
-
-ifeq ($(HOST_PLATFORM), macos)
-
-MACOS_QT_PROJ_PATH = $(QT_ROOT_PATH)/xcode/mbgl.xcodeproj
-$(MACOS_QT_PROJ_PATH): $(BUILD_DEPS)
- @scripts/check-qt.sh
- mkdir -p $(QT_ROOT_PATH)/xcode
- (cd $(QT_ROOT_PATH)/xcode && $(CMAKE) -G Xcode ../../.. \
- -DMBGL_PLATFORM=qt \
- -DMASON_PLATFORM=$(MASON_PLATFORM) \
- -DMASON_PLATFORM_VERSION=$(MASON_PLATFORM_VERSION) \
- -DWITH_QT_DECODERS=${WITH_QT_DECODERS} \
- -DWITH_QT_I18N=${WITH_QT_I18N} \
- -DWITH_COVERAGE=${WITH_COVERAGE})
-
-.PHONY: qtproj
-qtproj: $(MACOS_QT_PROJ_PATH)
- open $(MACOS_QT_PROJ_PATH)
-
-endif
-
-ifdef QNX_HOST
-export WITH_QT_DECODERS ?= ON
-export QCC_COMPILER_TARGET ?= gcc_ntox86_64
-export QCC_NTOARCH ?= x86_64
-
-export QNX_OUTPUT_PATH = build/qt-qnx-$(QCC_NTOARCH)/$(BUILDTYPE)
-QNX_QT_BUILD = $(QNX_OUTPUT_PATH)/build.ninja
-$(QNX_QT_BUILD): $(BUILD_DEPS)
- @scripts/check-qt.sh
- mkdir -p $(QNX_OUTPUT_PATH)
- (cd $(QNX_OUTPUT_PATH) && $(CMAKE) -G Ninja ../../.. \
- -DCMAKE_BUILD_TYPE=$(BUILDTYPE) \
- -DQCC_COMPILER_TARGET=${QCC_COMPILER_TARGET} \
- -DQCC_NTOARCH=${QCC_NTOARCH} \
- -DCMAKE_TOOLCHAIN_FILE=platform/qt/qnx.cmake \
- -DMBGL_PLATFORM=qt \
- -DWITH_QT_DECODERS=${WITH_QT_DECODERS} \
- -DWITH_QT_I18N=${WITH_QT_I18N} \
- -DWITH_COVERAGE=${WITH_COVERAGE})
-
-.PHONY: qnx-qt-lib
-qnx-qt-lib: $(QNX_QT_BUILD)
- $(NINJA) $(NINJA_ARGS) -j$(JOBS) -C $(QNX_OUTPUT_PATH) qmapboxgl
-
-endif
-
-.PHONY: qt-lib
-qt-lib: $(QT_BUILD)
- $(NINJA) $(NINJA_ARGS) -j$(JOBS) -C $(QT_OUTPUT_PATH) qmapboxgl
-
-.PHONY: qt-app
-qt-app: $(QT_BUILD)
- $(NINJA) $(NINJA_ARGS) -j$(JOBS) -C $(QT_OUTPUT_PATH) mbgl-qt
-
-.PHONY: run-qt-app
-run-qt-app: qt-app
- $(QT_OUTPUT_PATH)/mbgl-qt
-
-.PHONY: qt-test
-qt-test: $(QT_BUILD)
- $(NINJA) $(NINJA_ARGS) -j$(JOBS) -C $(QT_OUTPUT_PATH) mbgl-test
-
-run-qt-test-%: qt-test
- $(QT_OUTPUT_PATH)/mbgl-test --gtest_catch_exceptions=0 --gtest_filter=$*
-
-.PHONY: run-qt-test
-run-qt-test: run-qt-test-*
-
-.PHONY: qt-docs
-qt-docs:
- qdoc $(shell pwd)/platform/qt/config.qdocconf -outputdir $(shell pwd)/$(QT_OUTPUT_PATH)/docs
-
#### Node targets ##############################################################
.PHONY: test-node
diff --git a/appveyor.yml b/appveyor.yml
index 0e1bd01124..2440c3f601 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,29 +5,15 @@ image:
- Visual Studio 2017
environment:
- PYTHON: C:\python37
+ PYTHON: C:\python37
matrix:
- configuration: Release
-
-clone_depth: 1
-
-after_build:
- - mkdir qmapboxgl
- - mkdir qmapboxgl\lib
- - mkdir qmapboxgl\include
- - copy qmapboxgl.dll qmapboxgl\lib
- - copy qmapboxgl.exp qmapboxgl\lib
- - copy qmapboxgl.lib qmapboxgl\lib
- - copy %APPVEYOR_BUILD_FOLDER%\platform\qt\include\* qmapboxgl\include
- - 7z a qmapboxgl-%APPVEYOR_REPO_COMMIT%.zip qmapboxgl
-
-artifacts:
- - path: build\qmapboxgl-%APPVEYOR_REPO_COMMIT%.zip
- name: QMapboxGL
+ - configuration: Debug
test: off
+clone_depth: 1
for:
-
@@ -36,10 +22,10 @@ for:
- image: Visual Studio 2015
environment:
- LLVM_VERSION: 5.0.1
- LLVM_HASH: 981543611D719624ACB29A2CFFD6A479CFF36E8AB5EE8A57D8ECA4F9C4C6956F
- VCVARSALL: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat'
- QT_PREFIX: 'C:\Qt\latest\msvc2015_64\lib\cmake'
+ LLVM_VERSION: 5.0.1
+ LLVM_HASH: 981543611D719624ACB29A2CFFD6A479CFF36E8AB5EE8A57D8ECA4F9C4C6956F
+ VCVARSALL: 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat'
+ QT_PREFIX: 'C:\Qt\latest\msvc2015_64\lib\cmake'
-
matrix:
@@ -53,52 +39,52 @@ for:
QT_PREFIX: 'C:\Qt\latest\msvc2017_64\lib\cmake'
cache:
- - '%APPVEYOR_BUILD_FOLDER%\mason_packages'
+ - '%APPVEYOR_BUILD_FOLDER%\.git\modules'
- '%APPVEYOR_BUILD_FOLDER%\LLVM-%LLVM_VERSION%-win64.exe'
- '%APPVEYOR_BUILD_FOLDER%\cmake-3.10.1-win64-x64.zip'
- C:\clcache
install:
+ - set PATH=%PYTHON%\Scripts;%PYTHON%;%PATH%
+ - pip install clcache
- git config --system core.longpaths true
- git submodule sync
- git submodule update --init
- git submodule foreach git submodule update --init
- ps: |
- if (!(Test-Path cmake-3.10.1-win64-x64.zip)) {
- appveyor DownloadFile https://cmake.org/files/v3.10/cmake-3.10.1-win64-x64.zip
- }
- scripts\check-sha256.ps1 cmake-3.10.1-win64-x64.zip 8251F70C85B58F3CA1F24E4A3B0637E2D609B5E4A341D00B70E02E89244D5029
- Start-Process -FilePath '7z' -ArgumentList 'x','cmake-3.10.1-win64-x64.zip','-oC:\' -Wait
- - ps: |
if (!(Test-Path "LLVM-$env:LLVM_VERSION-win64.exe")) {
appveyor DownloadFile "https://releases.llvm.org/$env:LLVM_VERSION/LLVM-$env:LLVM_VERSION-win64.exe"
}
scripts\check-sha256.ps1 LLVM-$env:LLVM_VERSION-win64.exe "$env:LLVM_HASH"
Start-Process -FilePath "LLVM-$env:LLVM_VERSION-win64.exe" -ArgumentList '/S',"/D=C:\LLVM-$env:LLVM_VERSION" -Wait
- - set PATH=%PYTHON%\Scripts;%PYTHON%;%PATH%
- - pip install clcache
+ - ps: |
+ if (!(Test-Path cmake-3.10.1-win64-x64.zip)) {
+ appveyor DownloadFile https://cmake.org/files/v3.10/cmake-3.10.1-win64-x64.zip
+ }
+ scripts\check-sha256.ps1 cmake-3.10.1-win64-x64.zip 8251F70C85B58F3CA1F24E4A3B0637E2D609B5E4A341D00B70E02E89244D5029
+ Start-Process -FilePath '7z' -ArgumentList 'x','cmake-3.10.1-win64-x64.zip','-oC:\' -Wait
before_build:
- set PATH=C:\LLVM-%LLVM_VERSION%\bin;%PATH%
- set PATH=C:\cmake-3.10.1-win64-x64\bin;%PATH%
- set CLCACHE_DIR=c:\clcache
- set CLCACHE_CL=clang-cl
+ - clcache -z
- set CC=clcache
- set CXX=clcache
+ - set CTEST_OUTPUT_ON_FAILURE=1
- mkdir %APPVEYOR_BUILD_FOLDER%\build
- cd %APPVEYOR_BUILD_FOLDER%\build
build_script:
- call "%VCVARSALL%" amd64
+ - cmake -E remove ../next/vendor
+ - cmake -E copy_directory ../vendor ../next/vendor
- cmake -G "Ninja"
- -DMBGL_PLATFORM=qt
- -DWITH_QT_DECODERS=ON
- -DWITH_QT_I18N=ON
- -DWITH_NODEJS=OFF
- -DCMAKE_BUILD_TYPE=Release
- -DCMAKE_PREFIX_PATH=%QT_PREFIX%
- -DCMAKE_MAKE_PROGRAM="%APPVEYOR_BUILD_FOLDER%\platform\qt\ninja.exe"
- ..
- - clcache -z
- - cmake --build . -- -j %NUMBER_OF_PROCESSORS%
+ -DCMAKE_BUILD_TYPE=%CONFIGURATION%
+ -DCMAKE_MAKE_PROGRAM="%APPVEYOR_BUILD_FOLDER%\platform\qt\ninja.exe"
+ -DCMAKE_PREFIX_PATH=%QT_PREFIX%
+ -DMBGL_WITH_QT=ON
+ ../next
+ - cmake --build . --target qmapboxgl -- -j %NUMBER_OF_PROCESSORS%
- clcache -s
diff --git a/benchmark/fixtures/api/cache.db b/benchmark/fixtures/api/cache.db
index e41174548d..fc51eca3b9 100644
--- a/benchmark/fixtures/api/cache.db
+++ b/benchmark/fixtures/api/cache.db
Binary files differ
diff --git a/benchmark/include/mbgl/benchmark.hpp b/benchmark/include/mbgl/benchmark.hpp
index 1a9904de51..f68c847a74 100644
--- a/benchmark/include/mbgl/benchmark.hpp
+++ b/benchmark/include/mbgl/benchmark.hpp
@@ -1,7 +1,9 @@
#pragma once
+#include <mbgl/util/util.hpp>
+
namespace mbgl {
-int runBenchmark(int argc, char* argv[]);
+MBGL_EXPORT int runBenchmark(int argc, char* argv[]);
} // namespace mbgl
diff --git a/circle.yml b/circle.yml
index 453aab85ac..4d94619555 100644
--- a/circle.yml
+++ b/circle.yml
@@ -2,7 +2,136 @@ version: 2.1
workflows:
version: 2
- default:
+ mbgl-next:
+ jobs:
+ - next-sanity-checks
+ - next-build-template:
+ name: next-android-armeabi-v7a-release
+ executor_name: ubuntu-disco
+ target_is_android: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=armeabi-v7a'
+ - next-build-template:
+ name: next-android-arm64-v8a-release
+ executor_name: ubuntu-disco
+ target_is_android: true
+ requires:
+ - next-android-armeabi-v7a-release
+ config_params: '-G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=arm64-v8a'
+ - next-build-template:
+ name: next-android-x86-release
+ executor_name: ubuntu-disco
+ target_is_android: true
+ requires:
+ - next-android-armeabi-v7a-release
+ config_params: '-G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=x86'
+ - next-build-template:
+ name: next-android-x86_64-release
+ executor_name: ubuntu-disco
+ target_is_android: true
+ requires:
+ - next-android-armeabi-v7a-release
+ config_params: '-G Ninja -DCMAKE_TOOLCHAIN_FILE=/opt/android/ndk-bundle/build/cmake/android.toolchain.cmake -DANDROID_CCACHE=/usr/bin/ccache -DANDROID_ABI=x86_64'
+ - next-build-template:
+ name: next-linux-gcc8-release
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8'
+ - next-build-template:
+ name: next-linux-gcc4.9-release
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-release
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-4.9 -DCMAKE_CXX_COMPILER=g++-4.9'
+ build_params: '--target mbgl-glfw'
+ test_params: '-N -Q'
+ - next-build-template:
+ name: next-linux-gcc8-debug-coverage
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-release
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_BUILD_TYPE=DebugCoverage'
+ - next-build-template:
+ name: next-linux-clang8-release
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8'
+ - next-build-template:
+ name: next-FIXME-linux-asan
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-debug-coverage
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Sanitize -DMBGL_WITH_SANITIZER=address'
+ test_params: '|| true'
+ - next-build-template:
+ name: next-linux-tsan
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-debug-coverage
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Sanitize -DMBGL_WITH_SANITIZER=thread'
+ - next-build-template:
+ name: next-FIXME-linux-memsan
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-debug-coverage
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Sanitize -DMBGL_WITH_SANITIZER=memory'
+ test_params: '|| true'
+ - next-build-template:
+ name: next-FIXME-linux-ubsan
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-linux-gcc8-debug-coverage
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=clang-8 -DCMAKE_CXX_COMPILER=clang++-8 -DCMAKE_BUILD_TYPE=Sanitize -DMBGL_WITH_SANITIZER=undefined'
+ test_params: '|| true'
+ - next-build-template:
+ name: next-qt5-linux-gcc5-release
+ executor_name: ubuntu-disco
+ target_is_linux: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER=gcc-5 -DCMAKE_CXX_COMPILER=g++-5 -DMBGL_WITH_QT=ON'
+ - next-build-template:
+ name: next-qt5-macos-gcc5-release
+ executor_name: macos-11_0_0
+ target_is_macos: true
+ requires:
+ - next-qt5-linux-gcc5-release
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMBGL_WITH_QT=ON -DCMAKE_PREFIX_PATH=$(echo /usr/local/Cellar/qt/5.*/lib/cmake)'
+ test_params: '-N -Q'
+ - next-build-template:
+ name: next-macos-xcode11-release
+ executor_name: macos-11_0_0
+ target_is_macos: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache'
+ - next-build-template:
+ name: next-macos-xcode11-debug
+ executor_name: macos-11_0_0
+ target_is_macos: true
+ requires:
+ - next-macos-xcode11-release
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug'
+ - next-build-template:
+ name: next-ios-xcode11-release
+ executor_name: macos-11_0_0
+ target_is_macos: true
+ requires:
+ - next-sanity-checks
+ config_params: '-G Ninja -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_OSX_SYSROOT=iphonesimulator'
+ test_params: '-Q -N'
+ mbgl-legacy:
jobs:
#
# Naming convention: {platform}-{additional description}-{build type}
@@ -13,10 +142,6 @@ workflows:
# - {build type} is typically "debug" or "release".
#
- nitpick
- - clang-tidy:
- filters:
- branches:
- ignore: master
- android-debug-arm-v7-buck
- android-arm-template:
name: android-debug-arm-v8
@@ -47,8 +172,6 @@ workflows:
name: linux-clang-3.8-libcxx-debug
- linux-clang-7-sanitize-address-undefined
- linux-clang-7-sanitize-thread
- - linux-gcc49-debug:
- name: linux-gcc4.9-debug
- linux-gcc5-debug-coverage
- linux-doxygen
- linux-render-tests
@@ -64,8 +187,6 @@ workflows:
ignore: /.*/
- macos-debug
- macos-render-tests
- - qt5-linux-gcc5-release
- - qt5-macos-debug
nightly:
triggers:
- schedule:
@@ -83,7 +204,102 @@ workflows:
- ios-static-analyzer-nightly
- ios-static-analyzer-nightly-xcode11
+executors:
+ ubuntu-disco:
+ docker:
+ # FIXME: Move the image to mbgl/
+ - image: tmpsantos/mbgl_ci:1.5
+ resource_class: xlarge
+ working_directory: /src
+ environment:
+ UBSAN_OPTIONS: print_stacktrace=1:halt_on_error=1
+ MSAN_OPTIONS: poison_in_dtor=1
+ ASAN_OPTIONS: strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1
+ QT_INSTALL_DOCS: /usr/share/qt5/doc
+ QT_VERSION: 5
+ macos-11_0_0:
+ macos:
+ xcode: '11.0.0'
+ environment:
+ HOMEBREW_NO_AUTO_UPDATE: 1
+ HOMEBREW_NO_INSTALL_CLEANUP: 1
+
commands:
+ next-prepare:
+ steps:
+ - restore_cache:
+ keys:
+ - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-{{ .Revision }}'
+ - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-'
+ - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-master'
+ - 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-'
+ - run:
+ name: Prepare
+ command: |
+ git submodule sync
+ git submodule update --init --recursive
+ npm install --ignore-scripts
+ ulimit -c unlimited
+ next-prepare-macos:
+ steps:
+ - run:
+ name: Prepare macOS
+ command: |
+ brew install cmake ccache glfw ninja pkgconfig qt
+ next-config:
+ parameters:
+ config_params:
+ type: string
+ steps:
+ - run:
+ name: Configure
+ command: |
+ cmake next -B build << parameters.config_params >>
+ next-build:
+ parameters:
+ build_params:
+ type: string
+ steps:
+ - run:
+ name: Build
+ command: |
+ ccache --zero-stats --max-size=2G
+ cmake --build build -j 8 << parameters.build_params >>
+ ccache --show-stats
+ git gc
+ next-save:
+ steps:
+ - save_cache:
+ key: 'ccache-v1-{{ .Environment.CIRCLE_JOB }}-{{ .Branch }}-{{ .Revision }}'
+ paths:
+ - .git/modules
+ - /Users/distiller/Library/Caches/Homebrew
+ - node_modules
+ - ~/.ccache
+ - ~/.gradle
+ - run:
+ name: Collecting artifacts
+ when: on_fail
+ command: |
+ mkdir -p /tmp/tests/coredumps
+ if ls core* 1> /dev/null 2>&1; then cp core* /tmp/tests/coredumps; fi
+ mkdir -p /tmp/tests/render
+ if [ -f mapbox-gl-js/test/integration/render-tests/index.html ]; then cp mapbox-gl-js/test/integration/render-tests/index.html /tmp/tests/render; fi
+ - store_artifacts:
+ path: /tmp/tests
+ destination: tests
+ next-test:
+ parameters:
+ test_wrapper:
+ type: string
+ test_params:
+ type: string
+ steps:
+ - run:
+ name: Test
+ command: |
+ cd build
+ << parameters.test_wrapper >> ctest -j 8 --output-on-failure << parameters.test_params >>
npm-install:
steps:
- run:
@@ -292,16 +508,6 @@ commands:
- run:
name: Build test
command: make test
- build-qt-app:
- steps:
- - run:
- name: Build qt-app
- command: make qt-app
- build-qt-test:
- steps:
- - run:
- name: Build qt-test
- command: make qt-test
build-ios-test:
steps:
- run:
@@ -371,18 +577,6 @@ commands:
brew install node@8
brew link node@8 --force --overwrite
- install-qt-macos-dependencies:
- steps:
- - run:
- name: Install Qt macOS dependencies
- command: |
- brew install qt
- brew link qt --force
- export HOMEBREW_QT5_CELLAR=$(brew --cellar qt)
- export HOMEBREW_QT5_VERSION=$(brew list --versions qt | rev | cut -d' ' -f1 | rev)
- sudo ln -s $HOMEBREW_QT5_CELLAR/$HOMEBREW_QT5_VERSION/mkspecs /usr/local/mkspecs
- sudo ln -s $HOMEBREW_QT5_CELLAR/$HOMEBREW_QT5_VERSION/plugins /usr/local/plugins
-
run-node-macos-tests:
steps:
- run:
@@ -516,6 +710,88 @@ commands:
fi
jobs:
+ next-sanity-checks:
+ executor: ubuntu-disco
+ steps:
+ - checkout
+ - next-prepare
+ - next-config:
+ config_params: '-DMBGL_WITH_CORE_ONLY=ON'
+ - run:
+ name: CMake Format
+ command: |
+ cmake-format -i $(find next -type f -name CMakeLists.txt -o -name '*.cmake')
+ git diff --exit-code
+ - run:
+ name: Clang Format
+ command: |
+ git diff -U0 --ignore-submodules=all --no-color origin/master... *.cpp *.hpp | clang-format-diff-8 -p1 -i
+ git diff --exit-code
+ - run:
+ name: Code Generators
+ command: |
+ platform/android/scripts/generate-style-code.js
+ scripts/generate-file-lists.js
+ scripts/generate-shaders.js
+ scripts/generate-style-code.js
+ git add -A && git diff --staged --exit-code
+ - next-save
+ next-build-template:
+ parameters:
+ config_params:
+ type: string
+ default: ''
+ build_params:
+ type: string
+ default: ''
+ test_params:
+ type: string
+ default: ''
+ executor_name:
+ type: string
+ target_is_android:
+ type: boolean
+ default: false
+ target_is_linux:
+ type: boolean
+ default: false
+ target_is_macos:
+ type: boolean
+ default: false
+ executor: << parameters.executor_name >>
+ steps:
+ - checkout
+ - next-prepare
+ - when:
+ condition: << parameters.target_is_android >>
+ steps:
+ - next-config:
+ config_params: << parameters.config_params >>
+ - next-build:
+ build_params: << parameters.build_params >>
+ - when:
+ condition: << parameters.target_is_linux >>
+ steps:
+ - next-config:
+ config_params: << parameters.config_params >>
+ - next-build:
+ build_params: << parameters.build_params >>
+ - next-test:
+ test_wrapper: 'xvfb-run -s -noreset'
+ test_params: << parameters.test_params >>
+ - when:
+ condition: << parameters.target_is_macos >>
+ steps:
+ - next-prepare-macos
+ - next-config:
+ config_params: << parameters.config_params >>
+ - next-build:
+ build_params: << parameters.build_params >>
+ - next-test:
+ test_wrapper: ''
+ test_params: << parameters.test_params >>
+ - next-save
+
nitpick:
docker:
- image: mbgl/linux-clang-7:a5a3c52107
@@ -553,29 +829,6 @@ jobs:
when: always
# ------------------------------------------------------------------------------
- clang-tidy:
- docker:
- - image: mbgl/linux-clang-7:a5a3c52107
- working_directory: /src
- environment:
- LIBSYSCONFCPUS: 4
- JOBS: 4
- BUILDTYPE: Debug
- steps:
- - install-dependencies: { ccache: false }
- - run:
- name: Fetch 'origin/master' branch
- command: git fetch origin master:refs/remotes/origin/master
- - run:
- name: Generate compilation database
- command: make compdb
- - run:
- name: Run Clang checks
- command: make check TARGET_BRANCH=${CIRCLE_TARGET_BRANCH:master}
- no_output_timeout: 20m
- - save-dependencies: { ccache: false }
-
-# ------------------------------------------------------------------------------
android-arm-template:
parameters:
stl:
@@ -759,6 +1012,14 @@ jobs:
fi
fi
- run:
+ name: Trigger external deploy steps
+ command: |
+ export VERSION_TAG=${CIRCLE_TAG}
+ export GITHUB_TOKEN=${DANGER_GITHUB_API_TOKEN}
+ export DOCS_REPO="android-docs"
+ scripts/trigger-maps-documentation-deploy-steps.sh
+ background: true
+ - run:
name: Record size
command: platform/android/scripts/metrics.sh
# ------------------------------------------------------------------------------
@@ -908,30 +1169,6 @@ jobs:
- run-unit-tests-sanitized
# ------------------------------------------------------------------------------
- linux-gcc49-debug:
- docker:
- - image: mbgl/linux-gcc-4.9:e3818a77c1
- resource_class: large
- working_directory: /src
- environment:
- LIBSYSCONFCPUS: 4
- JOBS: 4
- BUILDTYPE: Debug
- WITH_EGL: 1
- DISPLAY: :0
- steps:
- - install-dependencies
- - check-if-this-job-can-be-skipped
- - build-linux
- - build-benchmark
- - build-test
- - save-dependencies
- - run-unit-tests
- - run:
- name: Build offline CLI
- command: make offline
-
-# ------------------------------------------------------------------------------
linux-gcc5-debug-coverage:
docker:
- image: mbgl/linux-gcc-5:54f59e3ac5
@@ -1221,7 +1458,8 @@ jobs:
command: |
export VERSION_TAG=${CIRCLE_TAG}
export GITHUB_TOKEN=${DANGER_GITHUB_API_TOKEN}
- platform/ios/scripts/trigger-external-deploy-steps.sh
+ export DOCS_REPO="ios-sdk"
+ scripts/trigger-maps-documentation-deploy-steps.sh
- run:
name: Build, package, and upload iOS release
command: |
@@ -1312,54 +1550,3 @@ jobs:
name: Collect GitHub statistics
command: |
scripts/publish_github_stats.js
-
-# ------------------------------------------------------------------------------
- qt5-linux-gcc5-release:
- docker:
- - image: mbgl/linux-gcc-5-qt-5.9:5cd92d7d1c
- resource_class: large
- working_directory: /src
- environment:
- LIBSYSCONFCPUS: 4
- JOBS: 4
- BUILDTYPE: Release
- WITH_QT_I18N: 1
- steps:
- - install-dependencies
- - check-if-this-job-can-be-skipped
- - build-qt-app
- - build-qt-test
- - run:
- name: Build qt-docs
- command: make qt-docs
- - save-dependencies
- - run:
- name: Run valgrind-backed tests
- environment:
- JOBS: 1 # https://github.com/mapbox/mapbox-gl-native/issues/9108
- command: |
- xvfb-run --server-args="-screen 0 1024x768x24" \
- build/qt-linux-x86_64/Release/mbgl-test --gtest_filter=-*.Load --gtest_filter=-Memory.Vector --gtest_filter=-BiDi.*
-
-# ------------------------------------------------------------------------------
- qt5-macos-debug:
- macos:
- xcode: "9.3.1"
- environment:
- BUILDTYPE: Debug
- HOMEBREW_NO_AUTO_UPDATE: 1
- HOMEBREW_NO_INSTALL_CLEANUP: 1
- steps:
- - install-macos-dependencies
- - install-qt-macos-dependencies
- - install-dependencies
- - check-if-this-job-can-be-skipped
- - build-qt-app
- - build-qt-test
- - run:
- name: Run qt-test
- command: make run-qt-test
- - save-dependencies
- - store_artifacts:
- path: test/fixtures
- destination: test/fixtures
diff --git a/cmake/benchmark.cmake b/cmake/benchmark.cmake
index a944c64d05..7bca681f86 100644
--- a/cmake/benchmark.cmake
+++ b/cmake/benchmark.cmake
@@ -11,7 +11,7 @@ target_include_directories(mbgl-benchmark
target_link_libraries(mbgl-benchmark
PRIVATE mbgl-core
- PRIVATE benchmark
+ PRIVATE mbgl-vendor-benchmark
)
mbgl_platform_benchmark()
diff --git a/cmake/core.cmake b/cmake/core.cmake
index f08ff6bcab..342731de9f 100644
--- a/cmake/core.cmake
+++ b/cmake/core.cmake
@@ -8,31 +8,31 @@ target_include_directories(mbgl-core
)
target_link_libraries(mbgl-core PRIVATE
- earcut.hpp
- eternal
- expected
- geojson-vt-cpp
- shelf-pack-cpp
- unique_resource
- wagyu
+ mbgl-vendor-earcut.hpp
+ mbgl-vendor-eternal
+ mbgl-vendor-expected
+ mbgl-vendor-geojson-vt-cpp
+ mbgl-vendor-shelf-pack-cpp
+ mbgl-vendor-unique_resource
+ mbgl-vendor-wagyu
)
# linux uses ICU from mason, other platforms use vendored ICU
if(NOT MBGL_PLATFORM STREQUAL "linux")
- set(ICU_LIBRARY "icu")
+ set(ICU_LIBRARY "mbgl-vendor-icu")
endif()
# FIXME: We should not leak these many
# libraries in our public interface.
target_link_libraries(mbgl-core PUBLIC
- boost
+ mbgl-vendor-boost
mapbox-base-extras
mapbox-base
${ICU_LIBRARY}
- polylabel
- protozero
+ mbgl-vendor-polylabel
+ mbgl-vendor-protozero
Mapbox::Base::Extras::rapidjson
- vector-tile
+ mbgl-vendor-vector-tile
)
mbgl_platform_core()
diff --git a/cmake/filesource.cmake b/cmake/filesource.cmake
index ff9fa360f6..4d7febdd77 100644
--- a/cmake/filesource.cmake
+++ b/cmake/filesource.cmake
@@ -10,7 +10,7 @@ target_include_directories(mbgl-filesource
target_link_libraries(mbgl-filesource
PUBLIC mbgl-core
- PUBLIC expected
+ PUBLIC mbgl-vendor-expected
)
mbgl_filesource()
diff --git a/cmake/glfw.cmake b/cmake/glfw.cmake
index 6abc93d837..89a7768ad3 100644
--- a/cmake/glfw.cmake
+++ b/cmake/glfw.cmake
@@ -12,7 +12,6 @@ target_sources(mbgl-glfw
PRIVATE platform/glfw/glfw_renderer_frontend.cpp
PRIVATE platform/glfw/settings_json.hpp
PRIVATE platform/glfw/settings_json.cpp
- PRIVATE platform/default/include/mbgl/util/default_styles.hpp
)
target_include_directories(mbgl-glfw
@@ -22,7 +21,7 @@ target_include_directories(mbgl-glfw
target_link_libraries(mbgl-glfw
PRIVATE mbgl-core
PRIVATE glfw
- PRIVATE cheap-ruler-cpp
+ PRIVATE mbgl-vendor-cheap-ruler-cpp
PRIVATE Mapbox::Base::Extras::args
)
diff --git a/cmake/offline.cmake b/cmake/offline.cmake
index 1f5cc60f70..5a6d4e04cb 100644
--- a/cmake/offline.cmake
+++ b/cmake/offline.cmake
@@ -2,10 +2,6 @@ add_executable(mbgl-offline
bin/offline.cpp
)
-target_sources(mbgl-offline
- PRIVATE platform/default/include/mbgl/util/default_styles.hpp
-)
-
target_include_directories(mbgl-offline
PRIVATE platform/default/include
)
diff --git a/cmake/render-test.cmake b/cmake/render-test.cmake
index 9bc37df808..7369655630 100644
--- a/cmake/render-test.cmake
+++ b/cmake/render-test.cmake
@@ -21,7 +21,7 @@ target_link_libraries(mbgl-render-test PRIVATE
mbgl-core
mbgl-filesource
Mapbox::Base::Extras::args
- expected
+ mbgl-vendor-expected
Mapbox::Base::Extras::filesystem
Mapbox::Base::pixelmatch-cpp
Mapbox::Base::Extras::rapidjson
diff --git a/cmake/test.cmake b/cmake/test.cmake
index 3cb0ef3a72..405552423c 100644
--- a/cmake/test.cmake
+++ b/cmake/test.cmake
@@ -23,11 +23,11 @@ target_include_directories(mbgl-test
)
target_link_libraries(mbgl-test PRIVATE
- googletest
+ mbgl-vendor-googletest
Mapbox::Base::Extras::args
mbgl-core
- shelf-pack-cpp
- unique_resource
+ mbgl-vendor-shelf-pack-cpp
+ mbgl-vendor-unique_resource
Mapbox::Base::pixelmatch-cpp
)
diff --git a/expression-test/filesystem.hpp b/expression-test/filesystem.hpp
new file mode 100644
index 0000000000..cee7e9d911
--- /dev/null
+++ b/expression-test/filesystem.hpp
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <ghc/filesystem.hpp>
+
+namespace mbgl {
+
+namespace filesystem = ghc::filesystem;
+
+} // namespace mbgl
diff --git a/include/mbgl/renderer/renderer.hpp b/include/mbgl/renderer/renderer.hpp
index f1800dbfb8..7a1ddde1c1 100644
--- a/include/mbgl/renderer/renderer.hpp
+++ b/include/mbgl/renderer/renderer.hpp
@@ -49,6 +49,15 @@ public:
const std::string& extensionField,
const optional<std::map<std::string, Value>>& args = {}) const;
+ void setFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const std::string& featureID, const FeatureState& state);
+
+ void getFeatureState(FeatureState& state, const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const std::string& featureID) const;
+
+ void removeFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const optional<std::string>& featureID, const optional<std::string>& stateKey);
+
// Debug
void dumpDebugLogs();
diff --git a/include/mbgl/style/expression/expression.hpp b/include/mbgl/style/expression/expression.hpp
index ad57748677..1341a8d041 100644
--- a/include/mbgl/style/expression/expression.hpp
+++ b/include/mbgl/style/expression/expression.hpp
@@ -34,6 +34,8 @@ public:
EvaluationContext(optional<mbgl::Value> accumulated_, GeometryTileFeature const * feature_) :
accumulated(std::move(accumulated_)), feature(feature_)
{}
+ EvaluationContext(float zoom_, GeometryTileFeature const* feature_, const FeatureState* state_)
+ : zoom(zoom_), feature(feature_), featureState(state_) {}
EvaluationContext(optional<float> zoom_, GeometryTileFeature const * feature_, optional<double> colorRampParameter_) :
zoom(std::move(zoom_)), feature(feature_), colorRampParameter(std::move(colorRampParameter_))
{}
@@ -43,12 +45,18 @@ public:
return *this;
};
+ EvaluationContext& withFeatureState(const FeatureState* featureState_) noexcept {
+ featureState = featureState_;
+ return *this;
+ };
+
optional<float> zoom;
optional<mbgl::Value> accumulated;
GeometryTileFeature const * feature = nullptr;
optional<double> colorRampParameter;
// Contains formatted section object, std::unordered_map<std::string, Value>.
const Value* formattedSection = nullptr;
+ const FeatureState* featureState = nullptr;
};
template <typename T>
diff --git a/include/mbgl/style/layer.hpp b/include/mbgl/style/layer.hpp
index ecd3f01f70..35577411eb 100644
--- a/include/mbgl/style/layer.hpp
+++ b/include/mbgl/style/layer.hpp
@@ -57,6 +57,12 @@ struct LayerTypeInfo {
* requires cross-tile indexing and placement. Contains \c CrossTileIndex::NotRequired otherwise.
*/
const enum class CrossTileIndex { Required, NotRequired } crossTileIndex;
+
+ /**
+ * @brief contains the Id of the supported tile type. Used for internal checks.
+ * The contained values correspond to \c Tile::Kind enum.
+ */
+ const enum class TileKind : uint8_t { Geometry, Raster, RasterDEM, NotRequired } tileKind;
};
/**
diff --git a/include/mbgl/style/property_expression.hpp b/include/mbgl/style/property_expression.hpp
index 32983e2380..f68285fb1b 100644
--- a/include/mbgl/style/property_expression.hpp
+++ b/include/mbgl/style/property_expression.hpp
@@ -61,6 +61,10 @@ public:
return evaluate(expression::EvaluationContext(zoom, &feature), finalDefaultValue);
}
+ T evaluate(float zoom, const GeometryTileFeature& feature, const FeatureState& state, T finalDefaultValue) const {
+ return evaluate(expression::EvaluationContext(zoom, &feature, &state), finalDefaultValue);
+ }
+
std::vector<optional<T>> possibleOutputs() const {
return expression::fromExpressionValues<T>(expression->possibleOutputs());
}
diff --git a/include/mbgl/style/source.hpp b/include/mbgl/style/source.hpp
index 2507b67fdc..c3c0609a9f 100644
--- a/include/mbgl/style/source.hpp
+++ b/include/mbgl/style/source.hpp
@@ -22,6 +22,7 @@ class RasterSource;
class RasterDEMSource;
class GeoJSONSource;
class SourceObserver;
+struct LayerTypeInfo;
/**
* The runtime representation of a [source](https://www.mapbox.com/mapbox-gl-style-spec/#sources) from the Mapbox Style
@@ -74,6 +75,8 @@ public:
virtual void loadDescription(FileSource&) = 0;
void dumpDebugLogs() const;
+ virtual bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const = 0;
+
bool loaded = false;
// For use in SDK bindings, which store a reference to a platform-native peer
diff --git a/include/mbgl/style/sources/custom_geometry_source.hpp b/include/mbgl/style/sources/custom_geometry_source.hpp
index a5e545f445..ff04505699 100644
--- a/include/mbgl/style/sources/custom_geometry_source.hpp
+++ b/include/mbgl/style/sources/custom_geometry_source.hpp
@@ -46,6 +46,7 @@ public:
// Private implementation
class Impl;
const Impl& impl() const;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
mapbox::base::WeakPtr<Source> makeWeakPtr() override {
return weakFactory.makeWeakPtr();
}
diff --git a/include/mbgl/style/sources/geojson_source.hpp b/include/mbgl/style/sources/geojson_source.hpp
index c99687fad6..a256ad6f15 100644
--- a/include/mbgl/style/sources/geojson_source.hpp
+++ b/include/mbgl/style/sources/geojson_source.hpp
@@ -50,6 +50,8 @@ public:
void loadDescription(FileSource&) final;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
+
mapbox::base::WeakPtr<Source> makeWeakPtr() override {
return weakFactory.makeWeakPtr();
}
diff --git a/include/mbgl/style/sources/image_source.hpp b/include/mbgl/style/sources/image_source.hpp
index 84faab33c9..699a3c6494 100644
--- a/include/mbgl/style/sources/image_source.hpp
+++ b/include/mbgl/style/sources/image_source.hpp
@@ -28,6 +28,8 @@ public:
void loadDescription(FileSource&) final;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
+
mapbox::base::WeakPtr<Source> makeWeakPtr() override {
return weakFactory.makeWeakPtr();
}
diff --git a/include/mbgl/style/sources/raster_dem_source.hpp b/include/mbgl/style/sources/raster_dem_source.hpp
index 82588613bc..42e27cd078 100644
--- a/include/mbgl/style/sources/raster_dem_source.hpp
+++ b/include/mbgl/style/sources/raster_dem_source.hpp
@@ -13,7 +13,7 @@ namespace style {
class RasterDEMSource : public RasterSource {
public:
RasterDEMSource(std::string id, variant<std::string, Tileset> urlOrTileset, uint16_t tileSize);
-
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
};
template <>
diff --git a/include/mbgl/style/sources/raster_source.hpp b/include/mbgl/style/sources/raster_source.hpp
index 1bdced8da7..00a3b788c2 100644
--- a/include/mbgl/style/sources/raster_source.hpp
+++ b/include/mbgl/style/sources/raster_source.hpp
@@ -25,6 +25,8 @@ public:
void loadDescription(FileSource&) final;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
+
mapbox::base::WeakPtr<Source> makeWeakPtr() final {
return weakFactory.makeWeakPtr();
}
diff --git a/include/mbgl/style/sources/vector_source.hpp b/include/mbgl/style/sources/vector_source.hpp
index ece7f5615a..4165af0a61 100644
--- a/include/mbgl/style/sources/vector_source.hpp
+++ b/include/mbgl/style/sources/vector_source.hpp
@@ -12,7 +12,8 @@ namespace style {
class VectorSource final : public Source {
public:
- VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset);
+ VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset, optional<float> maxZoom = nullopt,
+ optional<float> minZoom = nullopt);
~VectorSource() final;
const variant<std::string, Tileset>& getURLOrTileset() const;
@@ -23,6 +24,8 @@ public:
void loadDescription(FileSource&) final;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
+
mapbox::base::WeakPtr<Source> makeWeakPtr() override {
return weakFactory.makeWeakPtr();
}
@@ -31,6 +34,8 @@ private:
const variant<std::string, Tileset> urlOrTileset;
std::unique_ptr<AsyncRequest> req;
mapbox::base::WeakPtrFactory<Source> weakFactory {this};
+ optional<float> maxZoom;
+ optional<float> minZoom;
};
template <>
diff --git a/platform/default/include/mbgl/util/default_styles.hpp b/include/mbgl/util/default_styles.hpp
index 335d3ea5f9..e1c53178b0 100644
--- a/platform/default/include/mbgl/util/default_styles.hpp
+++ b/include/mbgl/util/default_styles.hpp
@@ -1,7 +1,8 @@
#pragma once
-#include <vector>
+#include <array>
#include <string>
+#include <vector>
namespace mbgl {
namespace util {
@@ -13,17 +14,19 @@ struct DefaultStyle {
const unsigned currentVersion;
};
+// clang-format off
constexpr const DefaultStyle streets = { "mapbox://styles/mapbox/streets-v11", "Streets", 11 };
constexpr const DefaultStyle outdoors = { "mapbox://styles/mapbox/outdoors-v11", "Outdoors", 11 };
constexpr const DefaultStyle light = { "mapbox://styles/mapbox/light-v10", "Light", 10 };
constexpr const DefaultStyle dark = { "mapbox://styles/mapbox/dark-v10", "Dark", 10 };
constexpr const DefaultStyle satellite = { "mapbox://styles/mapbox/satellite-v9", "Satellite", 9 };
constexpr const DefaultStyle satelliteStreets = { "mapbox://styles/mapbox/satellite-streets-v11", "Satellite Streets", 11 };
+// clang-format on
-const DefaultStyle orderedStyles[] = {
- streets, outdoors, light, dark, satellite, satelliteStreets,
-};
-const size_t numOrderedStyles = sizeof(orderedStyles) / sizeof(DefaultStyle);
+constexpr std::array<const DefaultStyle, 6> orderedStyles = {
+ {streets, outdoors, light, dark, satellite, satelliteStreets}};
+
+constexpr size_t numOrderedStyles = orderedStyles.size();
} // end namespace default_styles
} // end namespace util
diff --git a/include/mbgl/util/feature.hpp b/include/mbgl/util/feature.hpp
index 9e2286018c..390cc65720 100644
--- a/include/mbgl/util/feature.hpp
+++ b/include/mbgl/util/feature.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/util/optional.hpp>
+#include <mbgl/util/string.hpp>
#include <mapbox/feature.hpp>
@@ -11,6 +12,9 @@ using NullValue = mapbox::feature::null_value_t;
using PropertyMap = mapbox::feature::property_map;
using FeatureIdentifier = mapbox::feature::identifier;
using Feature = mapbox::feature::feature<double>;
+using FeatureState = PropertyMap;
+using FeatureStates = std::unordered_map<std::string, FeatureState>; // <featureID, FeatureState>
+using LayerFeatureStates = std::unordered_map<std::string, FeatureStates>; // <sourceLayer, FeatureStates>
template <class T>
optional<T> numericValue(const Value& value) {
@@ -29,4 +33,15 @@ optional<T> numericValue(const Value& value) {
});
}
+inline optional<std::string> featureIDtoString(const FeatureIdentifier& id) {
+ if (id.is<NullValue>()) {
+ return nullopt;
+ }
+
+ return id.match(
+ [](const std::string& value_) { return value_; }, [](uint64_t value_) { return util::toString(value_); },
+ [](int64_t value_) { return util::toString(value_); }, [](double value_) { return util::toString(value_); },
+ [](const auto&) -> optional<std::string> { return nullopt; });
+}
+
} // namespace mbgl
diff --git a/include/mbgl/util/util.hpp b/include/mbgl/util/util.hpp
index 7960b40299..52d9ad85b7 100644
--- a/include/mbgl/util/util.hpp
+++ b/include/mbgl/util/util.hpp
@@ -19,3 +19,26 @@
#else
#define MBGL_CONSTEXPR inline
#endif
+
+// Compiler defines for making symbols visible, otherwise they
+// will be defined as hidden by default.
+
+// clang-format off
+#if defined WIN32
+ #ifdef MBGL_BUILDING_LIB
+ #ifdef __GNUC__
+ #define MBGL_EXPORT __attribute__((dllexport))
+ #else
+ #define MBGL_EXPORT __declspec(dllexport)
+ #endif
+ #else
+ #ifdef __GNUC__
+ #define MBGL_EXPORT __attribute__((dllimport))
+ #else
+ #define MBGL_EXPORT __declspec(dllimport)
+ #endif
+ #endif
+#else
+ #define MBGL_EXPORT __attribute__((visibility ("default"))) // NOLINT
+#endif
+// clang-format on
diff --git a/mapbox-gl-js b/mapbox-gl-js
-Subproject 572bbb55757c93a9f11fa9b0d0ca099bc4ec361
+Subproject 7ea73ed381a81c3ff7e48b523b25d50793baf1f
diff --git a/next/CMakeLists.txt b/next/CMakeLists.txt
new file mode 100644
index 0000000000..e1fd442d48
--- /dev/null
+++ b/next/CMakeLists.txt
@@ -0,0 +1,943 @@
+cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
+project("Mapbox GL Native" LANGUAGES CXX C)
+
+# TODO: Remove when PROJECT_SOURCE_DIR becomes the actual root.
+set(MBGL_ROOT ${PROJECT_SOURCE_DIR}/..)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER Core)
+
+enable_testing()
+
+set(
+ CMAKE_CONFIGURATION_TYPES
+ Debug
+ DebugCoverage
+ MinSizeRel
+ RelWithDebInfo
+ Release
+ Sanitize
+)
+
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release)
+endif()
+
+option(MBGL_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF)
+option(MBGL_WITH_QT "Build Mapbox GL Qt bindings" OFF)
+option(MBGL_WITH_SANITIZER "Use [address|thread|memory|undefined] here" OFF)
+
+set(CMAKE_CXX_FLAGS_DEBUGCOVERAGE "${CMAKE_CXX_FLAGS_DEBUG} --coverage")
+set(CMAKE_C_FLAGS_DEBUGCOVERAGE "${CMAKE_CXX_FLAGS_DEBUG} --coverage")
+
+set(CMAKE_CXX_FLAGS_SANITIZE "-DSANITIZE -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=${MBGL_WITH_SANITIZER}")
+set(CMAKE_C_FLAGS_SANITIZE "-DSANITEIZE -g -O1 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize=${MBGL_WITH_SANITIZER}")
+
+if(MBGL_WITH_QT)
+ find_package(Qt5Core REQUIRED)
+ set(CMAKE_AUTOMOC ON)
+ set(CMAKE_AUTORCC ON)
+endif()
+
+# Avoid warnings when setting visibility
+cmake_policy(SET CMP0063 NEW)
+
+# Compiler/linker configuration
+set(CMAKE_CXX_EXTENSIONS OFF)
+set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_VISIBILITY_PRESET hidden)
+set(CMAKE_C_EXTENSIONS OFF)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_VISIBILITY_PRESET hidden)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL ON)
+set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
+
+add_library(
+ mbgl-core STATIC
+ ${MBGL_ROOT}/include/mbgl/actor/actor.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/actor_ref.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/aspiring_actor.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/established_actor.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/mailbox.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/message.hpp
+ ${MBGL_ROOT}/include/mbgl/actor/scheduler.hpp
+ ${MBGL_ROOT}/include/mbgl/annotation/annotation.hpp
+ ${MBGL_ROOT}/include/mbgl/gfx/backend.hpp
+ ${MBGL_ROOT}/include/mbgl/gfx/backend_scope.hpp
+ ${MBGL_ROOT}/include/mbgl/gfx/renderable.hpp
+ ${MBGL_ROOT}/include/mbgl/gfx/renderer_backend.hpp
+ ${MBGL_ROOT}/include/mbgl/gl/renderable_resource.hpp
+ ${MBGL_ROOT}/include/mbgl/gl/renderer_backend.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/background_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/circle_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/custom_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/fill_extrusion_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/fill_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/heatmap_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/hillshade_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/layer_manager.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/line_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/raster_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/layermanager/symbol_layer_factory.hpp
+ ${MBGL_ROOT}/include/mbgl/map/bound_options.hpp
+ ${MBGL_ROOT}/include/mbgl/map/camera.hpp
+ ${MBGL_ROOT}/include/mbgl/map/change.hpp
+ ${MBGL_ROOT}/include/mbgl/map/map.hpp
+ ${MBGL_ROOT}/include/mbgl/map/map_observer.hpp
+ ${MBGL_ROOT}/include/mbgl/map/map_options.hpp
+ ${MBGL_ROOT}/include/mbgl/map/mode.hpp
+ ${MBGL_ROOT}/include/mbgl/map/projection_mode.hpp
+ ${MBGL_ROOT}/include/mbgl/math/clamp.hpp
+ ${MBGL_ROOT}/include/mbgl/math/log2.hpp
+ ${MBGL_ROOT}/include/mbgl/math/minmax.hpp
+ ${MBGL_ROOT}/include/mbgl/math/wrap.hpp
+ ${MBGL_ROOT}/include/mbgl/platform/gl_functions.hpp
+ ${MBGL_ROOT}/include/mbgl/platform/thread.hpp
+ ${MBGL_ROOT}/include/mbgl/renderer/query.hpp
+ ${MBGL_ROOT}/include/mbgl/renderer/renderer.hpp
+ ${MBGL_ROOT}/include/mbgl/renderer/renderer_frontend.hpp
+ ${MBGL_ROOT}/include/mbgl/renderer/renderer_observer.hpp
+ ${MBGL_ROOT}/include/mbgl/renderer/renderer_state.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/default_file_source.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/file_source.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/network_status.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/offline.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/online_file_source.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/resource.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/resource_options.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/resource_transform.hpp
+ ${MBGL_ROOT}/include/mbgl/storage/response.hpp
+ ${MBGL_ROOT}/include/mbgl/style/color_ramp_property_value.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/color_ramp_property_value.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/constant.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/coordinate.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/custom_geometry_source_options.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/filter.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/function.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/geojson.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/geojson_options.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/get_json_type.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/light.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/position.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/property_value.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/tileset.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion/transition_options.hpp
+ ${MBGL_ROOT}/include/mbgl/style/conversion_impl.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/assertion.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/at.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/boolean_operator.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/case.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/check_subtype.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/coalesce.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/coercion.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/collator.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/collator_expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/comparison.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/compound_expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/dsl.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/error.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/find_zoom_curve.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/format_expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/format_section_override.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/formatted.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/get_covering_stops.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/interpolate.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/interpolator.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/is_constant.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/is_expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/length.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/let.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/literal.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/match.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/number_format.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/parsing_context.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/step.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/type.hpp
+ ${MBGL_ROOT}/include/mbgl/style/expression/value.hpp
+ ${MBGL_ROOT}/include/mbgl/style/filter.hpp
+ ${MBGL_ROOT}/include/mbgl/style/image.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layer_properties.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/background_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/circle_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/custom_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/fill_extrusion_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/fill_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/heatmap_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/hillshade_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/line_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/raster_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/layers/symbol_layer.hpp
+ ${MBGL_ROOT}/include/mbgl/style/light.hpp
+ ${MBGL_ROOT}/include/mbgl/style/position.hpp
+ ${MBGL_ROOT}/include/mbgl/style/property_expression.hpp
+ ${MBGL_ROOT}/include/mbgl/style/property_value.hpp
+ ${MBGL_ROOT}/include/mbgl/style/source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/custom_geometry_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/geojson_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/image_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/raster_dem_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/raster_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/sources/vector_source.hpp
+ ${MBGL_ROOT}/include/mbgl/style/style.hpp
+ ${MBGL_ROOT}/include/mbgl/style/transition_options.hpp
+ ${MBGL_ROOT}/include/mbgl/style/types.hpp
+ ${MBGL_ROOT}/include/mbgl/style/undefined.hpp
+ ${MBGL_ROOT}/include/mbgl/tile/tile_id.hpp
+ ${MBGL_ROOT}/include/mbgl/tile/tile_necessity.hpp
+ ${MBGL_ROOT}/include/mbgl/util/async_request.hpp
+ ${MBGL_ROOT}/include/mbgl/util/async_task.hpp
+ ${MBGL_ROOT}/include/mbgl/util/char_array_buffer.hpp
+ ${MBGL_ROOT}/include/mbgl/util/chrono.hpp
+ ${MBGL_ROOT}/include/mbgl/util/color.hpp
+ ${MBGL_ROOT}/include/mbgl/util/compression.hpp
+ ${MBGL_ROOT}/include/mbgl/util/constants.hpp
+ ${MBGL_ROOT}/include/mbgl/util/convert.hpp
+ ${MBGL_ROOT}/include/mbgl/util/enum.hpp
+ ${MBGL_ROOT}/include/mbgl/util/event.hpp
+ ${MBGL_ROOT}/include/mbgl/util/exception.hpp
+ ${MBGL_ROOT}/include/mbgl/util/expected.hpp
+ ${MBGL_ROOT}/include/mbgl/util/feature.hpp
+ ${MBGL_ROOT}/include/mbgl/util/font_stack.hpp
+ ${MBGL_ROOT}/include/mbgl/util/geo.hpp
+ ${MBGL_ROOT}/include/mbgl/util/geojson.hpp
+ ${MBGL_ROOT}/include/mbgl/util/geometry.hpp
+ ${MBGL_ROOT}/include/mbgl/util/ignore.hpp
+ ${MBGL_ROOT}/include/mbgl/util/image.hpp
+ ${MBGL_ROOT}/include/mbgl/util/immutable.hpp
+ ${MBGL_ROOT}/include/mbgl/util/indexed_tuple.hpp
+ ${MBGL_ROOT}/include/mbgl/util/interpolate.hpp
+ ${MBGL_ROOT}/include/mbgl/util/logging.hpp
+ ${MBGL_ROOT}/include/mbgl/util/noncopyable.hpp
+ ${MBGL_ROOT}/include/mbgl/util/optional.hpp
+ ${MBGL_ROOT}/include/mbgl/util/platform.hpp
+ ${MBGL_ROOT}/include/mbgl/util/premultiply.hpp
+ ${MBGL_ROOT}/include/mbgl/util/projection.hpp
+ ${MBGL_ROOT}/include/mbgl/util/range.hpp
+ ${MBGL_ROOT}/include/mbgl/util/run_loop.hpp
+ ${MBGL_ROOT}/include/mbgl/util/size.hpp
+ ${MBGL_ROOT}/include/mbgl/util/string.hpp
+ ${MBGL_ROOT}/include/mbgl/util/thread.hpp
+ ${MBGL_ROOT}/include/mbgl/util/tileset.hpp
+ ${MBGL_ROOT}/include/mbgl/util/timer.hpp
+ ${MBGL_ROOT}/include/mbgl/util/traits.hpp
+ ${MBGL_ROOT}/include/mbgl/util/type_list.hpp
+ ${MBGL_ROOT}/include/mbgl/util/unitbezier.hpp
+ ${MBGL_ROOT}/include/mbgl/util/util.hpp
+ ${MBGL_ROOT}/include/mbgl/util/variant.hpp
+ ${MBGL_ROOT}/include/mbgl/util/work_request.hpp
+ ${MBGL_ROOT}/include/mbgl/util/work_task.hpp
+ ${MBGL_ROOT}/include/mbgl/util/work_task_impl.hpp
+ ${MBGL_ROOT}/src/csscolorparser/csscolorparser.cpp
+ ${MBGL_ROOT}/src/csscolorparser/csscolorparser.hpp
+ ${MBGL_ROOT}/src/mbgl/actor/mailbox.cpp
+ ${MBGL_ROOT}/src/mbgl/actor/scheduler.cpp
+ ${MBGL_ROOT}/src/mbgl/algorithm/update_renderables.hpp
+ ${MBGL_ROOT}/src/mbgl/algorithm/update_tile_masks.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_manager.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_manager.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_source.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_source.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/annotation_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/fill_annotation_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/fill_annotation_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/line_annotation_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/line_annotation_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/render_annotation_source.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/render_annotation_source.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/shape_annotation_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/shape_annotation_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/annotation/symbol_annotation_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/annotation/symbol_annotation_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/geometry/anchor.hpp
+ ${MBGL_ROOT}/src/mbgl/geometry/debug_font_data.hpp
+ ${MBGL_ROOT}/src/mbgl/geometry/dem_data.cpp
+ ${MBGL_ROOT}/src/mbgl/geometry/dem_data.hpp
+ ${MBGL_ROOT}/src/mbgl/geometry/feature_index.cpp
+ ${MBGL_ROOT}/src/mbgl/geometry/feature_index.hpp
+ ${MBGL_ROOT}/src/mbgl/geometry/line_atlas.cpp
+ ${MBGL_ROOT}/src/mbgl/geometry/line_atlas.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/attribute.cpp
+ ${MBGL_ROOT}/src/mbgl/gfx/attribute.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/color_mode.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/command_encoder.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/context.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/cull_face_mode.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/debug_group.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/depth_mode.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/draw_mode.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/draw_scope.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/index_buffer.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/index_vector.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/offscreen_texture.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/program.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/render_pass.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/renderbuffer.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/renderer_backend.cpp
+ ${MBGL_ROOT}/src/mbgl/gfx/stencil_mode.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/texture.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/types.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/uniform.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/upload_pass.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/vertex_buffer.hpp
+ ${MBGL_ROOT}/src/mbgl/gfx/vertex_vector.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/attribute.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/attribute.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/command_encoder.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/command_encoder.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/context.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/context.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/debugging_extension.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/debugging_extension.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/defines.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/draw_scope_resource.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/enum.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/enum.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/extension.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/framebuffer.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/index_buffer_resource.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/object.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/object.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/offscreen_texture.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/offscreen_texture.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/program.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/render_pass.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/render_pass.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/renderbuffer_resource.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/renderer_backend.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/state.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/texture.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/texture.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/texture_resource.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/types.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/uniform.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/uniform.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/upload_pass.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/upload_pass.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/value.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/value.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/vertex_array.cpp
+ ${MBGL_ROOT}/src/mbgl/gl/vertex_array.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/vertex_array_extension.hpp
+ ${MBGL_ROOT}/src/mbgl/gl/vertex_buffer_resource.hpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/background_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/circle_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/custom_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/fill_extrusion_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/fill_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/heatmap_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/hillshade_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/layer_manager.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/line_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/raster_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layermanager/symbol_layer_factory.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/clip_lines.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/clip_lines.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/layout.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/merge_lines.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/merge_lines.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/pattern_layout.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_feature.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_instance.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_instance.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_layout.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_layout.hpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_projection.cpp
+ ${MBGL_ROOT}/src/mbgl/layout/symbol_projection.hpp
+ ${MBGL_ROOT}/src/mbgl/map/map.cpp
+ ${MBGL_ROOT}/src/mbgl/map/map_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/map/map_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/map/map_options.cpp
+ ${MBGL_ROOT}/src/mbgl/map/transform.cpp
+ ${MBGL_ROOT}/src/mbgl/map/transform.hpp
+ ${MBGL_ROOT}/src/mbgl/map/transform_state.cpp
+ ${MBGL_ROOT}/src/mbgl/map/transform_state.hpp
+ ${MBGL_ROOT}/src/mbgl/map/zoom_history.hpp
+ ${MBGL_ROOT}/src/mbgl/math/log2.cpp
+ ${MBGL_ROOT}/src/mbgl/platform/gl_functions.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/attributes.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/background_pattern_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/background_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/background_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/circle_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/circle_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/clipping_mask_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/clipping_mask_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/collision_box_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/collision_box_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/collision_circle_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/debug_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/debug_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_extrusion_pattern_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_extrusion_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_extrusion_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_outline_pattern_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_outline_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_pattern_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/fill_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/background.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/background_pattern.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/circle.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/clipping_mask.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/collision_box.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/collision_circle.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/debug.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill_extrusion.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill_extrusion_pattern.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill_outline.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill_outline_pattern.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/fill_pattern.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/heatmap.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/heatmap_texture.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/hillshade.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/hillshade_prepare.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/line.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/line_gradient.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/line_pattern.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/line_sdf.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/preludes.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/raster.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/shader_source.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/shader_source.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/shaders.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/shaders.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/symbol_icon.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/symbol_sdf_icon.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/gl/symbol_sdf_text.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/heatmap_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/heatmap_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/heatmap_texture_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/heatmap_texture_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/hillshade_prepare_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/hillshade_prepare_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/hillshade_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/hillshade_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/line_gradient_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/line_pattern_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/line_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/line_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/line_sdf_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/program_parameters.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/program_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/programs.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/programs.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/raster_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/raster_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/segment.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/symbol_icon_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/symbol_program.cpp
+ ${MBGL_ROOT}/src/mbgl/programs/symbol_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/symbol_sdf_icon_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/symbol_sdf_text_program.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/textures.hpp
+ ${MBGL_ROOT}/src/mbgl/programs/uniforms.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/backend_scope.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/bucket_parameters.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/bucket_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/circle_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/circle_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/debug_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/debug_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/fill_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/fill_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/heatmap_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/heatmap_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/hillshade_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/hillshade_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/line_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/line_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/raster_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/raster_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/symbol_bucket.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/buckets/symbol_bucket.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/cross_faded_property_evaluator.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/cross_faded_property_evaluator.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/data_driven_property_evaluator.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/group_by_layout.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/group_by_layout.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/image_atlas.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/image_atlas.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/image_manager.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/image_manager.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/image_manager_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_background_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_background_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_circle_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_circle_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_custom_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_custom_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_heatmap_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_heatmap_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_hillshade_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_hillshade_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_line_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_line_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_raster_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_raster_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_symbol_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/layers/render_symbol_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/paint_parameters.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/paint_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/paint_property_binder.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/paint_property_statistics.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/pattern_atlas.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/pattern_atlas.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/possibly_evaluated_property_value.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/property_evaluation_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/property_evaluator.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_layer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_light.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_light.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_orchestrator.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_orchestrator.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_pass.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_source_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_static_data.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_static_data.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/render_tree.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/renderer.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/renderer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/renderer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/renderer_state.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_custom_geometry_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_custom_geometry_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_geojson_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_geojson_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_image_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_image_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_raster_dem_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_raster_dem_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_raster_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_raster_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_tile_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_tile_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_vector_source.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/sources/render_vector_source.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/source_state.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/source_state.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/style_diff.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/style_diff.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_mask.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_pyramid.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_pyramid.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_render_data.cpp
+ ${MBGL_ROOT}/src/mbgl/renderer/tile_render_data.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/transition_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/update_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/renderer/upload_parameters.hpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_loader.cpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_loader.hpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_loader_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_loader_worker.cpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_loader_worker.hpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_parser.cpp
+ ${MBGL_ROOT}/src/mbgl/sprite/sprite_parser.hpp
+ ${MBGL_ROOT}/src/mbgl/storage/asset_file_source.hpp
+ ${MBGL_ROOT}/src/mbgl/storage/file_source.cpp
+ ${MBGL_ROOT}/src/mbgl/storage/http_file_source.hpp
+ ${MBGL_ROOT}/src/mbgl/storage/local_file_source.hpp
+ ${MBGL_ROOT}/src/mbgl/storage/network_status.cpp
+ ${MBGL_ROOT}/src/mbgl/storage/resource.cpp
+ ${MBGL_ROOT}/src/mbgl/storage/resource_options.cpp
+ ${MBGL_ROOT}/src/mbgl/storage/resource_transform.cpp
+ ${MBGL_ROOT}/src/mbgl/storage/response.cpp
+ ${MBGL_ROOT}/src/mbgl/style/collection.hpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/color_ramp_property_value.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/constant.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/coordinate.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/custom_geometry_source_options.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/filter.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/function.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/geojson.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/geojson_options.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/get_json_type.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/json.hpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/light.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/position.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/property_value.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/stringify.hpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/tileset.cpp
+ ${MBGL_ROOT}/src/mbgl/style/conversion/transition_options.cpp
+ ${MBGL_ROOT}/src/mbgl/style/custom_tile_loader.cpp
+ ${MBGL_ROOT}/src/mbgl/style/custom_tile_loader.hpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/assertion.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/at.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/boolean_operator.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/case.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/check_subtype.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/coalesce.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/coercion.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/collator_expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/comparison.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/compound_expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/dsl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/dsl_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/find_zoom_curve.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/format_expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/formatted.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/get_covering_stops.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/interpolate.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/is_constant.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/is_expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/length.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/let.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/literal.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/match.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/number_format.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/parsing_context.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/step.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/util.cpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/util.hpp
+ ${MBGL_ROOT}/src/mbgl/style/expression/value.cpp
+ ${MBGL_ROOT}/src/mbgl/style/filter.cpp
+ ${MBGL_ROOT}/src/mbgl/style/image.cpp
+ ${MBGL_ROOT}/src/mbgl/style/image_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/image_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layer_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/background_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/background_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/background_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/background_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/background_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/circle_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/circle_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/circle_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/circle_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/circle_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/custom_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/custom_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/custom_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_extrusion_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_extrusion_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_extrusion_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_extrusion_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_extrusion_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/fill_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/heatmap_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/heatmap_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/heatmap_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/heatmap_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/heatmap_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/hillshade_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/hillshade_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/hillshade_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/hillshade_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/hillshade_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/line_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/line_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/line_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/line_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/line_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/raster_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/raster_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/raster_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/raster_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/raster_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/symbol_layer.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/symbol_layer_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/symbol_layer_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/symbol_layer_properties.cpp
+ ${MBGL_ROOT}/src/mbgl/style/layers/symbol_layer_properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/layout_property.hpp
+ ${MBGL_ROOT}/src/mbgl/style/light.cpp
+ ${MBGL_ROOT}/src/mbgl/style/light_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/light_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/light_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/style/observer.hpp
+ ${MBGL_ROOT}/src/mbgl/style/paint_property.hpp
+ ${MBGL_ROOT}/src/mbgl/style/parser.cpp
+ ${MBGL_ROOT}/src/mbgl/style/parser.hpp
+ ${MBGL_ROOT}/src/mbgl/style/properties.hpp
+ ${MBGL_ROOT}/src/mbgl/style/property_expression.cpp
+ ${MBGL_ROOT}/src/mbgl/style/rapidjson_conversion.hpp
+ ${MBGL_ROOT}/src/mbgl/style/source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/source_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/custom_geometry_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/custom_geometry_source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/custom_geometry_source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/geojson_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/geojson_source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/geojson_source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/image_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/image_source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/image_source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/raster_dem_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/raster_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/raster_source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/raster_source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/vector_source.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/vector_source_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/sources/vector_source_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/style.cpp
+ ${MBGL_ROOT}/src/mbgl/style/style_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/style/style_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/style/types.cpp
+ ${MBGL_ROOT}/src/mbgl/text/bidi.hpp
+ ${MBGL_ROOT}/src/mbgl/text/check_max_angle.cpp
+ ${MBGL_ROOT}/src/mbgl/text/check_max_angle.hpp
+ ${MBGL_ROOT}/src/mbgl/text/collision_feature.cpp
+ ${MBGL_ROOT}/src/mbgl/text/collision_feature.hpp
+ ${MBGL_ROOT}/src/mbgl/text/collision_index.cpp
+ ${MBGL_ROOT}/src/mbgl/text/collision_index.hpp
+ ${MBGL_ROOT}/src/mbgl/text/cross_tile_symbol_index.cpp
+ ${MBGL_ROOT}/src/mbgl/text/cross_tile_symbol_index.hpp
+ ${MBGL_ROOT}/src/mbgl/text/get_anchors.cpp
+ ${MBGL_ROOT}/src/mbgl/text/get_anchors.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph.cpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_atlas.cpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_atlas.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_manager.cpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_manager.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_manager_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_pbf.cpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_pbf.hpp
+ ${MBGL_ROOT}/src/mbgl/text/glyph_range.hpp
+ ${MBGL_ROOT}/src/mbgl/text/language_tag.cpp
+ ${MBGL_ROOT}/src/mbgl/text/language_tag.hpp
+ ${MBGL_ROOT}/src/mbgl/text/local_glyph_rasterizer.hpp
+ ${MBGL_ROOT}/src/mbgl/text/placement.cpp
+ ${MBGL_ROOT}/src/mbgl/text/placement.hpp
+ ${MBGL_ROOT}/src/mbgl/text/quads.cpp
+ ${MBGL_ROOT}/src/mbgl/text/quads.hpp
+ ${MBGL_ROOT}/src/mbgl/text/shaping.cpp
+ ${MBGL_ROOT}/src/mbgl/text/shaping.hpp
+ ${MBGL_ROOT}/src/mbgl/text/tagged_string.cpp
+ ${MBGL_ROOT}/src/mbgl/text/tagged_string.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/custom_geometry_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/custom_geometry_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/geojson_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/geojson_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/geojson_tile_data.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile_data.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile_data.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile_worker.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/geometry_tile_worker.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_dem_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_dem_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_dem_tile_worker.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_dem_tile_worker.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_tile_worker.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/raster_tile_worker.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_cache.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_cache.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_id_hash.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_id_io.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_loader.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_loader_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/tile_observer.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/vector_tile.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/vector_tile.hpp
+ ${MBGL_ROOT}/src/mbgl/tile/vector_tile_data.cpp
+ ${MBGL_ROOT}/src/mbgl/tile/vector_tile_data.hpp
+ ${MBGL_ROOT}/src/mbgl/util/chrono.cpp
+ ${MBGL_ROOT}/src/mbgl/util/color.cpp
+ ${MBGL_ROOT}/src/mbgl/util/compression.cpp
+ ${MBGL_ROOT}/src/mbgl/util/constants.cpp
+ ${MBGL_ROOT}/src/mbgl/util/convert.cpp
+ ${MBGL_ROOT}/src/mbgl/util/dtoa.cpp
+ ${MBGL_ROOT}/src/mbgl/util/dtoa.hpp
+ ${MBGL_ROOT}/src/mbgl/util/event.cpp
+ ${MBGL_ROOT}/src/mbgl/util/font_stack.cpp
+ ${MBGL_ROOT}/src/mbgl/util/geo.cpp
+ ${MBGL_ROOT}/src/mbgl/util/geojson_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/util/grid_index.cpp
+ ${MBGL_ROOT}/src/mbgl/util/grid_index.hpp
+ ${MBGL_ROOT}/src/mbgl/util/hash.hpp
+ ${MBGL_ROOT}/src/mbgl/util/http_header.cpp
+ ${MBGL_ROOT}/src/mbgl/util/http_header.hpp
+ ${MBGL_ROOT}/src/mbgl/util/http_timeout.cpp
+ ${MBGL_ROOT}/src/mbgl/util/http_timeout.hpp
+ ${MBGL_ROOT}/src/mbgl/util/i18n.cpp
+ ${MBGL_ROOT}/src/mbgl/util/i18n.hpp
+ ${MBGL_ROOT}/src/mbgl/util/id.cpp
+ ${MBGL_ROOT}/src/mbgl/util/id.hpp
+ ${MBGL_ROOT}/src/mbgl/util/interpolate.cpp
+ ${MBGL_ROOT}/src/mbgl/util/intersection_tests.cpp
+ ${MBGL_ROOT}/src/mbgl/util/intersection_tests.hpp
+ ${MBGL_ROOT}/src/mbgl/util/io.cpp
+ ${MBGL_ROOT}/src/mbgl/util/io.hpp
+ ${MBGL_ROOT}/src/mbgl/util/literal.hpp
+ ${MBGL_ROOT}/src/mbgl/util/logging.cpp
+ ${MBGL_ROOT}/src/mbgl/util/longest_common_subsequence.hpp
+ ${MBGL_ROOT}/src/mbgl/util/mapbox.cpp
+ ${MBGL_ROOT}/src/mbgl/util/mapbox.hpp
+ ${MBGL_ROOT}/src/mbgl/util/mat2.cpp
+ ${MBGL_ROOT}/src/mbgl/util/mat2.hpp
+ ${MBGL_ROOT}/src/mbgl/util/mat3.cpp
+ ${MBGL_ROOT}/src/mbgl/util/mat3.hpp
+ ${MBGL_ROOT}/src/mbgl/util/mat4.cpp
+ ${MBGL_ROOT}/src/mbgl/util/mat4.hpp
+ ${MBGL_ROOT}/src/mbgl/util/math.hpp
+ ${MBGL_ROOT}/src/mbgl/util/premultiply.cpp
+ ${MBGL_ROOT}/src/mbgl/util/rapidjson.cpp
+ ${MBGL_ROOT}/src/mbgl/util/rapidjson.hpp
+ ${MBGL_ROOT}/src/mbgl/util/rect.hpp
+ ${MBGL_ROOT}/src/mbgl/util/std.hpp
+ ${MBGL_ROOT}/src/mbgl/util/stopwatch.cpp
+ ${MBGL_ROOT}/src/mbgl/util/stopwatch.hpp
+ ${MBGL_ROOT}/src/mbgl/util/string.cpp
+ ${MBGL_ROOT}/src/mbgl/util/thread_local.hpp
+ ${MBGL_ROOT}/src/mbgl/util/thread_pool.cpp
+ ${MBGL_ROOT}/src/mbgl/util/thread_pool.hpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_coordinate.hpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_cover.cpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_cover.hpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_cover_impl.cpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_cover_impl.hpp
+ ${MBGL_ROOT}/src/mbgl/util/tile_range.hpp
+ ${MBGL_ROOT}/src/mbgl/util/tiny_sdf.cpp
+ ${MBGL_ROOT}/src/mbgl/util/tiny_sdf.hpp
+ ${MBGL_ROOT}/src/mbgl/util/token.hpp
+ ${MBGL_ROOT}/src/mbgl/util/url.cpp
+ ${MBGL_ROOT}/src/mbgl/util/url.hpp
+ ${MBGL_ROOT}/src/mbgl/util/utf.hpp
+ ${MBGL_ROOT}/src/mbgl/util/version.cpp
+ ${MBGL_ROOT}/src/mbgl/util/version.hpp
+ ${MBGL_ROOT}/src/mbgl/util/work_request.cpp
+ ${MBGL_ROOT}/src/parsedate/parsedate.cpp
+ ${MBGL_ROOT}/src/parsedate/parsedate.hpp
+)
+
+if(EXISTS ${MBGL_ROOT}/.git/HEAD)
+ execute_process(
+ COMMAND
+ git
+ rev-parse
+ --short=8
+ HEAD
+ WORKING_DIRECTORY ${MBGL_ROOT}
+ OUTPUT_VARIABLE MBGL_VERSION_REV
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+else()
+ set(MBGL_VERSION_REV 00000000)
+endif()
+
+set_source_files_properties(
+ ${MBGL_ROOT}/src/mbgl/util/version.cpp
+ PROPERTIES
+ COMPILE_DEFINITIONS
+ MBGL_VERSION_REV="${MBGL_VERSION_REV}"
+)
+
+target_include_directories(
+ mbgl-core
+ PRIVATE ${MBGL_ROOT}/src
+)
+
+target_include_directories(
+ mbgl-core
+ PUBLIC ${MBGL_ROOT}/include
+)
+
+add_subdirectory(${PROJECT_SOURCE_DIR}/vendor/mapbox-base/mapbox)
+add_subdirectory(${PROJECT_SOURCE_DIR}/vendor/mapbox-base/extras)
+
+include(${PROJECT_SOURCE_DIR}/vendor/boost.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/earcut.hpp.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/eternal.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/expected.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/geojson-vt-cpp.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/polylabel.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/protozero.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/shelf-pack-cpp.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/unique_resource.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/vector-tile.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/wagyu.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ Mapbox::Base::Extras::kdbush.hpp
+ Mapbox::Base::supercluster.hpp
+ mbgl-vendor-boost
+ mbgl-vendor-earcut.hpp
+ mbgl-vendor-eternal
+ mbgl-vendor-geojson-vt-cpp
+ mbgl-vendor-polylabel
+ mbgl-vendor-protozero
+ mbgl-vendor-shelf-pack-cpp
+ mbgl-vendor-unique_resource
+ mbgl-vendor-vector-tile
+ mbgl-vendor-wagyu
+ PUBLIC
+ Mapbox::Base::Extras::rapidjson
+ Mapbox::Base::geojson.hpp
+ Mapbox::Base::geometry.hpp
+ Mapbox::Base::optional
+ Mapbox::Base::typewrapper
+ Mapbox::Base::variant
+ Mapbox::Base::weak
+ mbgl-vendor-expected
+)
+
+set_property(TARGET mbgl-core PROPERTY FOLDER Core)
+
+add_library(
+ Mapbox::Map ALIAS mbgl-core
+)
+
+if(MBGL_WITH_CORE_ONLY)
+ return()
+elseif(MBGL_WITH_QT)
+ include(${PROJECT_SOURCE_DIR}/platform/qt/qt.cmake)
+elseif(CMAKE_SYSTEM_NAME STREQUAL Android)
+ include(${PROJECT_SOURCE_DIR}/platform/android/android.cmake)
+elseif(CMAKE_SYSTEM_NAME STREQUAL iOS)
+ include(${PROJECT_SOURCE_DIR}/platform/ios/ios.cmake)
+elseif(CMAKE_SYSTEM_NAME STREQUAL Linux)
+ include(${PROJECT_SOURCE_DIR}/platform/linux/linux.cmake)
+elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin)
+ include(${PROJECT_SOURCE_DIR}/platform/macos/macos.cmake)
+else()
+ message(FATAL_ERROR "Unsupported target platform: " ${CMAKE_SYSTEM_NAME})
+endif()
+
+add_subdirectory(${PROJECT_SOURCE_DIR}/test)
+add_subdirectory(${PROJECT_SOURCE_DIR}/benchmark)
diff --git a/next/README.md b/next/README.md
new file mode 100644
index 0000000000..08f3a2cda8
--- /dev/null
+++ b/next/README.md
@@ -0,0 +1,42 @@
+# Mapbox GL Native
+
+A library for embedding interactive, customizable vector maps into native applications on multiple platforms. It
+takes stylesheets that conform to the [Mapbox Style Specification](https://github.com/mapbox/mapbox-gl-style-spec/),
+applies them to vector tiles that conform to the [Mapbox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec),
+and renders them using OpenGL. [Mapbox GL JS](https://github.com/mapbox/mapbox-gl-js) is the WebGL-based counterpart,
+designed for use on the Web.
+
+| SDK | Languages | Build status |
+| --------------------------------------------------- | ---------------------------------- | ---------------------------------------- |
+| Mapbox GL Native Core | C++14 | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) [![Coverage Status](https://codecov.io/gh/mapbox/mapbox-gl-native/branch/master/graph/badge.svg)](https://codecov.io/gh/mapbox/mapbox-gl-native) |
+| [Mapbox Maps SDK for Android](../platform/android/) | Java | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) |
+| [Mapbox Maps SDK for iOS](../platform/ios/) | Objective-C or Swift | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) |
+| [Mapbox Maps SDK for macOS](../platform/macos/) | Objective-C, Swift, or AppleScript | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) |
+| [node-mapbox-gl-native](../platform/node/) | Node.js | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) |
+| [Mapbox Maps SDK for Qt](../platform/qt) | C++03 | [![Circle CI build status](https://circleci.com/gh/mapbox/mapbox-gl-native.svg?style=shield)](https://circleci.com/gh/mapbox/workflows/mapbox-gl-native/tree/master) [![AppVeyor CI build status](https://ci.appveyor.com/api/projects/status/3q12kbcooc6df8uc?svg=true)](https://ci.appveyor.com/project/Mapbox/mapbox-gl-native) |
+
+[Additional Mapbox GL Native–based libraries](https://wiki.openstreetmap.org/wiki/Mapbox_GL#Libraries) for **hybrid applications** are developed outside of this repository. If your platform or hybrid application framework isn’t listed there, consider embedding [Mapbox GL JS](https://github.com/mapbox/mapbox-gl-js) using the standard Web capabilities on your platform.
+
+## License
+
+Mapbox GL Native is licensed under the [3-Clause BSD license](../LICENSE.md).
+
+## Developing
+
+The `next` directory contains the next generation buildsystem for Mapbox GL Native, based solely on CMake with the
+goal of minimizing the use of scripts, increase portability and support building Mapbox GL Native as a subdirectory
+of another CMake project. This new buildsystem is also designed to build offline, making use of pre-installed and
+vendorized dependencies. When using the build bot docker image, the build should produce the exact same results as
+the bots, making it a hermetically sealed build for Linux, Qt and Android.
+
+### Building and running tests
+
+The following command, executed from the root of this repository tree, will build Mapbox GL Native targeting your
+host architecture given that you have all the dependencies installed.
+
+```
+$ mkdir build && cd build
+$ cmake ../next
+$ make -j8
+$ make test ARGS=-V
+```
diff --git a/next/benchmark/CMakeLists.txt b/next/benchmark/CMakeLists.txt
new file mode 100644
index 0000000000..2ae1227d91
--- /dev/null
+++ b/next/benchmark/CMakeLists.txt
@@ -0,0 +1,41 @@
+add_library(
+ mbgl-benchmark SHARED EXCLUDE_FROM_ALL
+ ${MBGL_ROOT}/benchmark/api/query.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/api/render.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/function/camera_function.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/function/composite_function.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/function/source_function.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/parse/filter.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/parse/tile_mask.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/parse/vector_tile.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/src/mbgl/benchmark/benchmark.cpp
+ ${MBGL_ROOT}/benchmark/storage/offline_database.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/util/dtoa.benchmark.cpp
+ ${MBGL_ROOT}/benchmark/util/tilecover.benchmark.cpp
+)
+
+target_include_directories(
+ mbgl-benchmark
+ PRIVATE ${MBGL_ROOT}/benchmark/src ${MBGL_ROOT}/platform/default/include ${MBGL_ROOT}/src
+)
+
+target_include_directories(
+ mbgl-benchmark
+ PUBLIC ${MBGL_ROOT}/benchmark/include ${MBGL_ROOT}/include
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/benchmark.cmake)
+
+# Needed for testing private classes
+get_target_property(MBGL_CORE_PRIVATE_LIBRARIES mbgl-core LINK_LIBRARIES)
+
+target_link_libraries(
+ mbgl-benchmark
+ PRIVATE ${MBGL_CORE_PRIVATE_LIBRARIES} mbgl-core mbgl-vendor-benchmark
+)
+
+if(CMAKE_SYSTEM_NAME STREQUAL Android)
+ set_target_properties(mbgl-benchmark PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+endif()
+
+set_property(TARGET mbgl-benchmark PROPERTY FOLDER Core)
diff --git a/next/bin/CMakeLists.txt b/next/bin/CMakeLists.txt
new file mode 100644
index 0000000000..e4222774bb
--- /dev/null
+++ b/next/bin/CMakeLists.txt
@@ -0,0 +1,26 @@
+add_executable(
+ mbgl-offline
+ ${MBGL_ROOT}/bin/offline.cpp
+)
+
+target_link_libraries(
+ mbgl-offline
+ PRIVATE Mapbox::Base::Extras::args mbgl-core
+)
+
+add_executable(
+ mbgl-render
+ ${MBGL_ROOT}/bin/render.cpp
+)
+
+target_link_libraries(
+ mbgl-render
+ PRIVATE Mapbox::Base::Extras::args mbgl-core
+)
+
+# FIXME: CI must have a valid token
+#
+# add_test(NAME mbgl-offline-tool-test COMMAND mbgl-offline -s mapbox://styles/mapbox/satellite-v9 --maxZoom=0 WORKING_DIRECTORY
+# ${MBGL_ROOT} )
+#
+# add_test(NAME mbgl-render-tool-test COMMAND mbgl-render WORKING_DIRECTORY ${MBGL_ROOT} )
diff --git a/next/expression-test/CMakeLists.txt b/next/expression-test/CMakeLists.txt
new file mode 100644
index 0000000000..1713f0b655
--- /dev/null
+++ b/next/expression-test/CMakeLists.txt
@@ -0,0 +1,36 @@
+add_executable(
+ mbgl-expression-test
+ ${MBGL_ROOT}/expression-test/expression_test_logger.cpp
+ ${MBGL_ROOT}/expression-test/expression_test_logger.hpp
+ ${MBGL_ROOT}/expression-test/expression_test_parser.cpp
+ ${MBGL_ROOT}/expression-test/expression_test_parser.hpp
+ ${MBGL_ROOT}/expression-test/expression_test_runner.cpp
+ ${MBGL_ROOT}/expression-test/expression_test_runner.hpp
+ ${MBGL_ROOT}/expression-test/main.cpp
+)
+
+target_compile_definitions(
+ mbgl-expression-test
+ PRIVATE TEST_RUNNER_ROOT_PATH="${MBGL_ROOT}"
+)
+
+# FIXME: Should not use core private interface
+target_include_directories(
+ mbgl-expression-test
+ PRIVATE ${MBGL_ROOT}/src
+)
+
+target_link_libraries(
+ mbgl-expression-test
+ PRIVATE
+ Mapbox::Base::Extras::args
+ Mapbox::Base::Extras::filesystem
+ Mapbox::Base::io
+ mbgl-core
+)
+
+set_property(TARGET mbgl-expression-test PROPERTY FOLDER Executables)
+
+string(RANDOM LENGTH 5 ALPHABET 0123456789 MBGL_EXPRESSION_TEST_SEED)
+
+add_test(NAME mbgl-expression-test COMMAND mbgl-expression-test -s --seed=${MBGL_EXPRESSION_TEST_SEED} WORKING_DIRECTORY ${MBGL_ROOT})
diff --git a/next/platform/android/android.cmake b/next/platform/android/android.cmake
new file mode 100644
index 0000000000..6b6a431ced
--- /dev/null
+++ b/next/platform/android/android.cmake
@@ -0,0 +1,306 @@
+if(NOT ANDROID_NDK_TOOLCHAIN_INCLUDED)
+ message(FATAL_ERROR "-- Toolchain file not included, see https://developer.android.com/ndk/guides/cmake")
+endif()
+
+target_compile_definitions(
+ mbgl-core
+ PUBLIC MBGL_USE_GLES2
+)
+
+target_sources(
+ mbgl-core
+ PRIVATE
+ ${MBGL_ROOT}/platform/android/src/android_renderer_backend.cpp
+ ${MBGL_ROOT}/platform/android/src/android_renderer_backend.hpp
+ ${MBGL_ROOT}/platform/android/src/android_renderer_frontend.cpp
+ ${MBGL_ROOT}/platform/android/src/android_renderer_frontend.hpp
+ ${MBGL_ROOT}/platform/android/src/annotation/marker.cpp
+ ${MBGL_ROOT}/platform/android/src/annotation/marker.hpp
+ ${MBGL_ROOT}/platform/android/src/annotation/multi_point.hpp
+ ${MBGL_ROOT}/platform/android/src/annotation/polygon.cpp
+ ${MBGL_ROOT}/platform/android/src/annotation/polygon.hpp
+ ${MBGL_ROOT}/platform/android/src/annotation/polyline.cpp
+ ${MBGL_ROOT}/platform/android/src/annotation/polyline.hpp
+ ${MBGL_ROOT}/platform/android/src/asset_manager.hpp
+ ${MBGL_ROOT}/platform/android/src/asset_manager_file_source.cpp
+ ${MBGL_ROOT}/platform/android/src/asset_manager_file_source.hpp
+ ${MBGL_ROOT}/platform/android/src/async_task.cpp
+ ${MBGL_ROOT}/platform/android/src/attach_env.cpp
+ ${MBGL_ROOT}/platform/android/src/attach_env.hpp
+ ${MBGL_ROOT}/platform/android/src/bitmap.cpp
+ ${MBGL_ROOT}/platform/android/src/bitmap.hpp
+ ${MBGL_ROOT}/platform/android/src/bitmap_factory.cpp
+ ${MBGL_ROOT}/platform/android/src/bitmap_factory.hpp
+ ${MBGL_ROOT}/platform/android/src/connectivity_listener.cpp
+ ${MBGL_ROOT}/platform/android/src/connectivity_listener.hpp
+ ${MBGL_ROOT}/platform/android/src/conversion/collection.cpp
+ ${MBGL_ROOT}/platform/android/src/conversion/collection.hpp
+ ${MBGL_ROOT}/platform/android/src/conversion/color.cpp
+ ${MBGL_ROOT}/platform/android/src/conversion/color.hpp
+ ${MBGL_ROOT}/platform/android/src/conversion/constant.cpp
+ ${MBGL_ROOT}/platform/android/src/conversion/constant.hpp
+ ${MBGL_ROOT}/platform/android/src/conversion/conversion.hpp
+ ${MBGL_ROOT}/platform/android/src/file_source.cpp
+ ${MBGL_ROOT}/platform/android/src/file_source.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/feature.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/feature.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/feature_collection.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/feature_collection.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/geometry.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/geometry.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/geometry_collection.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/geometry_collection.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/line_string.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/line_string.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_line_string.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_line_string.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_point.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_point.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_polygon.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/multi_polygon.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/point.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/point.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/polygon.cpp
+ ${MBGL_ROOT}/platform/android/src/geojson/polygon.hpp
+ ${MBGL_ROOT}/platform/android/src/geojson/util.hpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng.cpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng.hpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng_bounds.cpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng_bounds.hpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng_quad.cpp
+ ${MBGL_ROOT}/platform/android/src/geometry/lat_lng_quad.hpp
+ ${MBGL_ROOT}/platform/android/src/geometry/projected_meters.cpp
+ ${MBGL_ROOT}/platform/android/src/geometry/projected_meters.hpp
+ ${MBGL_ROOT}/platform/android/src/gl_functions.cpp
+ ${MBGL_ROOT}/platform/android/src/graphics/pointf.cpp
+ ${MBGL_ROOT}/platform/android/src/graphics/pointf.hpp
+ ${MBGL_ROOT}/platform/android/src/graphics/rectf.cpp
+ ${MBGL_ROOT}/platform/android/src/graphics/rectf.hpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_array.cpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_array.hpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_element.cpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_element.hpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_object.cpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_object.hpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_primitive.cpp
+ ${MBGL_ROOT}/platform/android/src/gson/json_primitive.hpp
+ ${MBGL_ROOT}/platform/android/src/http_file_source.cpp
+ ${MBGL_ROOT}/platform/android/src/image.cpp
+ ${MBGL_ROOT}/platform/android/src/java/util.cpp
+ ${MBGL_ROOT}/platform/android/src/java/util.hpp
+ ${MBGL_ROOT}/platform/android/src/java_types.cpp
+ ${MBGL_ROOT}/platform/android/src/java_types.hpp
+ ${MBGL_ROOT}/platform/android/src/jni.cpp
+ ${MBGL_ROOT}/platform/android/src/jni.hpp
+ ${MBGL_ROOT}/platform/android/src/jni_native.cpp
+ ${MBGL_ROOT}/platform/android/src/jni_native.hpp
+ ${MBGL_ROOT}/platform/android/src/logger.cpp
+ ${MBGL_ROOT}/platform/android/src/logger.hpp
+ ${MBGL_ROOT}/platform/android/src/logging_android.cpp
+ ${MBGL_ROOT}/platform/android/src/map/camera_position.cpp
+ ${MBGL_ROOT}/platform/android/src/map/camera_position.hpp
+ ${MBGL_ROOT}/platform/android/src/map/image.cpp
+ ${MBGL_ROOT}/platform/android/src/map/image.hpp
+ ${MBGL_ROOT}/platform/android/src/map_renderer.cpp
+ ${MBGL_ROOT}/platform/android/src/map_renderer.hpp
+ ${MBGL_ROOT}/platform/android/src/map_renderer_runnable.cpp
+ ${MBGL_ROOT}/platform/android/src/map_renderer_runnable.hpp
+ ${MBGL_ROOT}/platform/android/src/native_map_view.cpp
+ ${MBGL_ROOT}/platform/android/src/native_map_view.hpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_manager.cpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_manager.hpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region.cpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region.hpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_definition.cpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_definition.hpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_error.cpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_error.hpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_status.cpp
+ ${MBGL_ROOT}/platform/android/src/offline/offline_region_status.hpp
+ ${MBGL_ROOT}/platform/android/src/run_loop.cpp
+ ${MBGL_ROOT}/platform/android/src/run_loop_impl.hpp
+ ${MBGL_ROOT}/platform/android/src/snapshotter/map_snapshot.cpp
+ ${MBGL_ROOT}/platform/android/src/snapshotter/map_snapshot.hpp
+ ${MBGL_ROOT}/platform/android/src/snapshotter/map_snapshotter.cpp
+ ${MBGL_ROOT}/platform/android/src/snapshotter/map_snapshotter.hpp
+ ${MBGL_ROOT}/platform/android/src/string_util.cpp
+ ${MBGL_ROOT}/platform/android/src/style/android_conversion.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/filter.cpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/filter.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/position.cpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/position.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/property_expression.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/property_value.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/transition_options.cpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/transition_options.hpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/url_or_tileset.cpp
+ ${MBGL_ROOT}/platform/android/src/style/conversion/url_or_tileset.hpp
+ ${MBGL_ROOT}/platform/android/src/style/formatted.cpp
+ ${MBGL_ROOT}/platform/android/src/style/formatted.hpp
+ ${MBGL_ROOT}/platform/android/src/style/formatted_section.cpp
+ ${MBGL_ROOT}/platform/android/src/style/formatted_section.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/background_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/background_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/circle_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/circle_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/custom_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/custom_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/fill_extrusion_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/fill_extrusion_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/fill_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/fill_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/heatmap_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/heatmap_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/hillshade_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/hillshade_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/layer_manager.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/layer_manager.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/line_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/line_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/raster_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/raster_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/symbol_layer.cpp
+ ${MBGL_ROOT}/platform/android/src/style/layers/symbol_layer.hpp
+ ${MBGL_ROOT}/platform/android/src/style/light.cpp
+ ${MBGL_ROOT}/platform/android/src/style/light.hpp
+ ${MBGL_ROOT}/platform/android/src/style/position.cpp
+ ${MBGL_ROOT}/platform/android/src/style/position.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/custom_geometry_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/custom_geometry_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/geojson_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/geojson_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/image_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/image_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/raster_dem_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/raster_dem_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/raster_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/raster_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/unknown_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/unknown_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/vector_source.cpp
+ ${MBGL_ROOT}/platform/android/src/style/sources/vector_source.hpp
+ ${MBGL_ROOT}/platform/android/src/style/transition_options.cpp
+ ${MBGL_ROOT}/platform/android/src/style/transition_options.hpp
+ ${MBGL_ROOT}/platform/android/src/style/value.cpp
+ ${MBGL_ROOT}/platform/android/src/style/value.hpp
+ ${MBGL_ROOT}/platform/android/src/text/collator.cpp
+ ${MBGL_ROOT}/platform/android/src/text/collator_jni.hpp
+ ${MBGL_ROOT}/platform/android/src/text/format_number.cpp
+ ${MBGL_ROOT}/platform/android/src/text/format_number_jni.hpp
+ ${MBGL_ROOT}/platform/android/src/text/local_glyph_rasterizer.cpp
+ ${MBGL_ROOT}/platform/android/src/text/local_glyph_rasterizer_jni.hpp
+ ${MBGL_ROOT}/platform/android/src/thread.cpp
+ ${MBGL_ROOT}/platform/android/src/timer.cpp
+ ${MBGL_ROOT}/platform/android/src/unaccent.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/map/map_snapshotter.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_database.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_download.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/bidi.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/png_writer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/thread_local.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/utf.cpp
+ ${MBGL_ROOT}/platform/linux/src/headless_backend_egl.cpp
+)
+
+target_include_directories(
+ mbgl-core
+ PRIVATE ${MBGL_ROOT}/platform/default/include
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ EGL
+ GLESv2
+ Mapbox::Base::jni.hpp
+ android
+ atomic
+ jnigraphics
+ log
+ mbgl-vendor-icu
+ mbgl-vendor-sqlite
+ z
+)
+
+add_library(
+ mapbox-gl SHARED
+ ${MBGL_ROOT}/platform/android/src/main.cpp
+)
+
+target_link_libraries(
+ mapbox-gl
+ PRIVATE Mapbox::Base::jni.hpp mbgl-core
+)
+
+add_library(
+ example-custom-layer MODULE
+ ${MBGL_ROOT}/platform/android/src/example_custom_layer.cpp
+)
+
+target_include_directories(
+ example-custom-layer
+ PRIVATE ${MBGL_ROOT}/include
+)
+
+target_link_libraries(
+ example-custom-layer
+ PRIVATE
+ GLESv2
+ Mapbox::Base::optional
+ Mapbox::Base::typewrapper
+ Mapbox::Base::weak
+ log
+)
+
+add_executable(
+ mbgl-test-runner
+ ${MBGL_ROOT}/platform/android/src/test/runtime.cpp ${MBGL_ROOT}/platform/android/src/test/runtime.hpp
+ ${MBGL_ROOT}/platform/android/src/test/test_runner.cpp
+)
+
+target_link_libraries(
+ mbgl-test-runner
+ PRIVATE Mapbox::Base::jni.hpp mapbox-gl mbgl-test
+)
+
+add_executable(
+ mbgl-benchmark-runner
+ ${MBGL_ROOT}/platform/android/src/test/benchmark_runner.cpp ${MBGL_ROOT}/platform/android/src/test/runtime.cpp
+ ${MBGL_ROOT}/platform/android/src/test/runtime.hpp
+)
+
+target_link_libraries(
+ mbgl-benchmark-runner
+ PRIVATE Mapbox::Base::jni.hpp mapbox-gl mbgl-benchmark
+)
+
+# Android has no concept of MinSizeRel on android.toolchain.cmake and provides configurations tuned for binary size. We can push it a bit
+# more with code folding and LTO.
+set_target_properties(example-custom-layer PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+set_target_properties(mapbox-gl PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+set_target_properties(mbgl-benchmark-runner PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+set_target_properties(mbgl-test-runner PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+
+target_compile_options(example-custom-layer PRIVATE $<$<CONFIG:Release>:-Qunused-arguments -flto>)
+target_compile_options(mapbox-gl PRIVATE $<$<CONFIG:Release>:-Qunused-arguments -flto>)
+target_compile_options(mbgl-core PRIVATE $<$<CONFIG:Release>:-Qunused-arguments -flto>)
+target_compile_options(mbgl-vendor-icu PRIVATE $<$<CONFIG:Release>:-Qunused-arguments -flto>)
+target_compile_options(mbgl-vendor-sqlite PRIVATE $<$<CONFIG:Release>:-Qunused-arguments -flto>)
diff --git a/next/platform/glfw/CMakeLists.txt b/next/platform/glfw/CMakeLists.txt
new file mode 100644
index 0000000000..d4f1b9d545
--- /dev/null
+++ b/next/platform/glfw/CMakeLists.txt
@@ -0,0 +1,38 @@
+find_package(OpenGL REQUIRED)
+find_package(PkgConfig REQUIRED)
+
+pkg_search_module(GLFW glfw3 REQUIRED)
+
+add_executable(
+ mbgl-glfw
+ ${MBGL_ROOT}/platform/glfw/main.cpp
+ ${MBGL_ROOT}/platform/glfw/glfw_view.cpp
+ ${MBGL_ROOT}/platform/glfw/glfw_gl_backend.cpp
+ ${MBGL_ROOT}/platform/glfw/glfw_renderer_frontend.cpp
+ ${MBGL_ROOT}/platform/glfw/settings_json.cpp
+)
+
+target_include_directories(
+ mbgl-glfw
+ PRIVATE ${GLFW_INCLUDE_DIRS}
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/cheap-ruler-cpp.cmake)
+
+# Use target_link_directories when we move away from CMake 3.10.
+target_link_libraries(
+ mbgl-glfw
+ PRIVATE $<$<BOOL:${GLFW_LIBRARY_DIRS}>:-L${GLFW_LIBRARY_DIRS}>
+)
+
+target_link_libraries(
+ mbgl-glfw
+ PRIVATE
+ ${GLFW_LIBRARIES}
+ Mapbox::Base::Extras::args
+ Mapbox::Map
+ OpenGL::GL
+ mbgl-vendor-cheap-ruler-cpp
+)
+
+set_property(TARGET mbgl-glfw PROPERTY FOLDER Executables)
diff --git a/next/platform/ios/ios.cmake b/next/platform/ios/ios.cmake
new file mode 100644
index 0000000000..7be60bd387
--- /dev/null
+++ b/next/platform/ios/ios.cmake
@@ -0,0 +1,70 @@
+target_compile_definitions(
+ mbgl-core
+ PUBLIC MBGL_USE_GLES2 GLES_SILENCE_DEPRECATION
+)
+
+target_sources(
+ mbgl-core
+ PRIVATE
+ ${MBGL_ROOT}/platform/darwin/src/async_task.cpp
+ ${MBGL_ROOT}/platform/darwin/src/collator.mm
+ ${MBGL_ROOT}/platform/darwin/src/gl_functions.cpp
+ ${MBGL_ROOT}/platform/darwin/src/headless_backend_eagl.mm
+ ${MBGL_ROOT}/platform/darwin/src/http_file_source.mm
+ ${MBGL_ROOT}/platform/darwin/src/image.mm
+ ${MBGL_ROOT}/platform/darwin/src/local_glyph_rasterizer.mm
+ ${MBGL_ROOT}/platform/darwin/src/logging_nslog.mm
+ ${MBGL_ROOT}/platform/darwin/src/nsthread.mm
+ ${MBGL_ROOT}/platform/darwin/src/reachability.m
+ ${MBGL_ROOT}/platform/darwin/src/run_loop.cpp
+ ${MBGL_ROOT}/platform/darwin/src/string_nsstring.mm
+ ${MBGL_ROOT}/platform/darwin/src/timer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/map/map_snapshotter.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_database.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_download.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/bidi.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/png_writer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/thread_local.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/utf.cpp
+)
+
+target_include_directories(
+ mbgl-core
+ PRIVATE ${MBGL_ROOT}/platform/darwin/include ${MBGL_ROOT}/platform/default/include
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ "-framework CoreGraphics"
+ "-framework CoreImage"
+ "-framework CoreLocation"
+ "-framework CoreServices"
+ "-framework CoreText"
+ "-framework Foundation"
+ "-framework GLKit"
+ "-framework ImageIO"
+ "-framework OpenGLES"
+ "-framework QuartzCore"
+ "-framework Security"
+ "-framework SystemConfiguration"
+ "-framework UIKit"
+ "-framework WebKit"
+ mbgl-vendor-icu
+ sqlite3
+ z
+)
diff --git a/next/platform/linux/linux.cmake b/next/platform/linux/linux.cmake
new file mode 100644
index 0000000000..8a80da1928
--- /dev/null
+++ b/next/platform/linux/linux.cmake
@@ -0,0 +1,126 @@
+find_package(CURL REQUIRED)
+find_package(ICU REQUIRED i18n)
+find_package(ICU REQUIRED uc)
+find_package(JPEG REQUIRED)
+find_package(OpenGL REQUIRED GLX)
+find_package(PNG REQUIRED)
+find_package(PkgConfig REQUIRED)
+find_package(X11 REQUIRED)
+
+pkg_search_module(LIBUV libuv REQUIRED)
+
+target_sources(
+ mbgl-core
+ PRIVATE
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/layermanager/layer_manager.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/http_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_database.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_download.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/bidi.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/collator.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/local_glyph_rasterizer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/unaccent.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/async_task.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/format_number.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/image.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/jpeg_reader.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/logging_stderr.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/png_reader.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/png_writer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/run_loop.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/string_stdlib.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/thread.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/thread_local.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/timer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/utf.cpp
+ ${MBGL_ROOT}/platform/linux/src/gl_functions.cpp
+ ${MBGL_ROOT}/platform/linux/src/headless_backend_glx.cpp
+)
+
+# FIXME: Should not be needed, but now needed by node because of the headless frontend.
+target_include_directories(
+ mbgl-core
+ PUBLIC ${MBGL_ROOT}/platform/default/include
+ PRIVATE
+ ${CURL_INCLUDE_DIRS}
+ ${JPEG_INCLUDE_DIRS}
+ ${LIBUV_INCLUDE_DIRS}
+ ${X11_INCLUDE_DIRS}
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ ${CURL_LIBRARIES}
+ ${JPEG_LIBRARIES}
+ ${LIBUV_LIBRARIES}
+ ${X11_LIBRARIES}
+ ICU::i18n
+ ICU::uc
+ OpenGL::GLX
+ PNG::PNG
+ mbgl-vendor-nunicode
+ mbgl-vendor-sqlite
+)
+
+add_custom_target(mbgl-ca-bundle)
+add_dependencies(mbgl-core mbgl-ca-bundle)
+
+add_custom_command(
+ TARGET mbgl-ca-bundle PRE_BUILD
+ COMMAND
+ ${CMAKE_COMMAND}
+ -E
+ copy
+ ${MBGL_ROOT}/misc/ca-bundle.crt
+ ${CMAKE_BINARY_DIR}
+)
+
+add_subdirectory(${PROJECT_SOURCE_DIR}/bin)
+add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test)
+add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw)
+add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node)
+add_subdirectory(${PROJECT_SOURCE_DIR}/render-test)
+
+add_executable(
+ mbgl-test-runner
+ ${MBGL_ROOT}/platform/default/src/mbgl/test/main.cpp
+)
+
+target_compile_definitions(
+ mbgl-test-runner
+ PRIVATE WORK_DIRECTORY=${MBGL_ROOT}
+)
+
+target_link_libraries(
+ mbgl-test-runner
+ PRIVATE mbgl-test
+)
+
+add_executable(
+ mbgl-benchmark-runner
+ ${MBGL_ROOT}/platform/default/src/mbgl/benchmark/main.cpp
+)
+
+target_link_libraries(
+ mbgl-benchmark-runner
+ PRIVATE mbgl-benchmark
+)
+
+add_test(NAME mbgl-benchmark-runner COMMAND mbgl-benchmark-runner WORKING_DIRECTORY ${MBGL_ROOT})
+add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${MBGL_ROOT})
diff --git a/next/platform/macos/macos.cmake b/next/platform/macos/macos.cmake
new file mode 100644
index 0000000000..747ac5839b
--- /dev/null
+++ b/next/platform/macos/macos.cmake
@@ -0,0 +1,187 @@
+find_package(OpenGL REQUIRED)
+
+target_compile_definitions(
+ mbgl-core
+ PUBLIC GL_SILENCE_DEPRECATION
+)
+
+target_sources(
+ mbgl-core
+ PRIVATE
+ ${MBGL_ROOT}/platform/darwin/src/MGLAccountManager.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLAttributedExpression.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLAttributionInfo.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLBackgroundStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLCircleStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLClockDirectionFormatter.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLCompassDirectionFormatter.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLComputedShapeSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLCoordinateFormatter.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLDistanceFormatter.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLFeature.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLFillExtrusionStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLFillStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLForegroundStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLFoundation.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLGeometry.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLHeatmapStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLHillshadeStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLImageSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLLight.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLLineStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLLoggingConfiguration.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLMapCamera.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLMapSnapshotter.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLMultiPoint.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLNetworkConfiguration.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLOfflinePack.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLOfflineStorage.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLOpenGLStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLPointAnnotation.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLPointCollection.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLPolygon.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLPolyline.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLRasterDEMSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLRasterStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLRasterTileSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLRendererConfiguration.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLSDKMetricsManager.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLShape.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLShapeCollection.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLShapeOfflineRegion.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLShapeSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLStyle.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLStyleLayerManager.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLStyleValue.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLSymbolStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLTilePyramidOfflineRegion.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLTileSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLTypes.m
+ ${MBGL_ROOT}/platform/darwin/src/MGLVectorStyleLayer.mm
+ ${MBGL_ROOT}/platform/darwin/src/MGLVectorTileSource.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSArray+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSBundle+MGLAdditions.m
+ ${MBGL_ROOT}/platform/darwin/src/NSCoder+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSComparisonPredicate+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSCompoundPredicate+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSDate+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSDictionary+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSExpression+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSPredicate+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/NSString+MGLAdditions.m
+ ${MBGL_ROOT}/platform/darwin/src/NSURL+MGLAdditions.m
+ ${MBGL_ROOT}/platform/darwin/src/NSValue+MGLAdditions.m
+ ${MBGL_ROOT}/platform/darwin/src/NSValue+MGLStyleAttributeAdditions.mm
+ ${MBGL_ROOT}/platform/darwin/src/async_task.cpp
+ ${MBGL_ROOT}/platform/darwin/src/collator.mm
+ ${MBGL_ROOT}/platform/darwin/src/gl_functions.cpp
+ ${MBGL_ROOT}/platform/darwin/src/headless_backend_cgl.mm
+ ${MBGL_ROOT}/platform/darwin/src/http_file_source.mm
+ ${MBGL_ROOT}/platform/darwin/src/image.mm
+ ${MBGL_ROOT}/platform/darwin/src/local_glyph_rasterizer.mm
+ ${MBGL_ROOT}/platform/darwin/src/logging_nslog.mm
+ ${MBGL_ROOT}/platform/darwin/src/nsthread.mm
+ ${MBGL_ROOT}/platform/darwin/src/reachability.m
+ ${MBGL_ROOT}/platform/darwin/src/run_loop.cpp
+ ${MBGL_ROOT}/platform/darwin/src/string_nsstring.mm
+ ${MBGL_ROOT}/platform/darwin/src/timer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/map/map_snapshotter.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_database.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_download.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/bidi.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/png_writer.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/thread_local.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/util/utf.cpp
+ ${MBGL_ROOT}/platform/macos/src/MGLAnnotationImage.m
+ ${MBGL_ROOT}/platform/macos/src/MGLAttributionButton.mm
+ ${MBGL_ROOT}/platform/macos/src/MGLCompassCell.m
+ ${MBGL_ROOT}/platform/macos/src/MGLMapView+IBAdditions.mm
+ ${MBGL_ROOT}/platform/macos/src/MGLMapView+Impl.mm
+ ${MBGL_ROOT}/platform/macos/src/MGLMapView+OpenGL.mm
+ ${MBGL_ROOT}/platform/macos/src/MGLMapView.mm
+ ${MBGL_ROOT}/platform/macos/src/MGLOpenGLLayer.mm
+ ${MBGL_ROOT}/platform/macos/src/NSColor+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/macos/src/NSImage+MGLAdditions.mm
+ ${MBGL_ROOT}/platform/macos/src/NSProcessInfo+MGLAdditions.m
+)
+
+set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES)
+
+target_compile_options(mbgl-core PRIVATE -fobjc-arc)
+
+# FIXME: Should not be needed, but now needed by node because of the headless frontend.
+target_include_directories(
+ mbgl-core
+ PUBLIC ${MBGL_ROOT}/platform/default/include
+)
+
+target_include_directories(
+ mbgl-core
+ PRIVATE ${MBGL_ROOT}/platform/darwin/include ${MBGL_ROOT}/platform/darwin/src ${MBGL_ROOT}/platform/macos/src
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ "-framework AppKit"
+ "-framework CoreGraphics"
+ "-framework CoreLocation"
+ "-framework SystemConfiguration"
+ OpenGL::GL
+ mbgl-vendor-icu
+ sqlite3
+ z
+)
+
+add_subdirectory(${PROJECT_SOURCE_DIR}/bin)
+add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test)
+add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw)
+add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node)
+add_subdirectory(${PROJECT_SOURCE_DIR}/render-test)
+
+add_executable(
+ mbgl-test-runner
+ ${MBGL_ROOT}/platform/default/src/mbgl/test/main.cpp
+)
+
+target_compile_definitions(
+ mbgl-test-runner
+ PRIVATE WORK_DIRECTORY=${MBGL_ROOT}
+)
+
+target_link_libraries(
+ mbgl-test-runner
+ PRIVATE mbgl-test
+)
+
+add_executable(
+ mbgl-benchmark-runner
+ ${MBGL_ROOT}/platform/default/src/mbgl/benchmark/main.cpp
+)
+
+target_link_libraries(
+ mbgl-benchmark-runner
+ PRIVATE mbgl-benchmark
+)
+
+set_property(TARGET mbgl-benchmark-runner PROPERTY FOLDER Executables)
+set_property(TARGET mbgl-test-runner PROPERTY FOLDER Executables)
+
+add_test(NAME mbgl-benchmark-runner COMMAND mbgl-benchmark-runner WORKING_DIRECTORY ${MBGL_ROOT})
+add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${MBGL_ROOT})
diff --git a/next/platform/node/CMakeLists.txt b/next/platform/node/CMakeLists.txt
new file mode 100644
index 0000000000..432979b473
--- /dev/null
+++ b/next/platform/node/CMakeLists.txt
@@ -0,0 +1,52 @@
+if(NOT EXISTS ${MBGL_ROOT}/node_modules/@mapbox/cmake-node-module/module.cmake)
+ message("-- Not building node bindings, dependencies not found. Run 'npm update'.")
+ return()
+endif()
+
+set(NODE_MODULE_CACHE_DIR ${CMAKE_SOURCE_DIR}/build/headers)
+include(${MBGL_ROOT}/node_modules/@mapbox/cmake-node-module/module.cmake)
+
+add_node_module(
+ mbgl-node
+ INSTALL_PATH ${MBGL_ROOT}/lib/{node_abi}/mbgl.node
+ NAN_VERSION 2.10.0
+ EXCLUDE_NODE_ABIS
+ 46
+ 47
+ 48
+ 51
+ 59
+ 67
+ 72
+)
+
+target_sources(
+ mbgl-node
+ INTERFACE
+ ${MBGL_ROOT}/platform/node/src/node_conversion.hpp
+ ${MBGL_ROOT}/platform/node/src/node_expression.cpp
+ ${MBGL_ROOT}/platform/node/src/node_expression.hpp
+ ${MBGL_ROOT}/platform/node/src/node_feature.cpp
+ ${MBGL_ROOT}/platform/node/src/node_feature.hpp
+ ${MBGL_ROOT}/platform/node/src/node_logging.cpp
+ ${MBGL_ROOT}/platform/node/src/node_logging.hpp
+ ${MBGL_ROOT}/platform/node/src/node_map.cpp
+ ${MBGL_ROOT}/platform/node/src/node_map.hpp
+ ${MBGL_ROOT}/platform/node/src/node_mapbox_gl_native.cpp
+ ${MBGL_ROOT}/platform/node/src/node_request.cpp
+ ${MBGL_ROOT}/platform/node/src/node_request.hpp
+ ${MBGL_ROOT}/platform/node/src/util/async_queue.hpp
+)
+
+target_link_libraries(
+ mbgl-node
+ INTERFACE Mapbox::Map
+)
+
+# FIXME: Node bindings only run fully on Linux now because it requires libuv RunLoop (which is the default on Linux). Also, Sanitizer will
+# not work here because node will do a dlopen(), which is not currently supported.
+if(CMAKE_SYSTEM_NAME STREQUAL Linux AND NOT CMAKE_BUILD_TYPE STREQUAL Sanitize)
+ add_test(NAME mbgl-node-memory COMMAND npm run test-memory WORKING_DIRECTORY ${MBGL_ROOT})
+ add_test(NAME mbgl-node-query COMMAND npm run test-query WORKING_DIRECTORY ${MBGL_ROOT})
+ add_test(NAME mbgl-node-test COMMAND npm run test WORKING_DIRECTORY ${MBGL_ROOT})
+endif()
diff --git a/next/platform/qt/qt.cmake b/next/platform/qt/qt.cmake
new file mode 100644
index 0000000000..746fd39711
--- /dev/null
+++ b/next/platform/qt/qt.cmake
@@ -0,0 +1,190 @@
+# Note: Using Sqlite instead of QSqlDatabase for better compatibility.
+
+find_package(Qt5Gui REQUIRED)
+find_package(Qt5Network REQUIRED)
+find_package(Qt5OpenGL REQUIRED)
+find_package(Qt5Widgets REQUIRED)
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ add_definitions("-DQT_COMPILING_QIMAGE_COMPAT_CPP")
+ add_definitions("-D_USE_MATH_DEFINES")
+ add_definitions("-Wno-deprecated-declarations")
+ add_definitions("-Wno-inconsistent-missing-override")
+ add_definitions("-Wno-macro-redefined")
+ add_definitions("-Wno-microsoft-exception-spec")
+ add_definitions("-Wno-unknown-argument")
+ add_definitions("-Wno-unknown-warning-option")
+ add_definitions("-Wno-unused-command-line-argument")
+ add_definitions("-Wno-unused-local-typedef")
+ add_definitions("-Wno-unused-private-field")
+endif()
+
+target_sources(
+ mbgl-core
+ PRIVATE
+ ${MBGL_ROOT}/platform/$<IF:$<PLATFORM_ID:Windows>,qt/src/bidi.cpp,default/src/mbgl/text/bidi.cpp>
+ ${MBGL_ROOT}/platform/default/include/mbgl/gfx/headless_backend.hpp
+ ${MBGL_ROOT}/platform/default/include/mbgl/gfx/headless_frontend.hpp
+ ${MBGL_ROOT}/platform/default/include/mbgl/gl/headless_backend.hpp
+ ${MBGL_ROOT}/platform/default/include/mbgl/text/unaccent.hpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gfx/headless_frontend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/gl/headless_backend.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/layermanager/layer_manager.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/asset_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/default_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/file_source_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_request.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/local_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_database.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/offline_download.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/online_file_source.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/storage/sqlite3.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/collator.cpp
+ ${MBGL_ROOT}/platform/default/src/mbgl/text/unaccent.cpp
+ ${MBGL_ROOT}/platform/qt/src/async_task.cpp
+ ${MBGL_ROOT}/platform/qt/src/async_task_impl.hpp
+ ${MBGL_ROOT}/platform/qt/src/format_number.cpp
+ ${MBGL_ROOT}/platform/qt/src/gl_functions.cpp
+ ${MBGL_ROOT}/platform/qt/src/headless_backend_qt.cpp
+ ${MBGL_ROOT}/platform/qt/src/http_file_source.cpp
+ ${MBGL_ROOT}/platform/qt/src/http_file_source.hpp
+ ${MBGL_ROOT}/platform/qt/src/http_request.cpp
+ ${MBGL_ROOT}/platform/qt/src/http_request.hpp
+ ${MBGL_ROOT}/platform/qt/src/local_glyph_rasterizer.cpp
+ ${MBGL_ROOT}/platform/qt/src/qt_image.cpp
+ ${MBGL_ROOT}/platform/qt/src/qt_logging.cpp
+ ${MBGL_ROOT}/platform/qt/src/run_loop.cpp
+ ${MBGL_ROOT}/platform/qt/src/run_loop_impl.hpp
+ ${MBGL_ROOT}/platform/qt/src/string_stdlib.cpp
+ ${MBGL_ROOT}/platform/qt/src/thread.cpp
+ ${MBGL_ROOT}/platform/qt/src/thread_local.cpp
+ ${MBGL_ROOT}/platform/qt/src/timer.cpp
+ ${MBGL_ROOT}/platform/qt/src/timer_impl.hpp
+ ${MBGL_ROOT}/platform/qt/src/utf.cpp
+)
+
+target_compile_definitions(
+ mbgl-core
+ PRIVATE QT_IMAGE_DECODERS
+ PUBLIC __QT__ MBGL_USE_GLES2
+)
+
+target_include_directories(
+ mbgl-core
+ PRIVATE ${MBGL_ROOT}/platform/default/include
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake)
+include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake)
+
+target_link_libraries(
+ mbgl-core
+ PRIVATE
+ $<$<NOT:$<PLATFORM_ID:Windows>>:z>
+ $<$<NOT:$<PLATFORM_ID:Windows>>:mbgl-vendor-icu>
+ Qt5::Core
+ Qt5::Gui
+ Qt5::Network
+ Qt5::OpenGL
+ mbgl-vendor-nunicode
+ mbgl-vendor-sqlite
+)
+
+add_library(
+ qmapboxgl SHARED
+ ${MBGL_ROOT}/platform/qt/include/qmapbox.hpp
+ ${MBGL_ROOT}/platform/qt/include/qmapboxgl.hpp
+ ${MBGL_ROOT}/platform/qt/src/qmapbox.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_map_observer.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_map_observer.hpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_map_renderer.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_map_renderer.hpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_p.hpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_renderer_backend.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_renderer_backend.hpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_scheduler.cpp
+ ${MBGL_ROOT}/platform/qt/src/qmapboxgl_scheduler.hpp
+ ${MBGL_ROOT}/platform/qt/src/qt_conversion.hpp
+ ${MBGL_ROOT}/platform/qt/src/qt_geojson.cpp
+ ${MBGL_ROOT}/platform/qt/src/qt_geojson.hpp
+)
+
+# FIXME: Because of rapidjson conversion
+target_include_directories(
+ qmapboxgl
+ PRIVATE ${MBGL_ROOT}/src
+)
+
+target_include_directories(
+ qmapboxgl
+ PUBLIC ${MBGL_ROOT}/platform/qt/include
+)
+
+target_compile_definitions(
+ qmapboxgl
+ PRIVATE QT_BUILD_MAPBOXGL_LIB
+)
+
+target_link_libraries(
+ qmapboxgl
+ Qt5::Core
+ Qt5::Gui
+ mbgl-core
+)
+
+add_executable(
+ mbgl-qt
+ ${MBGL_ROOT}/platform/qt/app/main.cpp
+ ${MBGL_ROOT}/platform/qt/app/mapwindow.cpp
+ ${MBGL_ROOT}/platform/qt/app/mapwindow.hpp
+ ${MBGL_ROOT}/platform/qt/resources/common.qrc
+)
+
+# Qt public API should keep compatibility with old compilers for legacy systems
+set_property(TARGET mbgl-qt PROPERTY CXX_STANDARD 98)
+
+target_link_libraries(
+ mbgl-qt
+ PRIVATE Qt5::Widgets Qt5::Gui qmapboxgl
+)
+
+add_executable(
+ mbgl-test-runner
+ ${MBGL_ROOT}/platform/qt/test/main.cpp
+)
+
+target_compile_definitions(
+ mbgl-test-runner
+ PRIVATE WORK_DIRECTORY=${MBGL_ROOT}
+)
+
+target_link_libraries(
+ mbgl-test-runner
+ PRIVATE
+ Qt5::Gui
+ Qt5::OpenGL
+ mbgl-test
+ pthread
+)
+
+find_program(MBGL_QDOC NAMES qdoc)
+
+if(MBGL_QDOC)
+ add_custom_target(mbgl-qt-docs)
+
+ add_custom_command(
+ TARGET mbgl-qt-docs PRE_BUILD
+ COMMAND
+ ${MBGL_QDOC}
+ ${MBGL_ROOT}/platform/qt/config.qdocconf
+ -outputdir
+ ${CMAKE_BINARY_DIR}/docs
+ )
+endif()
+
+add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${MBGL_ROOT})
diff --git a/next/render-test/CMakeLists.txt b/next/render-test/CMakeLists.txt
new file mode 100644
index 0000000000..6cab3fed52
--- /dev/null
+++ b/next/render-test/CMakeLists.txt
@@ -0,0 +1,50 @@
+add_executable(
+ mbgl-render-test
+ ${MBGL_ROOT}/render-test/allocation_index.cpp
+ ${MBGL_ROOT}/render-test/allocation_index.hpp
+ ${MBGL_ROOT}/render-test/filesystem.hpp
+ ${MBGL_ROOT}/render-test/main.cpp
+ ${MBGL_ROOT}/render-test/metadata.hpp
+ ${MBGL_ROOT}/render-test/parser.cpp
+ ${MBGL_ROOT}/render-test/parser.hpp
+ ${MBGL_ROOT}/render-test/runner.cpp
+ ${MBGL_ROOT}/render-test/runner.hpp
+)
+
+target_compile_definitions(
+ mbgl-render-test
+ PRIVATE TEST_RUNNER_ROOT_PATH="${MBGL_ROOT}"
+)
+
+# FIXME: Should not use core private interface
+target_include_directories(
+ mbgl-render-test
+ PRIVATE ${MBGL_ROOT}/src
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/boost.cmake)
+
+target_link_libraries(
+ mbgl-render-test
+ PRIVATE
+ Mapbox::Base::Extras::args
+ Mapbox::Base::Extras::filesystem
+ Mapbox::Base::pixelmatch-cpp
+ mbgl-core
+ mbgl-vendor-boost
+)
+
+set_property(TARGET mbgl-render-test PROPERTY FOLDER Executables)
+
+string(RANDOM LENGTH 5 ALPHABET 0123456789 MBGL_RENDER_TEST_SEED)
+
+add_test(
+ NAME mbgl-render-test
+ COMMAND
+ mbgl-render-test
+ --recycle-map
+ --shuffle
+ --seed
+ ${MBGL_RENDER_TEST_SEED}
+ WORKING_DIRECTORY ${MBGL_ROOT}
+)
diff --git a/next/test/CMakeLists.txt b/next/test/CMakeLists.txt
new file mode 100644
index 0000000000..586e2bbdaa
--- /dev/null
+++ b/next/test/CMakeLists.txt
@@ -0,0 +1,167 @@
+add_library(
+ mbgl-test SHARED EXCLUDE_FROM_ALL
+ ${MBGL_ROOT}/test/actor/actor.test.cpp
+ ${MBGL_ROOT}/test/actor/actor_ref.test.cpp
+ ${MBGL_ROOT}/test/algorithm/update_renderables.test.cpp
+ ${MBGL_ROOT}/test/algorithm/update_tile_masks.test.cpp
+ ${MBGL_ROOT}/test/api/annotations.test.cpp
+ ${MBGL_ROOT}/test/api/api_misuse.test.cpp
+ ${MBGL_ROOT}/test/api/custom_geometry_source.test.cpp
+ ${MBGL_ROOT}/test/api/custom_layer.test.cpp
+ ${MBGL_ROOT}/test/api/query.test.cpp
+ ${MBGL_ROOT}/test/api/recycle_map.cpp
+ ${MBGL_ROOT}/test/geometry/dem_data.test.cpp
+ ${MBGL_ROOT}/test/geometry/line_atlas.test.cpp
+ ${MBGL_ROOT}/test/gl/bucket.test.cpp
+ ${MBGL_ROOT}/test/gl/context.test.cpp
+ ${MBGL_ROOT}/test/gl/gl_functions.test.cpp
+ ${MBGL_ROOT}/test/gl/object.test.cpp
+ ${MBGL_ROOT}/test/map/map.test.cpp
+ ${MBGL_ROOT}/test/map/prefetch.test.cpp
+ ${MBGL_ROOT}/test/map/transform.test.cpp
+ ${MBGL_ROOT}/test/math/clamp.test.cpp
+ ${MBGL_ROOT}/test/math/minmax.test.cpp
+ ${MBGL_ROOT}/test/math/wrap.test.cpp
+ ${MBGL_ROOT}/test/programs/symbol_program.test.cpp
+ ${MBGL_ROOT}/test/renderer/backend_scope.test.cpp
+ ${MBGL_ROOT}/test/renderer/image_manager.test.cpp
+ ${MBGL_ROOT}/test/renderer/pattern_atlas.test.cpp
+ ${MBGL_ROOT}/test/sprite/sprite_loader.test.cpp
+ ${MBGL_ROOT}/test/sprite/sprite_parser.test.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/fixture_log_observer.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/getrss.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/sqlite3_test_fs.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/stub_file_source.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/test.cpp
+ ${MBGL_ROOT}/test/src/mbgl/test/util.cpp
+ ${MBGL_ROOT}/test/storage/asset_file_source.test.cpp
+ ${MBGL_ROOT}/test/storage/default_file_source.test.cpp
+ ${MBGL_ROOT}/test/storage/headers.test.cpp
+ ${MBGL_ROOT}/test/storage/http_file_source.test.cpp
+ ${MBGL_ROOT}/test/storage/local_file_source.test.cpp
+ ${MBGL_ROOT}/test/storage/offline.test.cpp
+ ${MBGL_ROOT}/test/storage/offline_database.test.cpp
+ ${MBGL_ROOT}/test/storage/offline_download.test.cpp
+ ${MBGL_ROOT}/test/storage/online_file_source.test.cpp
+ ${MBGL_ROOT}/test/storage/resource.test.cpp
+ ${MBGL_ROOT}/test/storage/sqlite.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/conversion_impl.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/function.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/geojson_options.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/layer.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/light.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/property_value.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/stringify.test.cpp
+ ${MBGL_ROOT}/test/style/conversion/tileset.test.cpp
+ ${MBGL_ROOT}/test/style/expression/expression.test.cpp
+ ${MBGL_ROOT}/test/style/expression/util.test.cpp
+ ${MBGL_ROOT}/test/style/filter.test.cpp
+ ${MBGL_ROOT}/test/style/properties.test.cpp
+ ${MBGL_ROOT}/test/style/property_expression.test.cpp
+ ${MBGL_ROOT}/test/style/source.test.cpp
+ ${MBGL_ROOT}/test/style/style.test.cpp
+ ${MBGL_ROOT}/test/style/style_image.test.cpp
+ ${MBGL_ROOT}/test/style/style_layer.test.cpp
+ ${MBGL_ROOT}/test/style/style_parser.test.cpp
+ ${MBGL_ROOT}/test/text/bidi.test.cpp
+ ${MBGL_ROOT}/test/text/cross_tile_symbol_index.test.cpp
+ ${MBGL_ROOT}/test/text/glyph_manager.test.cpp
+ ${MBGL_ROOT}/test/text/glyph_pbf.test.cpp
+ ${MBGL_ROOT}/test/text/language_tag.test.cpp
+ ${MBGL_ROOT}/test/text/local_glyph_rasterizer.test.cpp
+ ${MBGL_ROOT}/test/text/quads.test.cpp
+ ${MBGL_ROOT}/test/text/shaping.test.cpp
+ ${MBGL_ROOT}/test/text/tagged_string.test.cpp
+ ${MBGL_ROOT}/test/tile/custom_geometry_tile.test.cpp
+ ${MBGL_ROOT}/test/tile/geojson_tile.test.cpp
+ ${MBGL_ROOT}/test/tile/geometry_tile_data.test.cpp
+ ${MBGL_ROOT}/test/tile/raster_dem_tile.test.cpp
+ ${MBGL_ROOT}/test/tile/raster_tile.test.cpp
+ ${MBGL_ROOT}/test/tile/tile_coordinate.test.cpp
+ ${MBGL_ROOT}/test/tile/tile_id.test.cpp
+ ${MBGL_ROOT}/test/tile/vector_tile.test.cpp
+ ${MBGL_ROOT}/test/util/async_task.test.cpp
+ ${MBGL_ROOT}/test/util/dtoa.test.cpp
+ ${MBGL_ROOT}/test/util/geo.test.cpp
+ ${MBGL_ROOT}/test/util/grid_index.test.cpp
+ ${MBGL_ROOT}/test/util/http_timeout.test.cpp
+ ${MBGL_ROOT}/test/util/image.test.cpp
+ ${MBGL_ROOT}/test/util/mapbox.test.cpp
+ ${MBGL_ROOT}/test/util/memory.test.cpp
+ ${MBGL_ROOT}/test/util/merge_lines.test.cpp
+ ${MBGL_ROOT}/test/util/number_conversions.test.cpp
+ ${MBGL_ROOT}/test/util/offscreen_texture.test.cpp
+ ${MBGL_ROOT}/test/util/position.test.cpp
+ ${MBGL_ROOT}/test/util/projection.test.cpp
+ ${MBGL_ROOT}/test/util/run_loop.test.cpp
+ ${MBGL_ROOT}/test/util/string.test.cpp
+ ${MBGL_ROOT}/test/util/text_conversions.test.cpp
+ ${MBGL_ROOT}/test/util/thread.test.cpp
+ ${MBGL_ROOT}/test/util/thread_local.test.cpp
+ ${MBGL_ROOT}/test/util/tile_cover.test.cpp
+ ${MBGL_ROOT}/test/util/tile_range.test.cpp
+ ${MBGL_ROOT}/test/util/timer.test.cpp
+ ${MBGL_ROOT}/test/util/token.test.cpp
+ ${MBGL_ROOT}/test/util/url.test.cpp
+)
+
+find_program(MBGL_TEST_NODEJS NAMES nodejs node)
+find_program(MBGL_TEST_NPM NAMES npm)
+
+if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Android OR NOT MBGL_TEST_NODEJS OR NOT MBGL_TEST_NPM)
+ message("Target platform does not support HTTP tests or dependencies not found.")
+
+ set(MBGL_TEST_HAS_TEST_SERVER 0)
+else()
+ set(MBGL_TEST_HAS_TEST_SERVER 1)
+endif()
+
+if(NOT DEFINED ENV{CI})
+ set(MBGL_TEST_BUILD_ON_CI 0)
+else()
+ set(MBGL_TEST_BUILD_ON_CI 1)
+endif()
+
+target_compile_definitions(
+ mbgl-test
+ PRIVATE NODE_EXECUTABLE=${MBGL_TEST_NODEJS} TEST_HAS_SERVER=${MBGL_TEST_HAS_TEST_SERVER} CI_BUILD=${MBGL_TEST_BUILD_ON_CI}
+)
+
+target_include_directories(
+ mbgl-test
+ PRIVATE
+ ${MBGL_ROOT}/platform/default/include
+ ${MBGL_ROOT}/platform/gfx/gl/src
+ ${MBGL_ROOT}/src
+ ${MBGL_ROOT}/test/src
+)
+
+target_include_directories(
+ mbgl-test
+ PUBLIC ${MBGL_ROOT}/include ${MBGL_ROOT}/test/include
+)
+
+include(${PROJECT_SOURCE_DIR}/vendor/googletest.cmake)
+
+# Needed for testing private classes
+get_target_property(MBGL_CORE_PRIVATE_LIBRARIES mbgl-core LINK_LIBRARIES)
+
+target_link_libraries(
+ mbgl-test
+ PRIVATE
+ ${MBGL_CORE_PRIVATE_LIBRARIES}
+ Mapbox::Base::Extras::args
+ Mapbox::Base::pixelmatch-cpp
+ mbgl-core
+)
+
+target_link_libraries(
+ mbgl-test
+ PUBLIC mbgl-vendor-googletest
+)
+
+if(CMAKE_SYSTEM_NAME STREQUAL Android)
+ set_target_properties(mbgl-test PROPERTIES LINK_FLAGS_RELEASE "-fuse-ld=gold -O2 -flto -Wl,--icf=safe")
+endif()
+
+set_property(TARGET mbgl-test PROPERTY FOLDER Core)
diff --git a/next/vendor b/next/vendor
new file mode 120000
index 0000000000..42a408bb6d
--- /dev/null
+++ b/next/vendor
@@ -0,0 +1 @@
+../vendor/ \ No newline at end of file
diff --git a/package.json b/package.json
index 7b30d6a61a..9b11a039cd 100644
--- a/package.json
+++ b/package.json
@@ -20,22 +20,28 @@
},
"devDependencies": {
"@mapbox/flow-remove-types": "^1.3.0-await.upstream.2",
- "@octokit/rest": "^16.0.0",
+ "@mapbox/mvt-fixtures": "3.5.1",
"@octokit/plugin-retry": "^2.2.0",
+ "@octokit/rest": "^16.0.0",
"aws-sdk": "^2.285.1",
"csscolorparser": "~1.0.2",
+ "d3-queue": "3.0.7",
+ "diff": "4.0.1",
"ejs": "^2.5.7",
"esm": "~3.0.84",
"express": "^4.11.1",
"json-stringify-pretty-compact": "^2.0.0",
"jsonwebtoken": "^8.3.0",
"lodash": "^4.16.4",
+ "lodash.template": "4.5.0",
"mapbox-gl-styles": "2.0.2",
"pixelmatch": "^4.0.2",
"pngjs": "^3.4.0",
"pretty-bytes": "^5.1.0",
"request": "^2.88.0",
"semver": "^5.5.0",
+ "shuffle-seed": "1.1.6",
+ "st": "1.2.2",
"tape": "^4.5.1",
"xcode": "^1.0.0"
},
diff --git a/platform/android/CHANGELOG.md b/platform/android/CHANGELOG.md
index a7fd332b65..de85c2e71a 100644
--- a/platform/android/CHANGELOG.md
+++ b/platform/android/CHANGELOG.md
@@ -7,6 +7,14 @@ Mapbox welcomes participation and contributions from everyone. If you'd like to
### Bug fixes
- Fixed constant repainting for the sources with invisible layers, caused by `RenderSource::hasFadingTiles()` returning `true` all the time. [#15600](https://github.com/mapbox/mapbox-gl-native/pull/15600)
- Fixed an issue that caused the state of CompassView not up to date when `UiSettings.setCompassEnabled()` is set to true. [#15606](https://github.com/mapbox/mapbox-gl-native/pull/15606)
+ - Fixed an issue that `maxzoom` in style `Sources` option was ignored when URL resource is provided. It may cause problems such as extra tiles downloading at higher zoom level than `maxzoom`, or problems that wrong setting of `overscaledZ` in `OverscaledTileID` that will be passed to `SymbolLayout`, leading wrong rendering appearance. [#15581](https://github.com/mapbox/mapbox-gl-native/pull/15581)
+ - Fixed an assertion hit caused by possibility of adding a layer to an incompatible source. [#15644](https://github.com/mapbox/mapbox-gl-native/pull/15644)
+
+## 8.3.1 - September 18, 2019
+[Changes](https://github.com/mapbox/mapbox-gl-native/compare/android-v8.3.0...android-v8.3.1) since [Mapbox Maps SDK for Android v8.3.0](https://github.com/mapbox/mapbox-gl-native/releases/tag/android-v8.3.0):
+
+### Bug fixes
+ - Updated earcut.hpp submodule file [#15660](https://github.com/mapbox/mapbox-gl-native/pull/15660)
## 8.4.0-alpha.2 - September 11, 2019
[Changes](https://github.com/mapbox/mapbox-gl-native/compare/android-v8.4.0-alpha.1...android-v8.4.0-alpha.2) since [Mapbox Maps SDK for Android v8.4.0-alpha.1](https://github.com/mapbox/mapbox-gl-native/releases/tag/android-v8.4.0-alpha.1):
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
index 46de3673e4..8b014b0e9c 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
@@ -726,6 +726,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the zoom change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the zoom as a camera change argument.
+ * </p>
*
* @param zoomLevel The desired zoom level.
* @param animationDuration The zoom animation duration.
@@ -741,6 +745,10 @@ public final class LocationComponent {
"LocationComponent#zoomWhileTracking method can only be used",
" when a camera mode other than CameraMode#NONE is engaged."));
return;
+ } else if (locationCameraController.isTransitioning()) {
+ Logger.e(TAG,
+ "LocationComponent#zoomWhileTracking method call is ignored because the camera mode is transitioning");
+ return;
}
locationAnimatorCoordinator.feedNewZoomLevel(zoomLevel, mapboxMap.getCameraPosition(), animationDuration, callback);
}
@@ -751,6 +759,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the zoom change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the zoom as a camera change argument.
+ * </p>
*
* @param zoomLevel The desired zoom level.
* @param animationDuration The zoom animation duration.
@@ -766,6 +778,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the zoom change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the zoom as a camera change argument.
+ * </p>
*
* @param zoomLevel The desired zoom level.
*/
@@ -788,6 +804,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the tilt change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the tilt as a camera change argument.
+ * </p>
*
* @param tilt The desired camera tilt.
* @param animationDuration The tilt animation duration.
@@ -803,6 +823,10 @@ public final class LocationComponent {
"LocationComponent#tiltWhileTracking method can only be used",
" when a camera mode other than CameraMode#NONE is engaged."));
return;
+ } else if (locationCameraController.isTransitioning()) {
+ Logger.e(TAG,
+ "LocationComponent#tiltWhileTracking method call is ignored because the camera mode is transitioning");
+ return;
}
locationAnimatorCoordinator.feedNewTilt(tilt, mapboxMap.getCameraPosition(), animationDuration, callback);
}
@@ -813,6 +837,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the tilt change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the tilt as a camera change argument.
+ * </p>
*
* @param tilt The desired camera tilt.
* @param animationDuration The tilt animation duration.
@@ -828,6 +856,10 @@ public final class LocationComponent {
* If you are not using any of {@link CameraMode} modes,
* use one of {@link MapboxMap#moveCamera(CameraUpdate)},
* {@link MapboxMap#easeCamera(CameraUpdate)} or {@link MapboxMap#animateCamera(CameraUpdate)} instead.
+ * <p>
+ * If the camera is transitioning when the tilt change is requested, the call is going to be ignored.
+ * Use {@link CameraTransitionListener} to chain the animations, or provide the tilt as a camera change argument.
+ * </p>
*
* @param tilt The desired camera tilt.
*/
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java
index 1e0069c25f..990bd32262 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/snapshotter/MapSnapshotter.java
@@ -235,7 +235,7 @@ public class MapSnapshotter {
*/
@NonNull
public Options withApiBaseUri(String apiBaseUri) {
- this.apiBaseUrl = apiBaseUrl;
+ this.apiBaseUrl = apiBaseUri;
return this;
}
diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt
index fb113502ee..51c9e1c100 100644
--- a/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt
+++ b/platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/location/LocationComponentTest.kt
@@ -1289,6 +1289,36 @@ class LocationComponentTest : EspressoTest() {
}
@Test
+ fun animators_dontZoomWhileTransitioning() {
+ val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
+ override fun onLocationComponentAction(
+ component: LocationComponent,
+ mapboxMap: MapboxMap,
+ style: Style,
+ uiController: UiController,
+ context: Context
+ ) {
+ component.activateLocationComponent(LocationComponentActivationOptions
+ .builder(context, style)
+ .useDefaultLocationEngine(false)
+ .build())
+ component.isLocationComponentEnabled = true
+ component.forceLocationUpdate(location)
+
+ val zoom = mapboxMap.cameraPosition.zoom
+ component.setCameraMode(CameraMode.TRACKING_GPS, 500L, null, null, null, null)
+ component.zoomWhileTracking(16.0, 1000)
+ uiController.loopMainThreadForAtLeast(1000)
+ TestingAsyncUtils.waitForLayer(uiController, mapView)
+
+ assertEquals(zoom, mapboxMap.cameraPosition.zoom, 0.0001)
+ }
+ }
+
+ executeComponentTest(componentAction)
+ }
+
+ @Test
@Ignore
fun animators_cancelZoomWhileTracking() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
@@ -1434,6 +1464,36 @@ class LocationComponentTest : EspressoTest() {
}
@Test
+ fun animators_dontTiltWhileTransitioning() {
+ val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
+ override fun onLocationComponentAction(
+ component: LocationComponent,
+ mapboxMap: MapboxMap,
+ style: Style,
+ uiController: UiController,
+ context: Context
+ ) {
+ component.activateLocationComponent(LocationComponentActivationOptions
+ .builder(context, style)
+ .useDefaultLocationEngine(false)
+ .build())
+ component.isLocationComponentEnabled = true
+ component.forceLocationUpdate(location)
+
+ val tilt = mapboxMap.cameraPosition.tilt
+ component.setCameraMode(CameraMode.TRACKING_GPS, 500L, null, null, null, null)
+ component.tiltWhileTracking(30.0, 1000)
+ uiController.loopMainThreadForAtLeast(1000)
+ TestingAsyncUtils.waitForLayer(uiController, mapView)
+
+ assertEquals(tilt, mapboxMap.cameraPosition.tilt, 0.0001)
+ }
+ }
+
+ executeComponentTest(componentAction)
+ }
+
+ @Test
@Ignore
fun animators_cancelTiltWhileTracking() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
diff --git a/platform/android/src/jni.hpp b/platform/android/src/jni.hpp
index cb519f911d..9bfe2ce5b7 100644
--- a/platform/android/src/jni.hpp
+++ b/platform/android/src/jni.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include <mbgl/util/util.hpp>
+
#include <string>
#include <jni/jni.hpp>
diff --git a/platform/android/src/jni_native.hpp b/platform/android/src/jni_native.hpp
index a4c89d3036..1cc9a7e81b 100644
--- a/platform/android/src/jni_native.hpp
+++ b/platform/android/src/jni_native.hpp
@@ -1,11 +1,13 @@
#pragma once
+#include <mbgl/util/util.hpp>
+
#include "jni.hpp"
namespace mbgl {
namespace android {
-void registerNatives(JavaVM* vm);
+MBGL_EXPORT void registerNatives(JavaVM* vm);
} // namespace android
} // namespace mbgl
diff --git a/platform/android/src/test/runtime.cpp b/platform/android/src/test/runtime.cpp
index 9cf79c501c..1f8f16da3c 100644
--- a/platform/android/src/test/runtime.cpp
+++ b/platform/android/src/test/runtime.cpp
@@ -1,5 +1,6 @@
#include "runtime.hpp"
#include "../jni.hpp"
+#include "../jni_native.hpp"
#include <cassert>
#include <dlfcn.h>
diff --git a/platform/darwin/src/MGLMapSnapshotter.h b/platform/darwin/src/MGLMapSnapshotter.h
index 0f20cf1bb2..33febe0d0c 100644
--- a/platform/darwin/src/MGLMapSnapshotter.h
+++ b/platform/darwin/src/MGLMapSnapshotter.h
@@ -228,7 +228,6 @@ MGL_EXPORT
Starts the snapshot creation and executes the specified blocks with the result
on the specified queue. Use this option if you want to add custom drawing on top of the
resulting `MGLMapSnapShot`.
- @param queue The queue to handle the result on.
@param overlayHandler The block to handle manipulation of the `MGLMapSnapshotter`'s `CGContext`.
@param completionHandler The block to handle the result in.
*/
diff --git a/platform/darwin/src/MGLOfflinePack.mm b/platform/darwin/src/MGLOfflinePack.mm
index 0f2e8180fa..5f4ae9c838 100644
--- a/platform/darwin/src/MGLOfflinePack.mm
+++ b/platform/darwin/src/MGLOfflinePack.mm
@@ -135,10 +135,15 @@ private:
- (void)invalidate {
MGLLogInfo(@"Invalidating pack.");
MGLAssert(_state != MGLOfflinePackStateInvalid, @"Cannot invalidate an already invalid offline pack.");
+ MGLAssert(self.mbglOfflineRegion, @"Should have a valid region");
- self.state = MGLOfflinePackStateInvalid;
- _mbglFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr);
- self.mbglOfflineRegion = nil;
+ @synchronized (self) {
+ self.state = MGLOfflinePackStateInvalid;
+ if (self.mbglOfflineRegion) {
+ _mbglFileSource->setOfflineRegionObserver(*self.mbglOfflineRegion, nullptr);
+ }
+ self.mbglOfflineRegion = nil;
+ }
}
- (void)setState:(MGLOfflinePackState)state {
diff --git a/platform/darwin/src/MGLOfflineStorage.mm b/platform/darwin/src/MGLOfflineStorage.mm
index f6eebb6ca8..95fcebc42b 100644
--- a/platform/darwin/src/MGLOfflineStorage.mm
+++ b/platform/darwin/src/MGLOfflineStorage.mm
@@ -432,11 +432,15 @@ const MGLExceptionName MGLUnsupportedRegionTypeException = @"MGLUnsupportedRegio
- (void)_removePack:(MGLOfflinePack *)pack withCompletionHandler:(MGLOfflinePackRemovalCompletionHandler)completion {
mbgl::OfflineRegion *mbglOfflineRegion = pack.mbglOfflineRegion;
+
[pack invalidate];
+
if (!mbglOfflineRegion) {
+ MGLAssert(pack.state == MGLOfflinePackStateInvalid, @"State should be invalid");
completion(nil);
return;
}
+
_mbglFileSource->deleteOfflineRegion(std::move(*mbglOfflineRegion), [&, completion](std::exception_ptr exception) {
NSError *error;
if (exception) {
diff --git a/platform/darwin/src/MGLRasterDEMSource.mm b/platform/darwin/src/MGLRasterDEMSource.mm
index 27614b9ef4..753499ff94 100644
--- a/platform/darwin/src/MGLRasterDEMSource.mm
+++ b/platform/darwin/src/MGLRasterDEMSource.mm
@@ -7,11 +7,10 @@
@implementation MGLRasterDEMSource
-- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL tileSize:(CGFloat)tileSize {
- NSString *configurationURLString = configurationURL.mgl_URLByStandardizingScheme.absoluteString;
- return std::make_unique<mbgl::style::RasterDEMSource>(identifier.UTF8String,
- configurationURLString.UTF8String,
- uint16_t(round(tileSize)));
+- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier urlOrTileset:(mbgl::variant<std::string, mbgl::Tileset>)urlOrTileset tileSize:(uint16_t)tileSize {
+ auto source = std::make_unique<mbgl::style::RasterDEMSource>(identifier.UTF8String,
+ urlOrTileset,
+ tileSize);
+ return source;
}
-
@end
diff --git a/platform/darwin/src/MGLRasterTileSource.mm b/platform/darwin/src/MGLRasterTileSource.mm
index e89367711e..b31cee296f 100644
--- a/platform/darwin/src/MGLRasterTileSource.mm
+++ b/platform/darwin/src/MGLRasterTileSource.mm
@@ -33,15 +33,16 @@ static const CGFloat MGLRasterTileSourceRetinaTileSize = 512;
}
- (instancetype)initWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL tileSize:(CGFloat)tileSize {
- auto source = [self pendingSourceWithIdentifier:identifier configurationURL:configurationURL tileSize:tileSize];
+ NSString *configurationURLString = configurationURL.mgl_URLByStandardizingScheme.absoluteString;
+ auto source = [self pendingSourceWithIdentifier:identifier urlOrTileset:configurationURLString.UTF8String tileSize:uint16_t(round(tileSize))];
return self = [super initWithPendingSource:std::move(source)];
}
-- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL tileSize:(CGFloat)tileSize {
- NSString *configurationURLString = configurationURL.mgl_URLByStandardizingScheme.absoluteString;
- return std::make_unique<mbgl::style::RasterSource>(identifier.UTF8String,
- configurationURLString.UTF8String,
- uint16_t(round(tileSize)));
+- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier urlOrTileset:(mbgl::variant<std::string, mbgl::Tileset>)urlOrTileset tileSize:(uint16_t)tileSize {
+ auto source = std::make_unique<mbgl::style::RasterSource>(identifier.UTF8String,
+ urlOrTileset,
+ tileSize);
+ return source;
}
- (instancetype)initWithIdentifier:(NSString *)identifier tileURLTemplates:(NSArray<NSString *> *)tileURLTemplates options:(nullable NSDictionary<MGLTileSourceOption, id> *)options {
@@ -56,7 +57,7 @@ static const CGFloat MGLRasterTileSourceRetinaTileSize = 512;
tileSize = static_cast<uint16_t>(round(tileSizeNumber.doubleValue));
}
- auto source = std::make_unique<mbgl::style::RasterSource>(identifier.UTF8String, tileSet, tileSize);
+ auto source = [self pendingSourceWithIdentifier:identifier urlOrTileset:tileSet tileSize:tileSize];
return self = [super initWithPendingSource:std::move(source)];
}
diff --git a/platform/darwin/src/MGLRasterTileSource_Private.h b/platform/darwin/src/MGLRasterTileSource_Private.h
index 8502b811e2..55f342c7ff 100644
--- a/platform/darwin/src/MGLRasterTileSource_Private.h
+++ b/platform/darwin/src/MGLRasterTileSource_Private.h
@@ -1,8 +1,10 @@
#import "MGLRasterTileSource.h"
#include <memory>
+#include <mbgl/util/variant.hpp>
namespace mbgl {
+ class Tileset;
namespace style {
class RasterSource;
}
@@ -14,7 +16,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly, nullable) mbgl::style::RasterSource *rawSource;
-- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL tileSize:(CGFloat)tileSize;
+- (std::unique_ptr<mbgl::style::RasterSource>)pendingSourceWithIdentifier:(NSString *)identifier urlOrTileset:(mbgl::variant<std::string, mbgl::Tileset>)urlOrTileset tileSize:(uint16_t)tileSize;
@end
diff --git a/platform/darwin/src/MGLSDKMetricsManager.m b/platform/darwin/src/MGLSDKMetricsManager.m
index ed48eaf0c1..828fbcd505 100644
--- a/platform/darwin/src/MGLSDKMetricsManager.m
+++ b/platform/darwin/src/MGLSDKMetricsManager.m
@@ -42,12 +42,21 @@ NSString* MGLStringFromMetricType(MGLMetricType metricType) {
[UIScreen mainScreen].bounds.size.height];
NSLocale *currentLocale = [NSLocale currentLocale];
- NSString *country = [currentLocale objectForKey:NSLocaleCountryCode];
+
+ NSString *country = [currentLocale objectForKey:NSLocaleCountryCode] ?: @"unknown";
NSString *device = deviceName();
- const NXArchInfo localArchInfo = *NXGetLocalArchInfo();
- NSString *abi = [NSString stringWithUTF8String:localArchInfo.description];
+ NSString *abi = @"unknown";
+
+ {
+ const NXArchInfo *localArchInfo = NXGetLocalArchInfo();
+
+ if (localArchInfo) {
+ abi = @(localArchInfo->description);
+ NXFreeArchInfo(localArchInfo);
+ }
+ }
NSString *ram = [NSString stringWithFormat:@"%llu", [NSProcessInfo processInfo].physicalMemory];
diff --git a/platform/darwin/test/MGLOfflinePackTests.m b/platform/darwin/test/MGLOfflinePackTests.mm
index a33665ff0a..6b454ee8ca 100644
--- a/platform/darwin/test/MGLOfflinePackTests.m
+++ b/platform/darwin/test/MGLOfflinePackTests.mm
@@ -1,5 +1,7 @@
#import <Mapbox/Mapbox.h>
#import <XCTest/XCTest.h>
+#import "MGLOfflinePack_Private.h"
+#import "MGLTestAssertionHandler.h"
@interface MGLOfflinePackTests : XCTestCase
@@ -18,6 +20,22 @@
XCTAssertThrowsSpecificNamed([invalidPack suspend], NSException, MGLInvalidOfflinePackException, @"Invalid offline pack should raise an exception when being suspended.");
}
+- (void)testInvalidatingAnInvalidPack {
+ MGLOfflinePack *invalidPack = [[MGLOfflinePack alloc] init];
+
+ XCTAssertThrowsSpecificNamed([invalidPack invalidate], NSException, NSInternalInconsistencyException, @"Invalid offline pack should raise an exception when being invalidated.");
+
+ // Now try again, without asserts
+ NSAssertionHandler *oldHandler = [NSAssertionHandler currentHandler];
+ MGLTestAssertionHandler *newHandler = [[MGLTestAssertionHandler alloc] initWithTestCase:self];
+ [[[NSThread currentThread] threadDictionary] setValue:newHandler forKey:NSAssertionHandlerKey];
+
+ // Make sure this doesn't crash without asserts
+ [invalidPack invalidate];
+
+ [[[NSThread currentThread] threadDictionary] setValue:oldHandler forKey:NSAssertionHandlerKey];
+}
+
- (void)testProgressBoxing {
MGLOfflinePackProgress progress = {
.countOfResourcesCompleted = 3,
diff --git a/platform/darwin/test/MGLOfflineStorageTests.mm b/platform/darwin/test/MGLOfflineStorageTests.mm
index ee4bcc2c65..b44d4c51cd 100644
--- a/platform/darwin/test/MGLOfflineStorageTests.mm
+++ b/platform/darwin/test/MGLOfflineStorageTests.mm
@@ -1,15 +1,16 @@
#import <Mapbox/Mapbox.h>
+#import <XCTest/XCTest.h>
#import "MGLOfflineStorage_Private.h"
#import "NSBundle+MGLAdditions.h"
#import "NSDate+MGLAdditions.h"
-
-#import <XCTest/XCTest.h>
+#import "MGLTestAssertionHandler.h"
#include <mbgl/util/run_loop.hpp>
#pragma clang diagnostic ignored "-Wshadow"
+
@interface MGLOfflineStorageTests : XCTestCase <MGLOfflineStorageDelegate>
@end
@@ -34,7 +35,7 @@
- (void)setUp {
[super setUp];
-
+
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
XCTestExpectation *expectation = [self keyValueObservingExpectationForObject:[MGLOfflineStorage sharedOfflineStorage] keyPath:@"packs" handler:^BOOL(id _Nonnull observedObject, NSDictionary * _Nonnull change) {
@@ -310,6 +311,197 @@
XCTAssertEqual([MGLOfflineStorage sharedOfflineStorage].packs.count, countOfPacks - 1, @"Removed pack should have been removed from the canonical collection of packs owned by the shared offline storage object. This assertion can fail if this test is run before -testAAALoadPacks or -testAddPack.");
}
+- (void)addPacks:(NSInteger)count {
+
+ XCTestExpectation *expectation = [self expectationWithDescription:@"added packs"];
+
+ NSURL *styleURL = [MGLStyle lightStyleURLWithVersion:8];
+
+ MGLCoordinateBounds bounds[] = {
+ {{51.5, -0.2}, {51.6, -0.1}}, // London
+ {{60.1, 24.8}, {60.3, 25.1}}, // Helsinki
+ {{38.9, -77.1}, {38.9, -77.0}}, // DC
+ {{37.7, -122.5}, {37.9, -122.4}} // SF
+ };
+
+ int arraySize = sizeof(bounds)/sizeof(bounds[0]);
+
+ count = MIN(count, arraySize);
+
+ dispatch_group_t group = dispatch_group_create();
+
+ for (int i = 0; i < count; i++) {
+
+ dispatch_group_enter(group);
+ MGLTilePyramidOfflineRegion *region = [[MGLTilePyramidOfflineRegion alloc] initWithStyleURL:styleURL bounds:bounds[i] fromZoomLevel:20 toZoomLevel:20];
+ NSData *context = [NSKeyedArchiver archivedDataWithRootObject:@{
+ @"index": @(i)
+ }];
+
+ [[MGLOfflineStorage sharedOfflineStorage] addPackForRegion:region
+ withContext:context
+ completionHandler:^(MGLOfflinePack * _Nullable pack, NSError * _Nullable error) {
+ XCTAssertNotNil(pack);
+ XCTAssertNil(error);
+
+ dispatch_group_leave(group);
+ }];
+ }
+
+ dispatch_group_notify(group, dispatch_get_main_queue(), ^{
+ [expectation fulfill];
+ });
+
+ [self waitForExpectations:@[expectation] timeout:1.0];
+}
+
+- (void)testRemovePackTwiceInSuccession {
+
+ [self addPacks:1];
+
+ NSUInteger countOfPacks = [MGLOfflineStorage sharedOfflineStorage].packs.count;
+
+ MGLOfflinePack *pack = [MGLOfflineStorage sharedOfflineStorage].packs.lastObject;
+ XCTAssertNotNil(pack, @"Added pack should still exist.");
+
+ [self keyValueObservingExpectationForObject:[MGLOfflineStorage sharedOfflineStorage] keyPath:@"packs" handler:^BOOL(id _Nonnull observedObject, NSDictionary * _Nonnull change) {
+ const auto changeKind = static_cast<NSKeyValueChange>([change[NSKeyValueChangeKindKey] unsignedLongValue]);
+ NSIndexSet *indices = change[NSKeyValueChangeIndexesKey];
+ return changeKind == NSKeyValueChangeRemoval && indices.count == 1;
+ }];
+
+ XCTestExpectation *completionHandlerExpectation = [self expectationWithDescription:@"remove pack completion handler"];
+
+ [[MGLOfflineStorage sharedOfflineStorage] removePack:pack withCompletionHandler:nil];
+
+ NSAssertionHandler *oldHandler = [NSAssertionHandler currentHandler];
+ MGLTestAssertionHandler *newHandler = [[MGLTestAssertionHandler alloc] initWithTestCase:self];
+
+ [[[NSThread currentThread] threadDictionary] setValue:newHandler forKey:NSAssertionHandlerKey];
+
+ [[MGLOfflineStorage sharedOfflineStorage] removePack:pack withCompletionHandler:^(NSError * _Nullable error) {
+ XCTAssertEqual(pack.state, MGLOfflinePackStateInvalid, @"Removed pack should be invalid in the completion handler.");
+ [completionHandlerExpectation fulfill];
+ }];
+
+ [self waitForExpectationsWithTimeout:5 handler:nil];
+
+ [[[NSThread currentThread] threadDictionary] setValue:oldHandler forKey:NSAssertionHandlerKey];
+
+ XCTAssertEqual(pack.state, MGLOfflinePackStateInvalid, @"Removed pack should have been invalidated synchronously.");
+
+ XCTAssertEqual([MGLOfflineStorage sharedOfflineStorage].packs.count, countOfPacks - 1, @"Removed pack should have been removed from the canonical collection of packs owned by the shared offline storage object. This assertion can fail if this test is run before -testAAALoadPacks or -testAddPack.");
+
+ NSLog(@"Test `%@` complete", NSStringFromSelector(_cmd));
+}
+
+- (void)test15536RemovePacksWhileReloading {
+
+ // This test triggers
+ //
+ // throw std::runtime_error("Malformed offline region definition");
+ //
+ // in offline.cpp
+ //
+ // Reloading packs, while trying to remove them is currently problematic.
+
+ [self addPacks:4];
+
+ NSInteger countOfPacks = [MGLOfflineStorage sharedOfflineStorage].packs.count;
+ XCTAssert(countOfPacks > 0);
+
+ // Now delete packs one by one
+ XCTestExpectation *expectation = [self expectationWithDescription:@"All packs removed"];
+ expectation.expectedFulfillmentCount = countOfPacks;
+
+ MGLOfflineStorage *storage = [MGLOfflineStorage sharedOfflineStorage];
+ NSArray *packs = [storage.packs copy];
+
+ // Simulate what happens the first time sharedOfflineStorage is accessed
+ [storage reloadPacks];
+
+ NSArray *validPacks = [packs filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
+ MGLOfflinePack *pack = (MGLOfflinePack*)evaluatedObject;
+ return pack.state != MGLOfflinePackStateInvalid;
+ }]];
+
+ NSAssertionHandler *oldHandler = [NSAssertionHandler currentHandler];
+ MGLTestAssertionHandler *newHandler = [[MGLTestAssertionHandler alloc] initWithTestCase:self];
+
+ [[[NSThread currentThread] threadDictionary] setValue:newHandler forKey:NSAssertionHandlerKey];
+
+ for (MGLOfflinePack *pack in validPacks) {
+ [storage removePack:pack withCompletionHandler:^(NSError * _Nullable error) {
+ [expectation fulfill];
+ }];
+ }
+
+ [[[NSThread currentThread] threadDictionary] setValue:oldHandler forKey:NSAssertionHandlerKey];
+
+ [self waitForExpectations:@[expectation] timeout:10.0];
+
+ // TODO: What should we expect here? All packs removed?
+
+ NSLog(@"Test `%@` complete", NSStringFromSelector(_cmd));
+}
+
+// Test to explore https://github.com/mapbox/mapbox-gl-native/issues/15536
+- (void)test15536RemovePacksOnBackgroundQueueWhileReloading {
+
+ [self addPacks:4];
+
+ NSInteger countOfPacks = [MGLOfflineStorage sharedOfflineStorage].packs.count;
+ XCTAssert(countOfPacks > 0);
+
+ // Now delete packs one by one
+ dispatch_queue_t queue = dispatch_queue_create("com.mapbox.testRemovePacks", DISPATCH_QUEUE_SERIAL);
+
+ XCTestExpectation *expectation = [self expectationWithDescription:@"all packs removed"];
+ expectation.expectedFulfillmentCount = countOfPacks;
+
+ MGLOfflineStorage *storage = [MGLOfflineStorage sharedOfflineStorage];
+
+ // Simulate what happens the first time sharedOfflineStorage is accessed
+ [storage reloadPacks];
+
+// NSArray *packs = [storage.packs copy];
+
+ dispatch_async(queue, ^{
+ NSArray *packs = storage.packs;
+ NSAssertionHandler *oldHandler = [NSAssertionHandler currentHandler];
+ MGLTestAssertionHandler *newHandler = [[MGLTestAssertionHandler alloc] initWithTestCase:self];
+
+ [[[NSThread currentThread] threadDictionary] setValue:newHandler forKey:NSAssertionHandlerKey];
+
+ NSArray *validPacks = [packs filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
+ MGLOfflinePack *pack = (MGLOfflinePack*)evaluatedObject;
+ return pack.state != MGLOfflinePackStateInvalid;
+ }]];
+
+ for (MGLOfflinePack *pack in validPacks) {
+ // NOTE: pack can be invalid, as we have two threads potentially
+ // modifying the same MGLOfflinePack.
+
+ dispatch_group_t group = dispatch_group_create();
+ dispatch_group_enter(group);
+ [storage removePack:pack withCompletionHandler:^(NSError * _Nullable error) {
+ dispatch_group_leave(group);
+ }];
+ dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
+
+ [expectation fulfill];
+ }
+
+ [[[NSThread currentThread] threadDictionary] setValue:oldHandler forKey:NSAssertionHandlerKey];
+ });
+
+ [self waitForExpectations:@[expectation] timeout:60.0];
+
+ // TODO: What should we expect here? All packs removed?
+
+ NSLog(@"Test `%@` complete", NSStringFromSelector(_cmd));
+}
+
- (void)testCountOfBytesCompleted {
XCTAssertGreaterThan([MGLOfflineStorage sharedOfflineStorage].countOfBytesCompleted, 0UL);
}
diff --git a/platform/darwin/test/MGLStyleTests.mm b/platform/darwin/test/MGLStyleTests.mm
index 7aaf70a80a..ec2605646c 100644
--- a/platform/darwin/test/MGLStyleTests.mm
+++ b/platform/darwin/test/MGLStyleTests.mm
@@ -229,23 +229,23 @@
- (void)testRemovingSourceInUse {
// Add a raster tile source
- MGLRasterTileSource *rasterTileSource = [[MGLRasterTileSource alloc] initWithIdentifier:@"some-identifier" tileURLTemplates:@[] options:nil];
- [self.style addSource:rasterTileSource];
+ MGLVectorTileSource *vectorTileSource = [[MGLVectorTileSource alloc] initWithIdentifier:@"some-identifier" tileURLTemplates:@[] options:nil];
+ [self.style addSource:vectorTileSource];
// Add a layer using it
- MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"fillLayer" source:rasterTileSource];
+ MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"fillLayer" source:vectorTileSource];
[self.style addLayer:fillLayer];
// Attempt to remove the raster tile source
NSError *error;
- BOOL result = [self.style removeSource:rasterTileSource error:&error];
+ BOOL result = [self.style removeSource:vectorTileSource error:&error];
XCTAssertFalse(result);
XCTAssertEqualObjects(error.domain, MGLErrorDomain);
XCTAssertEqual(error.code, MGLErrorCodeSourceIsInUseCannotRemove);
// Ensure it is still there
- XCTAssertTrue([[self.style sourceWithIdentifier:rasterTileSource.identifier] isMemberOfClass:[MGLRasterTileSource class]]);
+ XCTAssertTrue([[self.style sourceWithIdentifier:vectorTileSource.identifier] isMemberOfClass:[MGLVectorTileSource class]]);
}
- (void)testLayers {
@@ -311,54 +311,61 @@
}
- (void)testRemovingLayerBeforeAddingSameLayer {
- MGLShapeSource *source = [[MGLShapeSource alloc] initWithIdentifier:@"shape-source-removing-before-adding" shape:nil options:nil];
-
- // Attempting to find a layer with identifier will trigger an exception if the source associated with the layer is not added
- [self.style addSource:source];
-
- MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"fill-layer" source:source];
- [self.style removeLayer:fillLayer];
- [self.style addLayer:fillLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:fillLayer.identifier]);
-
- MGLRasterStyleLayer *rasterLayer = [[MGLRasterStyleLayer alloc] initWithIdentifier:@"raster-layer" source:source];
- [self.style removeLayer:rasterLayer];
- [self.style addLayer:rasterLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:rasterLayer.identifier]);
-
- MGLSymbolStyleLayer *symbolLayer = [[MGLSymbolStyleLayer alloc] initWithIdentifier:@"symbol-layer" source:source];
- [self.style removeLayer:symbolLayer];
- [self.style addLayer:symbolLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:symbolLayer.identifier]);
-
- MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"line-layer" source:source];
- [self.style removeLayer:lineLayer];
- [self.style addLayer:lineLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:lineLayer.identifier]);
-
- MGLCircleStyleLayer *circleLayer = [[MGLCircleStyleLayer alloc] initWithIdentifier:@"circle-layer" source:source];
- [self.style removeLayer:circleLayer];
- [self.style addLayer:circleLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:circleLayer.identifier]);
-
- MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithIdentifier:@"background-layer"];
- [self.style removeLayer:backgroundLayer];
- [self.style addLayer:backgroundLayer];
- XCTAssertNotNil([self.style layerWithIdentifier:backgroundLayer.identifier]);
+ {
+ MGLShapeSource *source = [[MGLShapeSource alloc] initWithIdentifier:@"shape-source-removing-before-adding" shape:nil options:nil];
+
+ // Attempting to find a layer with identifier will trigger an exception if the source associated with the layer is not added
+ [self.style addSource:source];
+
+ MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"fill-layer" source:source];
+ [self.style removeLayer:fillLayer];
+ [self.style addLayer:fillLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:fillLayer.identifier]);
+
+ MGLSymbolStyleLayer *symbolLayer = [[MGLSymbolStyleLayer alloc] initWithIdentifier:@"symbol-layer" source:source];
+ [self.style removeLayer:symbolLayer];
+ [self.style addLayer:symbolLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:symbolLayer.identifier]);
+
+ MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"line-layer" source:source];
+ [self.style removeLayer:lineLayer];
+ [self.style addLayer:lineLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:lineLayer.identifier]);
+
+ MGLCircleStyleLayer *circleLayer = [[MGLCircleStyleLayer alloc] initWithIdentifier:@"circle-layer" source:source];
+ [self.style removeLayer:circleLayer];
+ [self.style addLayer:circleLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:circleLayer.identifier]);
+
+ MGLBackgroundStyleLayer *backgroundLayer = [[MGLBackgroundStyleLayer alloc] initWithIdentifier:@"background-layer"];
+ [self.style removeLayer:backgroundLayer];
+ [self.style addLayer:backgroundLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:backgroundLayer.identifier]);
+ }
+
+ {
+ MGLRasterTileSource *rasterSource = [[MGLRasterTileSource alloc] initWithIdentifier:@"raster-tile-source" tileURLTemplates:@[] options:nil];
+ [self.style addSource:rasterSource];
+
+ MGLRasterStyleLayer *rasterLayer = [[MGLRasterStyleLayer alloc] initWithIdentifier:@"raster-layer" source:rasterSource];
+ [self.style removeLayer:rasterLayer];
+ [self.style addLayer:rasterLayer];
+ XCTAssertNotNil([self.style layerWithIdentifier:rasterLayer.identifier]);
+ }
}
- (void)testAddingLayerOfTypeABeforeRemovingLayerOfTypeBWithSameIdentifier {
MGLShapeSource *source = [[MGLShapeSource alloc] initWithIdentifier:@"shape-source-identifier" shape:nil options:nil];
[self.style addSource:source];
-
+
// Add a fill layer
MGLFillStyleLayer *fillLayer = [[MGLFillStyleLayer alloc] initWithIdentifier:@"some-identifier" source:source];
[self.style addLayer:fillLayer];
-
+
// Attempt to remove a line layer with the same identifier as the fill layer
MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:fillLayer.identifier source:source];
[self.style removeLayer:lineLayer];
-
+
XCTAssertTrue([[self.style layerWithIdentifier:fillLayer.identifier] isMemberOfClass:[MGLFillStyleLayer class]]);
}
@@ -382,10 +389,10 @@
MGLImage *image = [[NSBundle bundleForClass:[self class]] imageForResource:imageName];
#endif
XCTAssertNotNil(image);
-
+
[self.style setImage:image forName:imageName];
MGLImage *styleImage = [self.style imageForName:imageName];
-
+
XCTAssertNotNil(styleImage);
XCTAssertEqual(image.size.width, styleImage.size.width);
XCTAssertEqual(image.size.height, styleImage.size.height);
diff --git a/platform/darwin/test/MGLTestAssertionHandler.h b/platform/darwin/test/MGLTestAssertionHandler.h
new file mode 100644
index 0000000000..f1aa39921e
--- /dev/null
+++ b/platform/darwin/test/MGLTestAssertionHandler.h
@@ -0,0 +1,18 @@
+#import <Foundation/Foundation.h>
+#import <XCTest/XCTest.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+// Use to catch or log assertions that occur in dispatch blocks, timers or
+// other asynchronous operations.
+@interface MGLTestAssertionHandler : NSAssertionHandler
+
+- (instancetype)initWithTestCase:(XCTestCase *)testCase;
+@property (nonatomic, weak) XCTestCase *testCase;
+
+// If YES, use `_XCTPreformattedFailureHandler` to "fail" the test,
+// otherwise log the assert.
+@property (nonatomic) BOOL shouldFail;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/platform/darwin/test/MGLTestAssertionHandler.m b/platform/darwin/test/MGLTestAssertionHandler.m
new file mode 100644
index 0000000000..4b504427b5
--- /dev/null
+++ b/platform/darwin/test/MGLTestAssertionHandler.m
@@ -0,0 +1,77 @@
+#import "MGLTestAssertionHandler.h"
+
+@implementation MGLTestAssertionHandler
+
+- (instancetype)initWithTestCase:(XCTestCase *)testCase {
+ if ((self = [super init])) {
+ _testCase = testCase;
+ }
+ return self;
+}
+
+- (void)handleFailureInMethod:(SEL)selector
+ object:(id)object
+ file:(NSString *)fileName
+ lineNumber:(NSInteger)line
+ description:(NSString *)format, ...
+{
+ va_list args;
+ va_start(args, format);
+ NSString *description = [[NSString alloc] initWithFormat:format arguments:args];
+ va_end(args);
+
+ NSString *condition = [NSString stringWithFormat:
+ @"`[%@ %@]`",
+ object, NSStringFromSelector(selector)
+ ];
+
+ if (self.testCase && self.shouldFail) {
+ _XCTPreformattedFailureHandler(self.testCase,
+ YES,
+ fileName,
+ line,
+ condition,
+ description
+ );
+ }
+ else {
+ NSLog(@"Assertion Failure: %@:%lu: %@ - %@",
+ fileName,
+ line,
+ condition,
+ description);
+ }
+}
+
+- (void)handleFailureInFunction:(NSString *)functionName
+ file:(NSString *)fileName
+ lineNumber:(NSInteger)line
+ description:(NSString *)format, ...
+{
+ va_list args;
+ va_start(args, format);
+ NSString *description = [[NSString alloc] initWithFormat:format arguments:args];
+ va_end(args);
+
+ NSString *condition = [NSString stringWithFormat:
+ @"`%@`",
+ functionName];
+
+ if (self.testCase && self.shouldFail) {
+ _XCTPreformattedFailureHandler(self.testCase,
+ YES,
+ fileName,
+ line,
+ condition,
+ description);
+ }
+ else {
+ NSLog(@"Assertion Failure: %@:%lu: %@ - %@",
+ fileName,
+ line,
+ condition,
+ description);
+ }
+}
+@end
+
diff --git a/platform/default/include/mbgl/storage/offline_database.hpp b/platform/default/include/mbgl/storage/offline_database.hpp
index e19dcfade9..96b867eaa6 100644
--- a/platform/default/include/mbgl/storage/offline_database.hpp
+++ b/platform/default/include/mbgl/storage/offline_database.hpp
@@ -98,6 +98,7 @@ private:
void initialize();
void handleError(const mapbox::sqlite::Exception&, const char* action);
void handleError(const util::IOException&, const char* action);
+ void handleError(const std::runtime_error& ex, const char* action);
void removeExisting();
void removeOldCacheTable();
diff --git a/platform/default/src/mbgl/storage/http_file_source.cpp b/platform/default/src/mbgl/storage/http_file_source.cpp
index 213b53de98..b0390c58fc 100644
--- a/platform/default/src/mbgl/storage/http_file_source.cpp
+++ b/platform/default/src/mbgl/storage/http_file_source.cpp
@@ -13,85 +13,7 @@
#include <curl/curl.h>
-// Dynamically load all cURL functions. Debian-derived systems upgraded the OpenSSL version linked
-// to in https://salsa.debian.org/debian/curl/commit/95c94957bb7e89e36e78b995fed468c42f64d18d
-// They state:
-// Rename libcurl3 to libcurl4, because libcurl exposes an SSL_CTX via
-// CURLOPT_SSL_CTX_FUNCTION, and this object changes incompatibly between
-// openssl 1.0 and openssl 1.1.
-// Since we are not accessing the underlying OpenSSL context, we don't care whether we're linking
-// against libcurl3 or libcurl4; both use the ABI version 4 which hasn't changed since 2006
-// (see https://curl.haxx.se/libcurl/abi.html). In fact, cURL's ABI compatibility is very good as
-// shown on https://abi-laboratory.pro/tracker/timeline/curl/
-// Therefore, we're dynamically loading the cURL symbols we need to avoid linking against versioned
-// symbols.
#include <dlfcn.h>
-
-namespace curl {
-
-#define CURL_FUNCTIONS \
- X(global_init) \
- X(getdate) \
- X(easy_strerror) \
- X(easy_init) \
- X(easy_setopt) \
- X(easy_cleanup) \
- X(easy_getinfo) \
- X(easy_reset) \
- X(multi_init) \
- X(multi_add_handle) \
- X(multi_remove_handle) \
- X(multi_cleanup) \
- X(multi_info_read) \
- X(multi_strerror) \
- X(multi_socket_action) \
- X(multi_setopt) \
- X(share_init) \
- X(share_cleanup) \
- X(slist_append) \
- X(slist_free_all)
-
-#define X(name) static decltype(&curl_ ## name) name = nullptr;
-CURL_FUNCTIONS
-#undef X
-
-static void* handle = nullptr;
-
-static void* load(const char* name) {
- void* symbol = dlsym(handle, name);
- if (const char* error = dlerror()) {
- fprintf(stderr, "Cannot load symbol '%s': %s\n", name, error);
- dlclose(handle);
- handle = nullptr;
- abort();
- }
- return symbol;
-}
-
-__attribute__((constructor))
-static void load() {
- assert(!handle);
- handle = dlopen("libcurl.so.4", RTLD_LAZY | RTLD_LOCAL);
- if (!handle) {
- fprintf(stderr, "Could not open shared library '%s'\n", "libcurl.so.4");
- abort();
- }
-
- #define X(name) name = (decltype(&curl_ ## name))load("curl_" #name);
- CURL_FUNCTIONS
- #undef X
-}
-
-__attribute__((constructor))
-static void unload() {
- if (handle) {
- dlclose(handle);
- }
-}
-
-} // namespace curl
-
-
#include <queue>
#include <map>
#include <cassert>
@@ -100,13 +22,13 @@ static void unload() {
static void handleError(CURLMcode code) {
if (code != CURLM_OK) {
- throw std::runtime_error(std::string("CURL multi error: ") + curl::multi_strerror(code));
+ throw std::runtime_error(std::string("CURL multi error: ") + curl_multi_strerror(code));
}
}
static void handleError(CURLcode code) {
if (code != CURLE_OK) {
- throw std::runtime_error(std::string("CURL easy error: ") + curl::easy_strerror(code));
+ throw std::runtime_error(std::string("CURL easy error: ") + curl_easy_strerror(code));
}
}
@@ -170,29 +92,29 @@ private:
};
HTTPFileSource::Impl::Impl() {
- if (curl::global_init(CURL_GLOBAL_ALL)) {
+ if (curl_global_init(CURL_GLOBAL_ALL)) {
throw std::runtime_error("Could not init cURL");
}
- share = curl::share_init();
+ share = curl_share_init();
- multi = curl::multi_init();
- handleError(curl::multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, handleSocket));
- handleError(curl::multi_setopt(multi, CURLMOPT_SOCKETDATA, this));
- handleError(curl::multi_setopt(multi, CURLMOPT_TIMERFUNCTION, startTimeout));
- handleError(curl::multi_setopt(multi, CURLMOPT_TIMERDATA, this));
+ multi = curl_multi_init();
+ handleError(curl_multi_setopt(multi, CURLMOPT_SOCKETFUNCTION, handleSocket));
+ handleError(curl_multi_setopt(multi, CURLMOPT_SOCKETDATA, this));
+ handleError(curl_multi_setopt(multi, CURLMOPT_TIMERFUNCTION, startTimeout));
+ handleError(curl_multi_setopt(multi, CURLMOPT_TIMERDATA, this));
}
HTTPFileSource::Impl::~Impl() {
while (!handles.empty()) {
- curl::easy_cleanup(handles.front());
+ curl_easy_cleanup(handles.front());
handles.pop();
}
- curl::multi_cleanup(multi);
+ curl_multi_cleanup(multi);
multi = nullptr;
- curl::share_cleanup(share);
+ curl_share_cleanup(share);
share = nullptr;
timeout.stop();
@@ -204,12 +126,12 @@ CURL *HTTPFileSource::Impl::getHandle() {
handles.pop();
return handle;
} else {
- return curl::easy_init();
+ return curl_easy_init();
}
}
void HTTPFileSource::Impl::returnHandle(CURL *handle) {
- curl::easy_reset(handle);
+ curl_easy_reset(handle);
handles.push(handle);
}
@@ -217,11 +139,11 @@ void HTTPFileSource::Impl::checkMultiInfo() {
CURLMsg *message = nullptr;
int pending = 0;
- while ((message = curl::multi_info_read(multi, &pending))) {
+ while ((message = curl_multi_info_read(multi, &pending))) {
switch (message->msg) {
case CURLMSG_DONE: {
HTTPRequest *baton = nullptr;
- curl::easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, (char *)&baton);
+ curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, (char *)&baton);
assert(baton);
baton->handleResult(message->data.result);
} break;
@@ -245,7 +167,7 @@ void HTTPFileSource::Impl::perform(curl_socket_t s, util::RunLoop::Event events)
int running_handles = 0;
- curl::multi_socket_action(multi, s, flags, &running_handles);
+ curl_multi_socket_action(multi, s, flags, &running_handles);
checkMultiInfo();
}
@@ -279,9 +201,9 @@ int HTTPFileSource::Impl::handleSocket(CURL * /* handle */, curl_socket_t s, int
void HTTPFileSource::Impl::onTimeout(Impl *context) {
int running_handles;
- CURLMcode error = curl::multi_socket_action(context->multi, CURL_SOCKET_TIMEOUT, 0, &running_handles);
+ CURLMcode error = curl_multi_socket_action(context->multi, CURL_SOCKET_TIMEOUT, 0, &running_handles);
if (error != CURLM_OK) {
- throw std::runtime_error(std::string("CURL multi error: ") + curl::multi_strerror(error));
+ throw std::runtime_error(std::string("CURL multi error: ") + curl_multi_strerror(error));
}
context->checkMultiInfo();
}
@@ -312,45 +234,45 @@ HTTPRequest::HTTPRequest(HTTPFileSource::Impl* context_, Resource resource_, Fil
// getting a 304 response if possible. This avoids redownloading unchanged data.
if (resource.priorEtag) {
const std::string header = std::string("If-None-Match: ") + *resource.priorEtag;
- headers = curl::slist_append(headers, header.c_str());
+ headers = curl_slist_append(headers, header.c_str());
} else if (resource.priorModified) {
const std::string time =
std::string("If-Modified-Since: ") + util::rfc1123(*resource.priorModified);
- headers = curl::slist_append(headers, time.c_str());
+ headers = curl_slist_append(headers, time.c_str());
}
if (headers) {
- curl::easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
+ curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);
}
- handleError(curl::easy_setopt(handle, CURLOPT_PRIVATE, this));
- handleError(curl::easy_setopt(handle, CURLOPT_ERRORBUFFER, error));
- handleError(curl::easy_setopt(handle, CURLOPT_CAINFO, "ca-bundle.crt"));
- handleError(curl::easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1));
- handleError(curl::easy_setopt(handle, CURLOPT_URL, resource.url.c_str()));
- handleError(curl::easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeCallback));
- handleError(curl::easy_setopt(handle, CURLOPT_WRITEDATA, this));
- handleError(curl::easy_setopt(handle, CURLOPT_HEADERFUNCTION, headerCallback));
- handleError(curl::easy_setopt(handle, CURLOPT_HEADERDATA, this));
+ handleError(curl_easy_setopt(handle, CURLOPT_PRIVATE, this));
+ handleError(curl_easy_setopt(handle, CURLOPT_ERRORBUFFER, error));
+ handleError(curl_easy_setopt(handle, CURLOPT_CAINFO, "ca-bundle.crt"));
+ handleError(curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1));
+ handleError(curl_easy_setopt(handle, CURLOPT_URL, resource.url.c_str()));
+ handleError(curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, writeCallback));
+ handleError(curl_easy_setopt(handle, CURLOPT_WRITEDATA, this));
+ handleError(curl_easy_setopt(handle, CURLOPT_HEADERFUNCTION, headerCallback));
+ handleError(curl_easy_setopt(handle, CURLOPT_HEADERDATA, this));
#if LIBCURL_VERSION_NUM >= ((7) << 16 | (21) << 8 | 6) // Renamed in 7.21.6
- handleError(curl::easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, "gzip, deflate"));
+ handleError(curl_easy_setopt(handle, CURLOPT_ACCEPT_ENCODING, "gzip, deflate"));
#else
- handleError(curl::easy_setopt(handle, CURLOPT_ENCODING, "gzip, deflate"));
+ handleError(curl_easy_setopt(handle, CURLOPT_ENCODING, "gzip, deflate"));
#endif
- handleError(curl::easy_setopt(handle, CURLOPT_USERAGENT, "MapboxGL/1.0"));
- handleError(curl::easy_setopt(handle, CURLOPT_SHARE, context->share));
+ handleError(curl_easy_setopt(handle, CURLOPT_USERAGENT, "MapboxGL/1.0"));
+ handleError(curl_easy_setopt(handle, CURLOPT_SHARE, context->share));
// Start requesting the information.
- handleError(curl::multi_add_handle(context->multi, handle));
+ handleError(curl_multi_add_handle(context->multi, handle));
}
HTTPRequest::~HTTPRequest() {
- handleError(curl::multi_remove_handle(context->multi, handle));
+ handleError(curl_multi_remove_handle(context->multi, handle));
context->returnHandle(handle);
handle = nullptr;
if (headers) {
- curl::slist_free_all(headers);
+ curl_slist_free_all(headers);
headers = nullptr;
}
}
@@ -399,7 +321,7 @@ size_t HTTPRequest::headerCallback(char *const buffer, const size_t size, const
// Always overwrite the modification date; We might already have a value here from the
// Date header, but this one is more accurate.
const std::string value { buffer + begin, length - begin - 2 }; // remove \r\n
- baton->response->modified = Timestamp{ Seconds(curl::getdate(value.c_str(), nullptr)) };
+ baton->response->modified = Timestamp{Seconds(curl_getdate(value.c_str(), nullptr))};
} else if ((begin = headerMatches("etag: ", buffer, length)) != std::string::npos) {
baton->response->etag = std::string(buffer + begin, length - begin - 2); // remove \r\n
} else if ((begin = headerMatches("cache-control: ", buffer, length)) != std::string::npos) {
@@ -409,7 +331,7 @@ size_t HTTPRequest::headerCallback(char *const buffer, const size_t size, const
baton->response->mustRevalidate = cc.mustRevalidate;
} else if ((begin = headerMatches("expires: ", buffer, length)) != std::string::npos) {
const std::string value { buffer + begin, length - begin - 2 }; // remove \r\n
- baton->response->expires = Timestamp{ Seconds(curl::getdate(value.c_str(), nullptr)) };
+ baton->response->expires = Timestamp{Seconds(curl_getdate(value.c_str(), nullptr))};
} else if ((begin = headerMatches("retry-after: ", buffer, length)) != std::string::npos) {
baton->retryAfter = std::string(buffer + begin, length - begin - 2); // remove \r\n
} else if ((begin = headerMatches("x-rate-limit-reset: ", buffer, length)) != std::string::npos) {
@@ -435,18 +357,18 @@ void HTTPRequest::handleResult(CURLcode code) {
case CURLE_COULDNT_CONNECT:
case CURLE_OPERATION_TIMEDOUT:
- response->error = std::make_unique<Error>(
- Error::Reason::Connection, std::string{ curl::easy_strerror(code) } + ": " + error);
+ response->error = std::make_unique<Error>(Error::Reason::Connection,
+ std::string{curl_easy_strerror(code)} + ": " + error);
break;
default:
- response->error = std::make_unique<Error>(
- Error::Reason::Other, std::string{ curl::easy_strerror(code) } + ": " + error);
+ response->error =
+ std::make_unique<Error>(Error::Reason::Other, std::string{curl_easy_strerror(code)} + ": " + error);
break;
}
} else {
long responseCode = 0;
- curl::easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &responseCode);
+ curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &responseCode);
if (responseCode == 200) {
if (data) {
diff --git a/platform/default/src/mbgl/storage/offline_database.cpp b/platform/default/src/mbgl/storage/offline_database.cpp
index 83eea7bcc4..133e1f7992 100644
--- a/platform/default/src/mbgl/storage/offline_database.cpp
+++ b/platform/default/src/mbgl/storage/offline_database.cpp
@@ -124,6 +124,10 @@ void OfflineDatabase::handleError(const util::IOException& ex, const char* actio
Log::Error(Event::Database, ex.code, "Can't %s: %s", action, ex.what());
}
+void OfflineDatabase::handleError(const std::runtime_error& ex, const char* action) {
+ Log::Error(Event::Database, -1, "Can't %s: %s", action, ex.what());
+}
+
void OfflineDatabase::removeExisting() {
Log::Warning(Event::Database, "Removing existing incompatible offline database");
@@ -1059,6 +1063,11 @@ expected<OfflineRegionDefinition, std::exception_ptr> OfflineDatabase::getRegion
} catch (const mapbox::sqlite::Exception& ex) {
handleError(ex, "load region");
return unexpected<std::exception_ptr>(std::current_exception());
+} catch (const std::runtime_error& ex) {
+ // Catch errors from malformed offline region definitions
+ // and skip them (as above).
+ handleError(ex, "load region");
+ return unexpected<std::exception_ptr>(std::current_exception());
}
expected<OfflineRegionStatus, std::exception_ptr> OfflineDatabase::getRegionCompletedStatus(int64_t regionID) try {
diff --git a/platform/default/src/mbgl/util/format_number.cpp b/platform/default/src/mbgl/util/format_number.cpp
index f58d6e100a..d1b51e11a1 100644
--- a/platform/default/src/mbgl/util/format_number.cpp
+++ b/platform/default/src/mbgl/util/format_number.cpp
@@ -24,13 +24,13 @@ std::string formatNumber(double number, const std::string& localeId, const std::
} else {
ustr = icu::number::NumberFormatter::with()
#if U_ICU_VERSION_MAJOR_NUM >= 62
- .precision(icu::number::Precision::minMaxFraction(minFractionDigits, maxFractionDigits))
+ .precision(icu::number::Precision::minMaxFraction(minFractionDigits, maxFractionDigits))
#else
- .rounding(icu::number::Rounder::minMaxFraction(minFractionDigits, maxFractionDigits))
+ .rounding(icu::number::Rounder::minMaxFraction(minFractionDigits, maxFractionDigits))
#endif
- .locale(locale)
- .formatDouble(number, status)
- .toString();
+ .locale(locale)
+ .formatDouble(number, status)
+ .toString();
}
return ustr.toUTF8String(formatted);
}
diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp
index 43c4de9759..c39b2c904a 100644
--- a/platform/glfw/glfw_view.cpp
+++ b/platform/glfw/glfw_view.cpp
@@ -4,22 +4,24 @@
#include "ny_route.hpp"
#include <mbgl/annotation/annotation.hpp>
-#include <mbgl/style/style.hpp>
-#include <mbgl/style/sources/custom_geometry_source.hpp>
+#include <mbgl/gfx/backend.hpp>
+#include <mbgl/gfx/backend_scope.hpp>
+#include <mbgl/map/camera.hpp>
+#include <mbgl/renderer/renderer.hpp>
+#include <mbgl/style/expression/dsl.hpp>
#include <mbgl/style/image.hpp>
-#include <mbgl/style/transition_options.hpp>
#include <mbgl/style/layers/fill_extrusion_layer.hpp>
+#include <mbgl/style/layers/fill_layer.hpp>
#include <mbgl/style/layers/line_layer.hpp>
-#include <mbgl/style/expression/dsl.hpp>
+#include <mbgl/style/sources/custom_geometry_source.hpp>
+#include <mbgl/style/sources/geojson_source.hpp>
+#include <mbgl/style/style.hpp>
+#include <mbgl/style/transition_options.hpp>
+#include <mbgl/util/chrono.hpp>
+#include <mbgl/util/geo.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/util/platform.hpp>
#include <mbgl/util/string.hpp>
-#include <mbgl/util/chrono.hpp>
-#include <mbgl/util/geo.hpp>
-#include <mbgl/renderer/renderer.hpp>
-#include <mbgl/gfx/backend.hpp>
-#include <mbgl/gfx/backend_scope.hpp>
-#include <mbgl/map/camera.hpp>
#include <mapbox/cheap_ruler.hpp>
#include <mapbox/geometry.hpp>
@@ -323,6 +325,52 @@ void GLFWView::onKey(GLFWwindow *window, int key, int /*scancode*/, int action,
case GLFW_KEY_T:
view->toggleCustomSource();
break;
+ case GLFW_KEY_F: {
+ using namespace mbgl;
+ using namespace mbgl::style;
+ using namespace mbgl::style::expression::dsl;
+
+ auto &style = view->map->getStyle();
+ if (!style.getSource("states")) {
+ std::string url = "https://docs.mapbox.com/mapbox-gl-js/assets/us_states.geojson";
+ auto source = std::make_unique<GeoJSONSource>("states");
+ source->setURL(url);
+ style.addSource(std::move(source));
+
+ mbgl::CameraOptions cameraOptions;
+ cameraOptions.center = mbgl::LatLng{42.619626, -103.523181};
+ cameraOptions.zoom = 3;
+ cameraOptions.pitch = 0;
+ cameraOptions.bearing = 0;
+ view->map->jumpTo(cameraOptions);
+ }
+
+ auto layer = style.getLayer("state-fills");
+ if (!layer) {
+ auto fillLayer = std::make_unique<FillLayer>("state-fills", "states");
+ fillLayer->setFillColor(mbgl::Color{0.0, 0.0, 1.0, 0.5});
+ fillLayer->setFillOpacity(PropertyExpression<float>(
+ createExpression(R"(["case", ["boolean", ["feature-state", "hover"], false], 1, 0.5])")));
+ style.addLayer(std::move(fillLayer));
+ } else {
+ layer->setVisibility(layer->getVisibility() == mbgl::style::VisibilityType::Visible
+ ? mbgl::style::VisibilityType::None
+ : mbgl::style::VisibilityType::Visible);
+ }
+
+ layer = style.getLayer("state-borders");
+ if (!layer) {
+ auto borderLayer = std::make_unique<LineLayer>("state-borders", "states");
+ borderLayer->setLineColor(mbgl::Color{0.0, 0.0, 1.0, 1.0});
+ borderLayer->setLineWidth(PropertyExpression<float>(
+ createExpression(R"(["case", ["boolean", ["feature-state", "hover"], false], 2, 1])")));
+ style.addLayer(std::move(borderLayer));
+ } else {
+ layer->setVisibility(layer->getVisibility() == mbgl::style::VisibilityType::Visible
+ ? mbgl::style::VisibilityType::None
+ : mbgl::style::VisibilityType::Visible);
+ }
+ } break;
}
}
@@ -558,6 +606,41 @@ void GLFWView::onMouseMove(GLFWwindow *window, double x, double y) {
}
view->lastX = x;
view->lastY = y;
+
+ auto &style = view->map->getStyle();
+ if (style.getLayer("state-fills")) {
+ auto screenCoordinate = mbgl::ScreenCoordinate{view->lastX, view->lastY};
+ const mbgl::RenderedQueryOptions queryOptions({{{"state-fills"}}, {}});
+ auto result = view->rendererFrontend->getRenderer()->queryRenderedFeatures(screenCoordinate, queryOptions);
+ using namespace mbgl;
+ FeatureState newState;
+
+ if (result.size() > 0) {
+ FeatureIdentifier id = result[0].id;
+ optional<std::string> idStr = featureIDtoString(id);
+
+ if (idStr) {
+ if (view->featureID && (*view->featureID != *idStr)) {
+ newState["hover"] = false;
+ view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState);
+ view->featureID = nullopt;
+ }
+
+ if (!view->featureID) {
+ newState["hover"] = true;
+ view->featureID = featureIDtoString(id);
+ view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState);
+ }
+ }
+ } else {
+ if (view->featureID) {
+ newState["hover"] = false;
+ view->rendererFrontend->getRenderer()->setFeatureState("states", {}, *view->featureID, newState);
+ view->featureID = nullopt;
+ }
+ }
+ view->invalidate();
+ }
}
void GLFWView::onWindowFocus(GLFWwindow *window, int focused) {
diff --git a/platform/glfw/glfw_view.hpp b/platform/glfw/glfw_view.hpp
index 54b89ba2d9..dbe6ceb046 100644
--- a/platform/glfw/glfw_view.hpp
+++ b/platform/glfw/glfw_view.hpp
@@ -1,9 +1,10 @@
#pragma once
#include <mbgl/map/map.hpp>
+#include <mbgl/util/geometry.hpp>
+#include <mbgl/util/optional.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/timer.hpp>
-#include <mbgl/util/geometry.hpp>
struct GLFWwindow;
class GLFWBackend;
@@ -134,4 +135,5 @@ private:
GLFWwindow *window = nullptr;
bool dirty = false;
+ mbgl::optional<std::string> featureID;
};
diff --git a/platform/ios/CHANGELOG.md b/platform/ios/CHANGELOG.md
index 8515fd467f..7698b9e8cd 100644
--- a/platform/ios/CHANGELOG.md
+++ b/platform/ios/CHANGELOG.md
@@ -6,6 +6,8 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
### Styles and rendering
* Added an `-[MGLMapSnapshotter startWithOverlayHandler:completionHandler:]` method to provide the snapshot's current `CGContext` in order to perform custom drawing on `MGLMapSnapShot` objects. ([#15530](https://github.com/mapbox/mapbox-gl-native/pull/15530))
+* Fixed an issue that `maxzoom` in style `Sources` option was ignored when URL resource is provided. It may cause problems such as extra tiles downloading at higher zoom level than `maxzoom`, or problems that wrong setting of `overscaledZ` in `OverscaledTileID` that will be passed to `SymbolLayout`, leading wrong rendering appearance. ([#15581](https://github.com/mapbox/mapbox-gl-native/pull/15581))
+* Fixed an assertion hit caused by possibility of adding a layer to an incompatible source. ([#15644](https://github.com/mapbox/mapbox-gl-native/pull/15644))
### Performance improvements
@@ -17,10 +19,9 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
* Fixed crashes triggered when `MGLSource` and `MGLStyleLayer` objects are accessed after having been invalidated after a style change. ([#15539](https://github.com/mapbox/mapbox-gl-native/pull/15539))
* Fixed a rendering issue of `collisionBox` when `MGLSymbolStyleLayer.textTranslate` or `MGLSymbolStyleLayer.iconTranslate` is enabled. ([#15467](https://github.com/mapbox/mapbox-gl-native/pull/15467))
-* Fixed an issue where the scale bar text would become illegible if iOS 13 dark mode was enabled. ([#15524](https://github.com/mapbox/mapbox-gl-native/pull/15524))
* Enabled use of `MGLSymbolStyleLayer.textOffset` option together with `MGLSymbolStyleLayer.textVariableAnchor` (if `MGLSymbolStyleLayer.textRadialOffset` option is not provided). ([#15542](https://github.com/mapbox/mapbox-gl-native/pull/15542))
-* Fixed an issue with the appearance of the compass text in iOS 13. ([#15547](https://github.com/mapbox/mapbox-gl-native/pull/15547))
* Fixed a bug where the completion block passed to `-[MGLMapView flyToCamera:completionHandler:` (and related methods) wouldn't be called. ([#15473](https://github.com/mapbox/mapbox-gl-native/pull/15473))
+* Fixed a crash when `-[MGLOfflinePack invalidate]` is called on different threads. ([#15582](https://github.com/mapbox/mapbox-gl-native/pull/15582))
### User interaction
@@ -38,6 +39,21 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
* Fixed a bug with annotation view positions after camera transitions. ([#15122](https://github.com/mapbox/mapbox-gl-native/pull/15122/))
* Fixed constant repainting for the sources with invisible layers, caused by `RenderSource::hasFadingTiles()` returning `true` all the time. ([#15600](https://github.com/mapbox/mapbox-gl-native/pull/15600))
+## 5.3.2 - September 18, 2019
+
+* Fixed an issue where `-[MGLMapView visibleFeaturesInRect:]` and `-[MGLShapeSource featuresMatchingPredicate:]` could return incorrect coordinates at zoom levels 20 and higher. ([#15560](https://github.com/mapbox/mapbox-gl-native/pull/15560))
+
+## 5.3.1 - September 18, 2019
+
+### Styles and rendering
+
+* Fixed an issue where connecting coincident holes in a polygon could lead to a race condition. ([#15660](https://github.com/mapbox/mapbox-gl-native/pull/15660))
+
+### Other changes
+
+* Fixed an issue where the scale bar text would become illegible if iOS 13 dark mode was enabled. ([#15524](https://github.com/mapbox/mapbox-gl-native/pull/15524))
+* Fixed an issue with the appearance of the compass text in iOS 13. ([#15547](https://github.com/mapbox/mapbox-gl-native/pull/15547))
+
## 5.3.0 - August 28, 2019
This release changes how offline tile requests are billed — they are now billed on a pay-as-you-go basis and all developers are able raise the offline tile limit for their users. Offline requests were previously exempt from monthly active user (MAU) billing and increasing the offline per-user tile limit to more than 6,000 tiles required the purchase of an enterprise license. By upgrading to this release, you are opting into the changes outlined in [this blog post](https://blog.mapbox.com/offline-maps-for-all-bb0fc51827be) and [#15380](https://github.com/mapbox/mapbox-gl-native/pull/15380).
diff --git a/platform/ios/Integration Tests/MGLStyleLayerIntegrationTests.m b/platform/ios/Integration Tests/MGLStyleLayerIntegrationTests.m
index c018c457b9..f5f2f957d3 100644
--- a/platform/ios/Integration Tests/MGLStyleLayerIntegrationTests.m
+++ b/platform/ios/Integration Tests/MGLStyleLayerIntegrationTests.m
@@ -82,31 +82,31 @@
// Testing generated layers
MGLLineStyleLayer *lineLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"lineLayerID" source:source];
- MGLRasterStyleLayer *rasterLayer = [[MGLRasterStyleLayer alloc] initWithIdentifier:@"rasterLayerID" source:source];
+ MGLCircleStyleLayer *circleLayer = [[MGLCircleStyleLayer alloc] initWithIdentifier:@"circleLayerID" source:source];
[self.mapView.style addSource:source];
[self.mapView.style addLayer:lineLayer];
- [self.mapView.style addLayer:rasterLayer];
+ [self.mapView.style addLayer:circleLayer];
XCTAssertNoThrow(lineLayer.isVisible);
- XCTAssertNoThrow(rasterLayer.isVisible);
+ XCTAssertNoThrow(circleLayer.isVisible);
XCTAssert(![source.description containsString:@"<unknown>"]);
XCTAssert(![lineLayer.description containsString:@"<unknown>"]);
- XCTAssert(![rasterLayer.description containsString:@"<unknown>"]);
+ XCTAssert(![circleLayer.description containsString:@"<unknown>"]);
self.styleLoadingExpectation = nil;
[self.mapView setStyleURL:[[NSBundle bundleForClass:[self class]] URLForResource:@"one-liner" withExtension:@"json"]];
[self waitForMapViewToFinishLoadingStyleWithTimeout:10];
-
+
XCTAssert([source.description containsString:@"<unknown>"]);
XCTAssert([lineLayer.description containsString:@"<unknown>"]);
- XCTAssert([rasterLayer.description containsString:@"<unknown>"]);
+ XCTAssert([circleLayer.description containsString:@"<unknown>"]);
XCTAssertThrowsSpecificNamed(lineLayer.isVisible, NSException, MGLInvalidStyleLayerException, @"Layer should raise an exception if its core peer got invalidated");
- XCTAssertThrowsSpecificNamed(rasterLayer.isVisible, NSException, MGLInvalidStyleLayerException, @"Layer should raise an exception if its core peer got invalidated");
+ XCTAssertThrowsSpecificNamed(circleLayer.isVisible, NSException, MGLInvalidStyleLayerException, @"Layer should raise an exception if its core peer got invalidated");
XCTAssertThrowsSpecificNamed([self.mapView.style removeLayer:lineLayer], NSException, NSInvalidArgumentException, @"Style should raise an exception when attempting to remove an invalid layer (e.g. if its core peer got invalidated)");
- XCTAssertThrowsSpecificNamed([self.mapView.style removeLayer:rasterLayer], NSException, NSInvalidArgumentException, @"Style should raise an exception when attempting to remove an invalid layer (e.g. if its core peer got invalidated)");
+ XCTAssertThrowsSpecificNamed([self.mapView.style removeLayer:circleLayer], NSException, NSInvalidArgumentException, @"Style should raise an exception when attempting to remove an invalid layer (e.g. if its core peer got invalidated)");
}
@end
diff --git a/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterSwiftTests.swift b/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterSwiftTests.swift
index c3400b1fa2..d33a986beb 100644
--- a/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterSwiftTests.swift
+++ b/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterSwiftTests.swift
@@ -56,4 +56,22 @@ class MGLMapSnapshotterSwiftTests: MGLMapViewIntegrationTest {
wait(for: [expectation], timeout: timeout)
}
+
+ func testSnapshotOverlaySwiftErgonomics🔒() {
+ let options = MGLMapSnapshotterSwiftTests.snapshotterOptions(size: mapView.bounds.size)
+ let snapshotter = MGLMapSnapshotter(options: options)
+ let expectation = self.expectation(description: "snapshot")
+ expectation.expectedFulfillmentCount = 2
+
+ snapshotter.start(overlayHandler: { (overlay) in
+ guard let _ = overlay.context.makeImage() else {
+ XCTFail()
+ return
+ }
+ expectation.fulfill()
+ }) { (_, _) in
+ expectation.fulfill()
+ }
+ wait(for: [expectation], timeout: 10)
+ }
}
diff --git a/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterTest.m b/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterTest.m
index 7707896203..19718165b3 100644
--- a/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterTest.m
+++ b/platform/ios/Integration Tests/Snapshotter Tests/MGLMapSnapshotterTest.m
@@ -393,11 +393,7 @@ MGLMapSnapshotter* snapshotterWithCoordinates(CLLocationCoordinate2D coordinates
[self waitForExpectations:@[expectation] timeout:10.0];
}
-- (void)testSnapshotWithOverlayHandlerFailure {
- if (![self validAccessToken]) {
- return;
- }
-
+- (void)testSnapshotWithOverlayHandlerFailure🔒 {
CGSize size = self.mapView.bounds.size;
XCTestExpectation *expectation = [self expectationWithDescription:@"snapshot with overlay fails"];
@@ -408,23 +404,25 @@ MGLMapSnapshotter* snapshotterWithCoordinates(CLLocationCoordinate2D coordinates
MGLMapSnapshotter *snapshotter = snapshotterWithCoordinates(coord, size);
XCTAssertNotNil(snapshotter);
- [snapshotter startWithOverlayHandler:^(MGLMapSnapshotOverlay * _Nullable snapshotOverlay) {
+ [snapshotter startWithOverlayHandler:^(MGLMapSnapshotOverlay *snapshotOverlay) {
+ XCTAssertNotNil(snapshotOverlay);
+
UIGraphicsEndImageContext();
[expectation fulfill];
} completionHandler:^(MGLMapSnapshot * _Nullable snapshot, NSError * _Nullable error) {
XCTAssertNil(snapshot);
XCTAssertNotNil(error);
+ XCTAssertEqualObjects(error.domain, MGLErrorDomain);
+ XCTAssertEqual(error.code, MGLErrorCodeSnapshotFailed);
+ XCTAssertEqualObjects(error.localizedDescription, @"Failed to generate composited snapshot.");
+
[expectation fulfill];
}];
[self waitForExpectations:@[expectation] timeout:10.0];
}
-- (void)testSnapshotWithOverlayHandlerSuccess {
- if (![self validAccessToken]) {
- return;
- }
-
+- (void)testSnapshotWithOverlayHandlerSuccess🔒 {
CGSize size = self.mapView.bounds.size;
CGRect snapshotRect = CGRectMake(0, 0, size.width, size.height);
@@ -435,8 +433,21 @@ MGLMapSnapshotter* snapshotterWithCoordinates(CLLocationCoordinate2D coordinates
MGLMapSnapshotter *snapshotter = snapshotterWithCoordinates(coord, size);
XCTAssertNotNil(snapshotter);
-
- [snapshotter startWithOverlayHandler:^(MGLMapSnapshotOverlay * _Nullable snapshotOverlay) {
+
+ CGFloat scale = snapshotter.options.scale;
+
+ [snapshotter startWithOverlayHandler:^(MGLMapSnapshotOverlay *snapshotOverlay) {
+ XCTAssertNotNil(snapshotOverlay);
+
+ CGFloat width = CGBitmapContextGetWidth(snapshotOverlay.context);
+ CGFloat height = CGBitmapContextGetHeight(snapshotOverlay.context);
+
+ CGRect contextRect = CGContextConvertRectToDeviceSpace(snapshotOverlay.context, CGRectMake(0, 0, 1, 0));
+ CGFloat scaleFromContext = contextRect.size.width;
+ XCTAssertEqual(scale, scaleFromContext);
+ XCTAssertEqual(width, size.width*scale);
+ XCTAssertEqual(height, size.height*scale);
+
CGContextSetFillColorWithColor(snapshotOverlay.context, [UIColor.greenColor CGColor]);
CGContextSetAlpha(snapshotOverlay.context, 0.2);
CGContextAddRect(snapshotOverlay.context, snapshotRect);
diff --git a/platform/ios/app/MBXAnnotationView.h b/platform/ios/app/MBXAnnotationView.h
index 5337ffae57..6bd799673d 100644
--- a/platform/ios/app/MBXAnnotationView.h
+++ b/platform/ios/app/MBXAnnotationView.h
@@ -1,4 +1,4 @@
-#import <Mapbox/Mapbox.h>
+@import Mapbox;
@interface MBXAnnotationView : MGLAnnotationView
@end
diff --git a/platform/ios/app/MBXAppDelegate.m b/platform/ios/app/MBXAppDelegate.m
index 519c70766a..bf62866b8e 100644
--- a/platform/ios/app/MBXAppDelegate.m
+++ b/platform/ios/app/MBXAppDelegate.m
@@ -1,6 +1,7 @@
+@import Mapbox;
+
#import "MBXAppDelegate.h"
#import "MBXViewController.h"
-#import <Mapbox/Mapbox.h>
@interface MBXAppDelegate() <MGLMetricsManagerDelegate>
diff --git a/platform/ios/app/MBXCustomCalloutView.h b/platform/ios/app/MBXCustomCalloutView.h
index 961f2d7f6a..5a7c9c926f 100644
--- a/platform/ios/app/MBXCustomCalloutView.h
+++ b/platform/ios/app/MBXCustomCalloutView.h
@@ -1,5 +1,4 @@
-#import <UIKit/UIKit.h>
-#import <Mapbox/Mapbox.h>
+@import Mapbox;
/**
* Basic custom callout view to demonstrate how to
diff --git a/platform/ios/app/MBXCustomLocationViewController.m b/platform/ios/app/MBXCustomLocationViewController.m
index 0473f8c2ef..c77d990bac 100644
--- a/platform/ios/app/MBXCustomLocationViewController.m
+++ b/platform/ios/app/MBXCustomLocationViewController.m
@@ -1,6 +1,6 @@
-#import "MBXCustomLocationViewController.h"
+@import Mapbox;
-#import <Mapbox/Mapbox.h>
+#import "MBXCustomLocationViewController.h"
@interface MBXCustomLocationManager : NSObject<MGLLocationManager>
@end
diff --git a/platform/ios/app/MBXEmbeddedMapViewController.m b/platform/ios/app/MBXEmbeddedMapViewController.m
index f26a007c15..dacbdb5124 100644
--- a/platform/ios/app/MBXEmbeddedMapViewController.m
+++ b/platform/ios/app/MBXEmbeddedMapViewController.m
@@ -1,5 +1,6 @@
+@import Mapbox;
+
#import "MBXEmbeddedMapViewController.h"
-#import <Mapbox/Mapbox.h>
typedef NS_ENUM(NSInteger, MBXEmbeddedControl) {
MBXEmbeddedControlZoom = 0,
diff --git a/platform/ios/app/MBXOfflinePacksTableViewController.m b/platform/ios/app/MBXOfflinePacksTableViewController.m
index 90497ca939..bc8407a46d 100644
--- a/platform/ios/app/MBXOfflinePacksTableViewController.m
+++ b/platform/ios/app/MBXOfflinePacksTableViewController.m
@@ -1,6 +1,7 @@
+@import Mapbox;
+
#import "MBXOfflinePacksTableViewController.h"
-#import <Mapbox/Mapbox.h>
static NSString * const MBXOfflinePackContextNameKey = @"Name";
diff --git a/platform/ios/app/MBXOrnamentsViewController.m b/platform/ios/app/MBXOrnamentsViewController.m
index 861d5d7678..f451f647e5 100644
--- a/platform/ios/app/MBXOrnamentsViewController.m
+++ b/platform/ios/app/MBXOrnamentsViewController.m
@@ -1,7 +1,7 @@
-#import "MBXOrnamentsViewController.h"
-
@import Mapbox;
+#import "MBXOrnamentsViewController.h"
+
@interface MBXOrnamentsViewController ()<MGLMapViewDelegate>
@property (nonatomic) MGLMapView *mapView;
diff --git a/platform/ios/app/MBXSnapshotsViewController.m b/platform/ios/app/MBXSnapshotsViewController.m
index 95d3251e2e..747ff39248 100644
--- a/platform/ios/app/MBXSnapshotsViewController.m
+++ b/platform/ios/app/MBXSnapshotsViewController.m
@@ -1,6 +1,6 @@
-#import "MBXSnapshotsViewController.h"
+@import Mapbox;
-#import <Mapbox/Mapbox.h>
+#import "MBXSnapshotsViewController.h"
@interface MBXSnapshotsViewController ()
diff --git a/platform/ios/app/MBXState.h b/platform/ios/app/MBXState.h
index 346c31d586..cf68016e98 100644
--- a/platform/ios/app/MBXState.h
+++ b/platform/ios/app/MBXState.h
@@ -1,5 +1,4 @@
-#import <Foundation/Foundation.h>
-#import <Mapbox/Mapbox.h>
+@import Mapbox;
NS_ASSUME_NONNULL_BEGIN
diff --git a/platform/ios/app/MBXStateManager.m b/platform/ios/app/MBXStateManager.m
index 7203ae462d..f9dc771e26 100644
--- a/platform/ios/app/MBXStateManager.m
+++ b/platform/ios/app/MBXStateManager.m
@@ -1,5 +1,4 @@
#import "MBXStateManager.h"
-#import <Mapbox/Mapbox.h>
#import "MBXState.h"
#import "MBXViewController.h"
diff --git a/platform/ios/app/MBXUserLocationAnnotationView.h b/platform/ios/app/MBXUserLocationAnnotationView.h
index 39ed729d2b..a60658dd18 100644
--- a/platform/ios/app/MBXUserLocationAnnotationView.h
+++ b/platform/ios/app/MBXUserLocationAnnotationView.h
@@ -1,4 +1,4 @@
-#import <Mapbox/Mapbox.h>
+@import Mapbox;
@interface MBXUserLocationAnnotationView : MGLUserLocationAnnotationView
diff --git a/platform/ios/app/MBXViewController.m b/platform/ios/app/MBXViewController.m
index 346a182a88..82a68e074a 100644
--- a/platform/ios/app/MBXViewController.m
+++ b/platform/ios/app/MBXViewController.m
@@ -1,3 +1,5 @@
+@import Mapbox;
+
#import "MBXViewController.h"
#import "MBXAppDelegate.h"
@@ -12,8 +14,6 @@
#import "MBXState.h"
#import "MBXFrameTimeGraphView.h"
-
-#import <Mapbox/Mapbox.h>
#import "../src/MGLMapView_Experimental.h"
#import <objc/runtime.h>
@@ -729,7 +729,7 @@ CLLocationCoordinate2D randomWorldCoordinate() {
acrossDistance:100
pitch:60
heading:0];
- __weak typeof(self) weakSelf = self;
+ __weak MBXViewController *weakSelf = self;
[self.mapView setCamera:camera withDuration:0.3 animationTimingFunction:nil completionHandler:^{
[weakSelf.mapView setContentInset:contentInsets animated:YES completionHandler:nil];
}];
diff --git a/platform/ios/benchmark/MBXBenchAppDelegate.m b/platform/ios/benchmark/MBXBenchAppDelegate.m
index 522ebb2dbc..d1a0ddf943 100644
--- a/platform/ios/benchmark/MBXBenchAppDelegate.m
+++ b/platform/ios/benchmark/MBXBenchAppDelegate.m
@@ -1,6 +1,5 @@
#import "MBXBenchAppDelegate.h"
#import "MBXBenchViewController.h"
-#import <Mapbox/Mapbox.h>
@implementation MBXBenchAppDelegate
diff --git a/platform/ios/benchmark/MBXBenchViewController.mm b/platform/ios/benchmark/MBXBenchViewController.mm
index 67d9b5cb6e..901eb07cd1 100644
--- a/platform/ios/benchmark/MBXBenchViewController.mm
+++ b/platform/ios/benchmark/MBXBenchViewController.mm
@@ -1,8 +1,5 @@
#import "MBXBenchViewController.h"
-
#import "MBXBenchAppDelegate.h"
-
-#import <Mapbox/Mapbox.h>
#import "MGLMapView_Private.h"
#include "locations.hpp"
diff --git a/platform/ios/config.cmake b/platform/ios/config.cmake
index e5386e4ae0..7f15355876 100644
--- a/platform/ios/config.cmake
+++ b/platform/ios/config.cmake
@@ -13,7 +13,7 @@ endmacro()
include(cmake/loop-darwin.cmake)
-initialize_ios_target(icu)
+initialize_ios_target(mbgl-vendor-icu)
initialize_ios_target(mbgl-loop-darwin)
diff --git a/platform/ios/core-files.json b/platform/ios/core-files.json
index 93fdfc80b9..67edda9733 100644
--- a/platform/ios/core-files.json
+++ b/platform/ios/core-files.json
@@ -25,8 +25,7 @@
"mbgl/gfx/headless_backend.hpp": "platform/default/include/mbgl/gfx/headless_backend.hpp",
"mbgl/gfx/headless_frontend.hpp": "platform/default/include/mbgl/gfx/headless_frontend.hpp",
"mbgl/gl/headless_backend.hpp": "platform/default/include/mbgl/gl/headless_backend.hpp",
- "mbgl/map/map_snapshotter.hpp": "platform/default/include/mbgl/map/map_snapshotter.hpp",
- "mbgl/util/default_styles.hpp": "platform/default/include/mbgl/util/default_styles.hpp"
+ "mbgl/map/map_snapshotter.hpp": "platform/default/include/mbgl/map/map_snapshotter.hpp"
},
"private_headers": {
"CFHandle.hpp": "platform/darwin/src/CFHandle.hpp"
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj
index 7712c332c4..20001c26a8 100644
--- a/platform/ios/ios.xcodeproj/project.pbxproj
+++ b/platform/ios/ios.xcodeproj/project.pbxproj
@@ -276,8 +276,8 @@
558DE7A11E5615E400C7916D /* MGLFoundation_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 558DE79E1E5615E400C7916D /* MGLFoundation_Private.h */; };
558DE7A21E5615E400C7916D /* MGLFoundation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 558DE79F1E5615E400C7916D /* MGLFoundation.mm */; };
558DE7A31E5615E400C7916D /* MGLFoundation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 558DE79F1E5615E400C7916D /* MGLFoundation.mm */; };
- 55CF752F213ED92000ED86C4 /* libicu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF752E213ED92000ED86C4 /* libicu.a */; };
- 55CF7531213ED92A00ED86C4 /* libicu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF7530213ED92A00ED86C4 /* libicu.a */; };
+ 55CF752F213ED92000ED86C4 /* libmbgl-vendor-icu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF752E213ED92000ED86C4 /* libmbgl-vendor-icu.a */; };
+ 55CF7531213ED92A00ED86C4 /* libmbgl-vendor-icu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF7530213ED92A00ED86C4 /* libmbgl-vendor-icu.a */; };
55D120A61F791007004B6D81 /* libmbgl-loop-darwin.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D120A71F791007004B6D81 /* libmbgl-loop-darwin.a */; };
55D120A81F79100C004B6D81 /* libmbgl-filesource.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D120A91F79100C004B6D81 /* libmbgl-filesource.a */; };
55E2AD131E5B125400E8C587 /* MGLOfflineStorageTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 55E2AD121E5B125400E8C587 /* MGLOfflineStorageTests.mm */; };
@@ -503,6 +503,7 @@
ACD0245B2187EABA00D8C8A7 /* MMEMetricsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = ACD024542187EAAF00D8C8A7 /* MMEMetricsManager.m */; };
ACD0245E2187EACB00D8C8A7 /* MMEMetrics.m in Sources */ = {isa = PBXBuildFile; fileRef = ACD024572187EAAF00D8C8A7 /* MMEMetrics.m */; };
ACD0245F2187EACB00D8C8A7 /* MMEMetrics.m in Sources */ = {isa = PBXBuildFile; fileRef = ACD024572187EAAF00D8C8A7 /* MMEMetrics.m */; };
+ CA0B3C022329DE9A00E4B493 /* MGLTestAssertionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CAAA65D82321BBA900F08A39 /* MGLTestAssertionHandler.m */; };
CA0C27922076C804001CE5B7 /* MGLShapeSourceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA0C27912076C804001CE5B7 /* MGLShapeSourceTests.m */; };
CA0C27942076CA19001CE5B7 /* MGLMapViewIntegrationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CA0C27932076CA19001CE5B7 /* MGLMapViewIntegrationTest.m */; };
CA1B4A512099FB2200EDD491 /* MGLMapSnapshotterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CA1B4A502099FB2200EDD491 /* MGLMapSnapshotterTest.m */; };
@@ -523,6 +524,7 @@
CA8FBC0921A47BB100D1203C /* MGLRendererConfigurationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA8FBC0821A47BB100D1203C /* MGLRendererConfigurationTests.mm */; };
CAA69DA4206DCD0E007279CD /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4A26961CB6E795000B7809 /* Mapbox.framework */; };
CAA69DA5206DCD0E007279CD /* Mapbox.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DA4A26961CB6E795000B7809 /* Mapbox.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ CAAA65D92321BBA900F08A39 /* MGLTestAssertionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CAAA65D82321BBA900F08A39 /* MGLTestAssertionHandler.m */; };
CABE5DAD2072FAB40003AF3C /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA8847D21CBAF91600AB86E3 /* Mapbox.framework */; };
CAD9D0AA22A86D6F001B25EE /* MGLResourceTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CAD9D0A922A86D6F001B25EE /* MGLResourceTests.mm */; };
CAE7AD5520F46EF5003B6782 /* MGLMapSnapshotterSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAE7AD5420F46EF5003B6782 /* MGLMapSnapshotterSwiftTests.swift */; };
@@ -551,7 +553,7 @@
DA2DBBCE1D51E80400D38FF9 /* MGLStyleLayerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2DBBCD1D51E80400D38FF9 /* MGLStyleLayerTests.m */; };
DA2E88561CC036F400F24E7B /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA8847D21CBAF91600AB86E3 /* Mapbox.framework */; };
DA2E88611CC0382C00F24E7B /* MGLGeometryTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2E885C1CC0382C00F24E7B /* MGLGeometryTests.mm */; };
- DA2E88621CC0382C00F24E7B /* MGLOfflinePackTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.m */; };
+ DA2E88621CC0382C00F24E7B /* MGLOfflinePackTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.mm */; };
DA2E88631CC0382C00F24E7B /* MGLOfflineRegionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2E885E1CC0382C00F24E7B /* MGLOfflineRegionTests.m */; };
DA2E88651CC0382C00F24E7B /* MGLStyleTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DA2E88601CC0382C00F24E7B /* MGLStyleTests.mm */; };
DA35A29E1CC9E94C00E826B2 /* MGLCoordinateFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = DA35A29D1CC9E94C00E826B2 /* MGLCoordinateFormatter.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -1070,8 +1072,8 @@
5580B45A229570A10091291B /* MGLMapView+OpenGL.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MGLMapView+OpenGL.mm"; sourceTree = "<group>"; };
558DE79E1E5615E400C7916D /* MGLFoundation_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLFoundation_Private.h; sourceTree = "<group>"; };
558DE79F1E5615E400C7916D /* MGLFoundation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLFoundation.mm; sourceTree = "<group>"; };
- 55CF752E213ED92000ED86C4 /* libicu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libicu.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 55CF7530213ED92A00ED86C4 /* libicu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libicu.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 55CF752E213ED92000ED86C4 /* libmbgl-vendor-icu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libmbgl-vendor-icu.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 55CF7530213ED92A00ED86C4 /* libmbgl-vendor-icu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libmbgl-vendor-icu.a; sourceTree = BUILT_PRODUCTS_DIR; };
55D120A71F791007004B6D81 /* libmbgl-loop-darwin.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libmbgl-loop-darwin.a"; sourceTree = BUILT_PRODUCTS_DIR; };
55D120A91F79100C004B6D81 /* libmbgl-filesource.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libmbgl-filesource.a"; sourceTree = BUILT_PRODUCTS_DIR; };
55D8C9941D0F133500F42F10 /* config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = config.xcconfig; path = ../../build/ios/config.xcconfig; sourceTree = "<group>"; };
@@ -1211,6 +1213,8 @@
CA86FF0D22D8D5A0009EB14A /* MGLNetworkConfigurationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLNetworkConfigurationTests.m; sourceTree = "<group>"; };
CA88DC2F21C85D900059ED5A /* MGLStyleURLIntegrationTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLStyleURLIntegrationTest.m; sourceTree = "<group>"; };
CA8FBC0821A47BB100D1203C /* MGLRendererConfigurationTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLRendererConfigurationTests.mm; path = ../../darwin/test/MGLRendererConfigurationTests.mm; sourceTree = "<group>"; };
+ CAAA65D72321BBA900F08A39 /* MGLTestAssertionHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MGLTestAssertionHandler.h; path = ../../darwin/test/MGLTestAssertionHandler.h; sourceTree = "<group>"; };
+ CAAA65D82321BBA900F08A39 /* MGLTestAssertionHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MGLTestAssertionHandler.m; path = ../../darwin/test/MGLTestAssertionHandler.m; sourceTree = "<group>"; };
CAD9D0A922A86D6F001B25EE /* MGLResourceTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLResourceTests.mm; path = ../../darwin/test/MGLResourceTests.mm; sourceTree = "<group>"; };
CAE7AD5320F46EF5003B6782 /* integration-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "integration-Bridging-Header.h"; sourceTree = "<group>"; };
CAE7AD5420F46EF5003B6782 /* MGLMapSnapshotterSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MGLMapSnapshotterSwiftTests.swift; sourceTree = "<group>"; };
@@ -1244,7 +1248,7 @@
DA2E88511CC036F400F24E7B /* test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = test.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
DA2E88551CC036F400F24E7B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
DA2E885C1CC0382C00F24E7B /* MGLGeometryTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLGeometryTests.mm; path = ../../darwin/test/MGLGeometryTests.mm; sourceTree = "<group>"; };
- DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLOfflinePackTests.m; path = ../../darwin/test/MGLOfflinePackTests.m; sourceTree = "<group>"; };
+ DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLOfflinePackTests.mm; path = ../../darwin/test/MGLOfflinePackTests.mm; sourceTree = "<group>"; };
DA2E885E1CC0382C00F24E7B /* MGLOfflineRegionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLOfflineRegionTests.m; path = ../../darwin/test/MGLOfflineRegionTests.m; sourceTree = "<group>"; };
DA2E88601CC0382C00F24E7B /* MGLStyleTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLStyleTests.mm; path = ../../darwin/test/MGLStyleTests.mm; sourceTree = "<group>"; };
DA33895F1FA3EAB7001EA329 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Foundation.strings"; sourceTree = "<group>"; };
@@ -1514,7 +1518,7 @@
DAABF73D1CBC59BB005B1825 /* libmbgl-core.a in Frameworks */,
55D120A61F791007004B6D81 /* libmbgl-loop-darwin.a in Frameworks */,
55D120A81F79100C004B6D81 /* libmbgl-filesource.a in Frameworks */,
- 55CF752F213ED92000ED86C4 /* libicu.a in Frameworks */,
+ 55CF752F213ED92000ED86C4 /* libmbgl-vendor-icu.a in Frameworks */,
DA27C24E1CBB3811000B0ECD /* GLKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1527,7 +1531,7 @@
9680276422655696006BA4A1 /* libmbxaccounts.a in Frameworks */,
DAAE5F8920F047240089D85B /* libmbgl-filesource.a in Frameworks */,
DAAE5F8A20F0472E0089D85B /* libmbgl-loop-darwin.a in Frameworks */,
- 55CF7531213ED92A00ED86C4 /* libicu.a in Frameworks */,
+ 55CF7531213ED92A00ED86C4 /* libmbgl-vendor-icu.a in Frameworks */,
550570D22296E96E00228ECF /* GLKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
@@ -1758,6 +1762,8 @@
4031ACFE1E9FD29F00A3EA26 /* MGLSDKTestHelpers.swift */,
A4DE3DCA23038A7F005B3473 /* MGLMockGestureRecognizers.h */,
A4DE3DC823038A07005B3473 /* MGLMockGestureRecognizers.m */,
+ CAAA65D72321BBA900F08A39 /* MGLTestAssertionHandler.h */,
+ CAAA65D82321BBA900F08A39 /* MGLTestAssertionHandler.m */,
);
name = "Test Helpers";
sourceTree = "<group>";
@@ -2037,8 +2043,8 @@
isa = PBXGroup;
children = (
9680274122653C3E006BA4A1 /* libmbxaccounts.a */,
- 55CF7530213ED92A00ED86C4 /* libicu.a */,
- 55CF752E213ED92000ED86C4 /* libicu.a */,
+ 55CF7530213ED92A00ED86C4 /* libmbgl-vendor-icu.a */,
+ 55CF752E213ED92000ED86C4 /* libmbgl-vendor-icu.a */,
55D120A91F79100C004B6D81 /* libmbgl-filesource.a */,
55D120A71F791007004B6D81 /* libmbgl-loop-darwin.a */,
36F1153C1D46080700878E1A /* libmbgl-platform-ios.a */,
@@ -2084,7 +2090,7 @@
1F95931C1E6DE2E900D5B294 /* MGLNSDateAdditionsTests.mm */,
96036A0520059BBA00510F3D /* MGLNSOrthographyAdditionsTests.m */,
DAE7DEC11E245455007505A6 /* MGLNSStringAdditionsTests.m */,
- DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.m */,
+ DA2E885D1CC0382C00F24E7B /* MGLOfflinePackTests.mm */,
DA2E885E1CC0382C00F24E7B /* MGLOfflineRegionTests.m */,
55E2AD121E5B125400E8C587 /* MGLOfflineStorageTests.mm */,
35B8E08B1D6C8B5100E768D2 /* MGLPredicateTests.mm */,
@@ -3219,6 +3225,7 @@
CAE7AD5520F46EF5003B6782 /* MGLMapSnapshotterSwiftTests.swift in Sources */,
CA0C27922076C804001CE5B7 /* MGLShapeSourceTests.m in Sources */,
077061DA215DA00E000FEF62 /* MGLTestLocationManager.m in Sources */,
+ CA0B3C022329DE9A00E4B493 /* MGLTestAssertionHandler.m in Sources */,
CA6914B520E67F50002DB0EE /* MGLAnnotationViewIntegrationTests.mm in Sources */,
CA4F3BE223107793008BAFEA /* MGLCameraTransitionTests.mm in Sources */,
CA4C54FE2324948100A81659 /* MGLSourceTests.swift in Sources */,
@@ -3264,6 +3271,7 @@
files = (
A4DE3DCC23038CCA005B3473 /* MGLMockGestureRecognizers.m in Sources */,
A4DE3DCB23038C98005B3473 /* MGLMockGestureRecognizers.h in Sources */,
+ CAAA65D92321BBA900F08A39 /* MGLTestAssertionHandler.m in Sources */,
6407D6701E0085FD00F6A9C3 /* MGLDocumentationExampleTests.swift in Sources */,
DA2E88631CC0382C00F24E7B /* MGLOfflineRegionTests.m in Sources */,
409F43FD1E9E781C0048729D /* MGLMapViewDelegateIntegrationTests.swift in Sources */,
@@ -3302,7 +3310,7 @@
9658C155204761FC00D8A674 /* MGLMapViewScaleBarTests.m in Sources */,
409D0A0D1ED614CE00C95D0C /* MGLAnnotationViewIntegrationTests.swift in Sources */,
9686D1BD22D9357700194EA0 /* MGLMapViewZoomTests.mm in Sources */,
- DA2E88621CC0382C00F24E7B /* MGLOfflinePackTests.m in Sources */,
+ DA2E88621CC0382C00F24E7B /* MGLOfflinePackTests.mm in Sources */,
55E2AD131E5B125400E8C587 /* MGLOfflineStorageTests.mm in Sources */,
07D8C6FF1F67562C00381808 /* MGLComputedShapeSourceTests.m in Sources */,
920A3E5D1E6F995200C16EFC /* MGLSourceQueryTests.m in Sources */,
diff --git a/platform/ios/src/MGLCompassButton.mm b/platform/ios/src/MGLCompassButton.mm
index acb25a560c..5bbd9bf923 100644
--- a/platform/ios/src/MGLCompassButton.mm
+++ b/platform/ios/src/MGLCompassButton.mm
@@ -1,7 +1,7 @@
#import "MGLCompassButton_Private.h"
#import "MGLCompassDirectionFormatter.h"
-#import <Mapbox/MGLGeometry.h>
+#import "MGLGeometry.h"
#import "MGLMapView_Private.h"
#import "UIImage+MGLAdditions.h"
diff --git a/platform/ios/src/MGLCompassButton_Private.h b/platform/ios/src/MGLCompassButton_Private.h
index c9741d79e3..9ef55cfa5b 100644
--- a/platform/ios/src/MGLCompassButton_Private.h
+++ b/platform/ios/src/MGLCompassButton_Private.h
@@ -1,6 +1,6 @@
#import <UIKit/UIKit.h>
-#import <Mapbox/MGLCompassButton.h>
+#import "MGLCompassButton.h"
@class MGLMapView;
diff --git a/platform/ios/src/MGLScaleBar.mm b/platform/ios/src/MGLScaleBar.mm
index cd8bc1d030..8525881da7 100644
--- a/platform/ios/src/MGLScaleBar.mm
+++ b/platform/ios/src/MGLScaleBar.mm
@@ -1,4 +1,4 @@
-#import <Mapbox/Mapbox.h>
+#import "Mapbox.h"
#import "MGLScaleBar.h"
static const CGFloat MGLFeetPerMile = 5280;
diff --git a/platform/ios/src/UIImage+MGLAdditions.h b/platform/ios/src/UIImage+MGLAdditions.h
index 55835c50d6..23fac9dbeb 100644
--- a/platform/ios/src/UIImage+MGLAdditions.h
+++ b/platform/ios/src/UIImage+MGLAdditions.h
@@ -1,6 +1,6 @@
#import <UIKit/UIKit.h>
-#import <Mapbox/MGLTypes.h>
+#import "MGLTypes.h"
#include <mbgl/style/image.hpp>
diff --git a/platform/linux/config.cmake b/platform/linux/config.cmake
index d7bfad0011..74860ea0d7 100644
--- a/platform/linux/config.cmake
+++ b/platform/linux/config.cmake
@@ -98,7 +98,7 @@ macro(mbgl_platform_core)
PRIVATE ${LIBICUI18N}
PRIVATE ${LIBICUUC}
PRIVATE ${LIBICUDATA}
- PRIVATE nunicode
+ PRIVATE mbgl-vendor-nunicode
PUBLIC -lz
)
endmacro()
diff --git a/platform/macos/CHANGELOG.md b/platform/macos/CHANGELOG.md
index da9a179ad3..fc59457a26 100644
--- a/platform/macos/CHANGELOG.md
+++ b/platform/macos/CHANGELOG.md
@@ -18,6 +18,8 @@
* Fixed a rendering issue of `collisionBox` when `text-translate` or `icon-translate` is enabled. ([#15467](https://github.com/mapbox/mapbox-gl-native/pull/15467))
* Fixed an issue of integer overflow when converting `tileCoordinates` to `LatLon`, which caused issues such as `queryRenderedFeatures` and `querySourceFeatures` returning incorrect coordinates at zoom levels 20 and higher. ([#15560](https://github.com/mapbox/mapbox-gl-native/pull/15560))
* Added an `-[MGLMapSnapshotter startWithOverlayHandler:completionHandler:]` method to provide the snapshot's current `CGContext` in order to perform custom drawing on `MGLMapSnapShot` objects. ([#15530](https://github.com/mapbox/mapbox-gl-native/pull/15530))
+* Fixed an issue that `maxzoom` in style `Sources` option was ignored when URL resource is provided. It may cause problems such as extra tiles downloading at higher zoom level than `maxzoom`, or problems that wrong setting of `overscaledZ` in `OverscaledTileID` that will be passed to `SymbolLayout`, leading wrong rendering appearance. ([#15581](https://github.com/mapbox/mapbox-gl-native/pull/15581))
+* Fixed a crash when `-[MGLOfflinePack invalidate]` is called on different threads. ([#15582](https://github.com/mapbox/mapbox-gl-native/pull/15582))
### Styles and rendering
diff --git a/platform/macos/macos.xcodeproj/project.pbxproj b/platform/macos/macos.xcodeproj/project.pbxproj
index d290d97012..226bc62312 100644
--- a/platform/macos/macos.xcodeproj/project.pbxproj
+++ b/platform/macos/macos.xcodeproj/project.pbxproj
@@ -98,7 +98,7 @@
5591AC6B2298361600FF9ADF /* MGLMapView+Impl.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5591AC692298361600FF9ADF /* MGLMapView+Impl.mm */; };
55CAF6322294407F00F17770 /* MGLMapView+OpenGL.h in Headers */ = {isa = PBXBuildFile; fileRef = 55CAF6312294407F00F17770 /* MGLMapView+OpenGL.h */; };
55CAF6342294409B00F17770 /* MGLMapView+OpenGL.mm in Sources */ = {isa = PBXBuildFile; fileRef = 55CAF6332294409B00F17770 /* MGLMapView+OpenGL.mm */; };
- 55CF7533213EDADF00ED86C4 /* libicu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF7532213EDADF00ED86C4 /* libicu.a */; };
+ 55CF7533213EDADF00ED86C4 /* libmbgl-vendor-icu.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55CF7532213EDADF00ED86C4 /* libmbgl-vendor-icu.a */; };
55D120A31F7906E6004B6D81 /* libmbgl-filesource.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D120A41F7906E6004B6D81 /* libmbgl-filesource.a */; };
55D120A51F790A0C004B6D81 /* libmbgl-filesource.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D120A41F7906E6004B6D81 /* libmbgl-filesource.a */; };
55E2AD111E5B0A6900E8C587 /* MGLOfflineStorageTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 55E2AD101E5B0A6900E8C587 /* MGLOfflineStorageTests.mm */; };
@@ -128,6 +128,8 @@
9654C12B1FFC38E000DB6A19 /* MGLPolyline_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C12A1FFC38E000DB6A19 /* MGLPolyline_Private.h */; };
9654C12D1FFC394700DB6A19 /* MGLPolygon_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C12C1FFC394700DB6A19 /* MGLPolygon_Private.h */; };
96E027311E57C9A7004B8E66 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 96E027331E57C9A7004B8E66 /* Localizable.strings */; };
+ CA0B3C072329F7E700E4B493 /* MGLTestAssertionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = CA0B3C052329F7E600E4B493 /* MGLTestAssertionHandler.m */; };
+ CA0B3C092329FB4800E4B493 /* MGLOfflinePackTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA0B3C082329FB4800E4B493 /* MGLOfflinePackTests.mm */; };
CA4045C7216720D700B356E1 /* MGLCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = CA4045C4216720D700B356E1 /* MGLCluster.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA8FBC0D21A4A74300D1203C /* MGLRendererConfigurationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA8FBC0C21A4A74300D1203C /* MGLRendererConfigurationTests.mm */; };
CA9461A620884CCB0015EB12 /* MGLAnnotationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA9461A520884CCB0015EB12 /* MGLAnnotationTests.m */; };
@@ -280,7 +282,6 @@
DAE6C3BF1CC31F2E00DB3429 /* mapbox.pdf in Resources */ = {isa = PBXBuildFile; fileRef = DAE6C3BC1CC31F2E00DB3429 /* mapbox.pdf */; };
DAE6C3C21CC31F4500DB3429 /* Mapbox.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE6C3C11CC31F4500DB3429 /* Mapbox.h */; settings = {ATTRIBUTES = (Public, ); }; };
DAE6C3D21CC34C9900DB3429 /* MGLGeometryTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DAE6C3C81CC34BD800DB3429 /* MGLGeometryTests.mm */; };
- DAE6C3D31CC34C9900DB3429 /* MGLOfflinePackTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE6C3C91CC34BD800DB3429 /* MGLOfflinePackTests.m */; };
DAE6C3D41CC34C9900DB3429 /* MGLOfflineRegionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE6C3CA1CC34BD800DB3429 /* MGLOfflineRegionTests.m */; };
DAE6C3D61CC34C9900DB3429 /* MGLStyleTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = DAE6C3CC1CC34BD800DB3429 /* MGLStyleTests.mm */; };
DAE7DEC41E24549F007505A6 /* MGLNSStringAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DAE7DEC31E24549F007505A6 /* MGLNSStringAdditionsTests.m */; };
@@ -424,7 +425,7 @@
5591AC692298361600FF9ADF /* MGLMapView+Impl.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "MGLMapView+Impl.mm"; sourceTree = "<group>"; };
55CAF6312294407F00F17770 /* MGLMapView+OpenGL.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MGLMapView+OpenGL.h"; sourceTree = "<group>"; };
55CAF6332294409B00F17770 /* MGLMapView+OpenGL.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MGLMapView+OpenGL.mm"; sourceTree = "<group>"; };
- 55CF7532213EDADF00ED86C4 /* libicu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libicu.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 55CF7532213EDADF00ED86C4 /* libmbgl-vendor-icu.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libmbgl-vendor-icu.a; sourceTree = BUILT_PRODUCTS_DIR; };
55D120A41F7906E6004B6D81 /* libmbgl-filesource.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libmbgl-filesource.a"; sourceTree = BUILT_PRODUCTS_DIR; };
55D9B4B01D005D3900C1CCE2 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
55E2AD101E5B0A6900E8C587 /* MGLOfflineStorageTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLOfflineStorageTests.mm; path = ../../darwin/test/MGLOfflineStorageTests.mm; sourceTree = "<group>"; };
@@ -467,6 +468,9 @@
96E027391E57C9B9004B8E66 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
96E0273A1E57C9BB004B8E66 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = "<group>"; };
96E0273B1E57C9BC004B8E66 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
+ CA0B3C042329F7E600E4B493 /* MGLTestAssertionHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MGLTestAssertionHandler.h; path = ../../darwin/test/MGLTestAssertionHandler.h; sourceTree = "<group>"; };
+ CA0B3C052329F7E600E4B493 /* MGLTestAssertionHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLTestAssertionHandler.m; path = ../../darwin/test/MGLTestAssertionHandler.m; sourceTree = "<group>"; };
+ CA0B3C082329FB4800E4B493 /* MGLOfflinePackTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLOfflinePackTests.mm; path = ../../darwin/test/MGLOfflinePackTests.mm; sourceTree = "<group>"; };
CA4045C4216720D700B356E1 /* MGLCluster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLCluster.h; sourceTree = "<group>"; };
CA8FBC0C21A4A74300D1203C /* MGLRendererConfigurationTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLRendererConfigurationTests.mm; path = ../../darwin/test/MGLRendererConfigurationTests.mm; sourceTree = "<group>"; };
CA9461A520884CCB0015EB12 /* MGLAnnotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLAnnotationTests.m; path = test/MGLAnnotationTests.m; sourceTree = SOURCE_ROOT; };
@@ -693,7 +697,6 @@
DAE6C3C11CC31F4500DB3429 /* Mapbox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Mapbox.h; path = src/Mapbox.h; sourceTree = SOURCE_ROOT; };
DAE6C3C61CC3499100DB3429 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; };
DAE6C3C81CC34BD800DB3429 /* MGLGeometryTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLGeometryTests.mm; path = ../../darwin/test/MGLGeometryTests.mm; sourceTree = "<group>"; };
- DAE6C3C91CC34BD800DB3429 /* MGLOfflinePackTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLOfflinePackTests.m; path = ../../darwin/test/MGLOfflinePackTests.m; sourceTree = "<group>"; };
DAE6C3CA1CC34BD800DB3429 /* MGLOfflineRegionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLOfflineRegionTests.m; path = ../../darwin/test/MGLOfflineRegionTests.m; sourceTree = "<group>"; };
DAE6C3CC1CC34BD800DB3429 /* MGLStyleTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLStyleTests.mm; path = ../../darwin/test/MGLStyleTests.mm; sourceTree = "<group>"; };
DAE7DEC31E24549F007505A6 /* MGLNSStringAdditionsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLNSStringAdditionsTests.m; path = ../../darwin/test/MGLNSStringAdditionsTests.m; sourceTree = "<group>"; };
@@ -740,7 +743,7 @@
5548BE781D09E718005DDE81 /* libmbgl-core.a in Frameworks */,
55D120A31F7906E6004B6D81 /* libmbgl-filesource.a in Frameworks */,
52B5D17F1E5E26DF00BBCB48 /* libmbgl-loop-darwin.a in Frameworks */,
- 55CF7533213EDADF00ED86C4 /* libicu.a in Frameworks */,
+ 55CF7533213EDADF00ED86C4 /* libmbgl-vendor-icu.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -870,6 +873,8 @@
4031AD001E9FD61000A3EA26 /* Test Helpers */ = {
isa = PBXGroup;
children = (
+ CA0B3C042329F7E600E4B493 /* MGLTestAssertionHandler.h */,
+ CA0B3C052329F7E600E4B493 /* MGLTestAssertionHandler.m */,
4031AD011E9FD6A300A3EA26 /* MGLSDKTestHelpers.swift */,
);
name = "Test Helpers";
@@ -1146,7 +1151,7 @@
DAE6C31E1CC308BC00DB3429 /* Frameworks */ = {
isa = PBXGroup;
children = (
- 55CF7532213EDADF00ED86C4 /* libicu.a */,
+ 55CF7532213EDADF00ED86C4 /* libmbgl-vendor-icu.a */,
55D120A41F7906E6004B6D81 /* libmbgl-filesource.a */,
5548BE7B1D0ACBBD005DDE81 /* libmbgl-loop-darwin.a */,
55D9B4B01D005D3900C1CCE2 /* libz.tbd */,
@@ -1195,7 +1200,7 @@
076171C4213A0DC200668A35 /* MGLMapViewTests.m */,
1F95931A1E6DE2B600D5B294 /* MGLNSDateAdditionsTests.mm */,
DAE7DEC31E24549F007505A6 /* MGLNSStringAdditionsTests.m */,
- DAE6C3C91CC34BD800DB3429 /* MGLOfflinePackTests.m */,
+ CA0B3C082329FB4800E4B493 /* MGLOfflinePackTests.mm */,
DAE6C3CA1CC34BD800DB3429 /* MGLOfflineRegionTests.m */,
55E2AD101E5B0A6900E8C587 /* MGLOfflineStorageTests.mm */,
35C5D84B1D6DD75B00E95907 /* MGLPredicateTests.mm */,
@@ -1737,6 +1742,7 @@
1F7454AB1ED1DDBD00021D39 /* MGLLightTest.mm in Sources */,
07A240941F675674002C8210 /* MGLComputedShapeSourceTests.m in Sources */,
DAEDC4371D606291000224FF /* MGLAttributionButtonTests.m in Sources */,
+ CA0B3C072329F7E700E4B493 /* MGLTestAssertionHandler.m in Sources */,
DA695424215B1E6C002041A4 /* MGLMapCameraTests.m in Sources */,
920A3E591E6F859D00C16EFC /* MGLSourceQueryTests.m in Sources */,
DA35A2B61CCA14D700E826B2 /* MGLCompassDirectionFormatterTests.m in Sources */,
@@ -1752,6 +1758,7 @@
DA87A9A61DCACC5000810D09 /* MGLCircleStyleLayerTests.mm in Sources */,
DA87A99E1DC9DC2100810D09 /* MGLPredicateTests.mm in Sources */,
DD58A4C91D822C6700E1F038 /* MGLExpressionTests.mm in Sources */,
+ CA0B3C092329FB4800E4B493 /* MGLOfflinePackTests.mm in Sources */,
170A82C4201FB6EC00943087 /* MGLHeatmapColorTests.mm in Sources */,
4031ACFC1E9EB3C100A3EA26 /* MGLMapViewDelegateIntegrationTests.swift in Sources */,
CA8FBC0D21A4A74300D1203C /* MGLRendererConfigurationTests.mm in Sources */,
@@ -1760,7 +1767,6 @@
DAA999011E9F5EC5002E6EA6 /* MGLFillExtrusionStyleLayerTests.mm in Sources */,
DA29875A1E1A4290002299F5 /* MGLDocumentationExampleTests.swift in Sources */,
07BA4CAC1EE21887004528F5 /* MGLImageSourceTests.m in Sources */,
- DAE6C3D31CC34C9900DB3429 /* MGLOfflinePackTests.m in Sources */,
DA87A9A51DCACC5000810D09 /* MGLLineStyleLayerTests.mm in Sources */,
DA87A9A31DCACC5000810D09 /* MGLRasterStyleLayerTests.mm in Sources */,
CA9461A620884CCB0015EB12 /* MGLAnnotationTests.m in Sources */,
diff --git a/platform/macos/src/MGLAnnotationImage_Private.h b/platform/macos/src/MGLAnnotationImage_Private.h
index 21963a86a0..428f1db5d9 100644
--- a/platform/macos/src/MGLAnnotationImage_Private.h
+++ b/platform/macos/src/MGLAnnotationImage_Private.h
@@ -1,4 +1,4 @@
-#import <Mapbox/Mapbox.h>
+#import "Mapbox.h"
@interface MGLAnnotationImage (Private)
diff --git a/platform/node/CHANGELOG.md b/platform/node/CHANGELOG.md
index 519f30aaad..84fbff741c 100644
--- a/platform/node/CHANGELOG.md
+++ b/platform/node/CHANGELOG.md
@@ -1,3 +1,6 @@
+# master
+* Add support for feature state APIs. ([#15480](https://github.com/mapbox/mapbox-gl-native/pull/15480))
+
# 4.3.0
* Introduce `text-writing-mode` layout property for symbol layer ([#14932](https://github.com/mapbox/mapbox-gl-native/pull/14932)). The `text-writing-mode` layout property allows control over symbol's preferred writing mode. The new property value is an array, whose values are enumeration values from a ( `horizontal` | `vertical` ) set.
* Fixed rendering and collision detection issues with using `text-variable-anchor` and `icon-text-fit` properties on the same layer ([#15367](https://github.com/mapbox/mapbox-gl-native/pull/15367)).
@@ -5,6 +8,7 @@
* Fixed a rendering issue of `collisionBox` when `text-translate` or `icon-translate` is enabled. ([#15467](https://github.com/mapbox/mapbox-gl-native/pull/15467))
* Fixed an issue of integer overflow when converting `tileCoordinates` to `LatLon`, which caused issues such as `queryRenderedFeatures` and `querySourceFeatures` returning incorrect coordinates at zoom levels 20 and higher. ([#15560](https://github.com/mapbox/mapbox-gl-native/pull/15560))
* Add typechecking while constructing legacy filter to prevent converting an unexpected filter type [#15389](https://github.com/mapbox/mapbox-gl-native/pull/15389).
+* Fixed an issue that `maxzoom` in style `Sources` option was ignored when URL resource is provided. It may cause problems such as extra tiles downloading at higher zoom level than `maxzoom`, or problems that wrong setting of `overscaledZ` in `OverscaledTileID` that will be passed to `SymbolLayout`, leading wrong rendering appearance. ([#15581](https://github.com/mapbox/mapbox-gl-native/pull/15581))
# 4.2.0
- Add an option to set whether or not an image should be treated as a SDF ([#15054](https://github.com/mapbox/mapbox-gl-native/issues/15054))
diff --git a/platform/node/src/node_feature.cpp b/platform/node/src/node_feature.cpp
index 2dfab686a7..646cc23338 100644
--- a/platform/node/src/node_feature.cpp
+++ b/platform/node/src/node_feature.cpp
@@ -167,6 +167,12 @@ v8::Local<v8::Object> toJS(const Feature& feature) {
Nan::Set(result, Nan::New("id").ToLocalChecked(), FeatureIdentifier::visit(feature.id, ToValue()));
}
+ Nan::Set(result, Nan::New("source").ToLocalChecked(), toJS(feature.source));
+ if (!feature.sourceLayer.empty()) {
+ Nan::Set(result, Nan::New("sourceLayer").ToLocalChecked(), toJS(feature.sourceLayer));
+ }
+ Nan::Set(result, Nan::New("state").ToLocalChecked(), toJS(feature.state));
+
return scope.Escape(result);
}
diff --git a/platform/node/src/node_map.cpp b/platform/node/src/node_map.cpp
index 641816dc00..7450f461f8 100644
--- a/platform/node/src/node_map.cpp
+++ b/platform/node/src/node_map.cpp
@@ -117,6 +117,9 @@ ParseError)JS").ToLocalChecked()).ToLocalChecked();
Nan::SetPrototypeMethod(tpl, "setAxonometric", SetAxonometric);
Nan::SetPrototypeMethod(tpl, "setXSkew", SetXSkew);
Nan::SetPrototypeMethod(tpl, "setYSkew", SetYSkew);
+ Nan::SetPrototypeMethod(tpl, "setFeatureState", SetFeatureState);
+ Nan::SetPrototypeMethod(tpl, "getFeatureState", GetFeatureState);
+ Nan::SetPrototypeMethod(tpl, "removeFeatureState", RemoveFeatureState);
Nan::SetPrototypeMethod(tpl, "dumpDebugLogs", DumpDebugLogs);
Nan::SetPrototypeMethod(tpl, "queryRenderedFeatures", QueryRenderedFeatures);
@@ -1099,6 +1102,224 @@ void NodeMap::SetYSkew(const Nan::FunctionCallbackInfo<v8::Value>& info) {
info.GetReturnValue().SetUndefined();
}
+void NodeMap::SetFeatureState(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+ using namespace mbgl;
+ using namespace mbgl::style::conversion;
+
+ auto nodeMap = Nan::ObjectWrap::Unwrap<NodeMap>(info.Holder());
+ if (!nodeMap->map) return Nan::ThrowError(releasedMessage());
+
+ if (info.Length() < 2) {
+ return Nan::ThrowTypeError("Two arguments required");
+ }
+
+ if (!info[0]->IsObject() || !info[1]->IsObject()) {
+ return Nan::ThrowTypeError("Both arguments must be objects");
+ }
+
+ std::string sourceID, featureID;
+ mbgl::optional<std::string> sourceLayerID;
+ auto feature = Nan::To<v8::Object>(info[0]).ToLocalChecked();
+ if (Nan::Has(feature, Nan::New("source").ToLocalChecked()).FromJust()) {
+ auto sourceOption = Nan::Get(feature, Nan::New("source").ToLocalChecked()).ToLocalChecked();
+ if (!sourceOption->IsString()) {
+ return Nan::ThrowTypeError("Requires feature.source property to be a string");
+ }
+ sourceID = *Nan::Utf8String(sourceOption);
+ } else {
+ return Nan::ThrowTypeError("SetFeatureState: Requires feature.source property");
+ }
+
+ if (Nan::Has(feature, Nan::New("sourceLayer").ToLocalChecked()).FromJust()) {
+ auto sourceLayerOption = Nan::Get(feature, Nan::New("sourceLayer").ToLocalChecked()).ToLocalChecked();
+ if (!sourceLayerOption->IsString()) {
+ return Nan::ThrowTypeError("SetFeatureState: Requires feature.sourceLayer property to be a string");
+ }
+ sourceLayerID = {*Nan::Utf8String(sourceLayerOption)};
+ }
+
+ if (Nan::Has(feature, Nan::New("id").ToLocalChecked()).FromJust()) {
+ auto idOption = Nan::Get(feature, Nan::New("id").ToLocalChecked()).ToLocalChecked();
+ if (!idOption->IsString() && !(idOption->IsNumber() || idOption->IsString())) {
+ return Nan::ThrowTypeError("Requires feature.id property to be a string or a number");
+ }
+ featureID = *Nan::Utf8String(idOption);
+ } else {
+ return Nan::ThrowTypeError("SetFeatureState: Requires feature.id property");
+ }
+
+ Convertible state(info[1]);
+
+ if (!isObject(state)) {
+ return Nan::ThrowTypeError("Feature state must be an object");
+ }
+
+ std::string sourceLayer = sourceLayerID.value_or(std::string());
+ std::string stateKey;
+ Value stateValue;
+ bool valueParsed = false;
+ FeatureState newState;
+
+ const std::function<optional<Error>(const std::string&, const Convertible&)> convertFn =
+ [&](const std::string& k, const Convertible& v) -> optional<Error> {
+ optional<Value> value = toValue(v);
+ if (value) {
+ stateValue = std::move(*value);
+ valueParsed = true;
+ } else if (isArray(v)) {
+ std::vector<Value> array;
+ std::size_t length = arrayLength(v);
+ array.reserve(length);
+ for (size_t i = 0; i < length; ++i) {
+ optional<Value> arrayVal = toValue(arrayMember(v, i));
+ if (arrayVal) {
+ array.emplace_back(*arrayVal);
+ }
+ }
+ std::unordered_map<std::string, Value> result;
+ result[k] = std::move(array);
+ stateValue = std::move(result);
+ valueParsed = true;
+ return {};
+
+ } else if (isObject(v)) {
+ eachMember(v, convertFn);
+ }
+ if (!valueParsed) {
+ Nan::ThrowTypeError("Could not get feature state value");
+ return nullopt;
+ }
+ stateKey = k;
+ newState[stateKey] = stateValue;
+ return nullopt;
+ };
+
+ eachMember(state, convertFn);
+
+ try {
+ nodeMap->frontend->getRenderer()->setFeatureState(sourceID, sourceLayerID, featureID, newState);
+ } catch (const std::exception& ex) {
+ return Nan::ThrowError(ex.what());
+ }
+
+ info.GetReturnValue().SetUndefined();
+}
+
+void NodeMap::GetFeatureState(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+ auto nodeMap = Nan::ObjectWrap::Unwrap<NodeMap>(info.Holder());
+ if (!nodeMap->map) return Nan::ThrowError(releasedMessage());
+
+ if (info.Length() < 1) {
+ return Nan::ThrowTypeError("One argument required");
+ }
+
+ if (!info[0]->IsObject() || !info[1]->IsObject()) {
+ return Nan::ThrowTypeError("Argument must be object");
+ }
+
+ std::string sourceID, featureID;
+ mbgl::optional<std::string> sourceLayerID;
+ auto feature = Nan::To<v8::Object>(info[0]).ToLocalChecked();
+ if (Nan::Has(feature, Nan::New("source").ToLocalChecked()).FromJust()) {
+ auto sourceOption = Nan::Get(feature, Nan::New("source").ToLocalChecked()).ToLocalChecked();
+ if (!sourceOption->IsString()) {
+ return Nan::ThrowTypeError("Requires feature.source property to be a string");
+ }
+ sourceID = *Nan::Utf8String(sourceOption);
+ } else {
+ return Nan::ThrowTypeError("GetFeatureState: Requires feature.source property");
+ }
+
+ if (Nan::Has(feature, Nan::New("sourceLayer").ToLocalChecked()).FromJust()) {
+ auto sourceLayerOption = Nan::Get(feature, Nan::New("sourceLayer").ToLocalChecked()).ToLocalChecked();
+ if (!sourceLayerOption->IsString()) {
+ return Nan::ThrowTypeError("GetFeatureState: Requires feature.sourceLayer property to be a string");
+ }
+ sourceLayerID = {*Nan::Utf8String(sourceLayerOption)};
+ }
+
+ if (Nan::Has(feature, Nan::New("id").ToLocalChecked()).FromJust()) {
+ auto idOption = Nan::Get(feature, Nan::New("id").ToLocalChecked()).ToLocalChecked();
+ if (!idOption->IsString() && !(idOption->IsNumber() || idOption->IsString())) {
+ return Nan::ThrowTypeError("Requires feature.id property to be a string or a number");
+ }
+ featureID = *Nan::Utf8String(idOption);
+ } else {
+ return Nan::ThrowTypeError("GetFeatureState: Requires feature.id property");
+ }
+
+ mbgl::FeatureState state;
+ try {
+ nodeMap->frontend->getRenderer()->getFeatureState(state, sourceID, sourceLayerID, featureID);
+ } catch (const std::exception& ex) {
+ return Nan::ThrowError(ex.what());
+ }
+
+ info.GetReturnValue().SetUndefined();
+}
+
+void NodeMap::RemoveFeatureState(const Nan::FunctionCallbackInfo<v8::Value>& info) {
+ auto nodeMap = Nan::ObjectWrap::Unwrap<NodeMap>(info.Holder());
+ if (!nodeMap->map) return Nan::ThrowError(releasedMessage());
+
+ if (info.Length() < 1) {
+ return Nan::ThrowTypeError("At least one argument required");
+ }
+
+ if (!info[0]->IsObject()) {
+ return Nan::ThrowTypeError("Argument 1 must be object");
+ }
+
+ if (info.Length() == 2 && !info[1]->IsString()) {
+ return Nan::ThrowTypeError("argument 2 must be string");
+ }
+
+ std::string sourceID;
+ mbgl::optional<std::string> sourceLayerID, featureID, stateKey;
+ auto feature = Nan::To<v8::Object>(info[0]).ToLocalChecked();
+ if (Nan::Has(feature, Nan::New("source").ToLocalChecked()).FromJust()) {
+ auto sourceOption = Nan::Get(feature, Nan::New("source").ToLocalChecked()).ToLocalChecked();
+ if (!sourceOption->IsString()) {
+ return Nan::ThrowTypeError("Requires feature.source property to be a string");
+ }
+ sourceID = *Nan::Utf8String(sourceOption);
+ } else {
+ return Nan::ThrowTypeError("RemoveFeatureState: Requires feature.source property");
+ }
+
+ if (Nan::Has(feature, Nan::New("sourceLayer").ToLocalChecked()).FromJust()) {
+ auto sourceLayerOption = Nan::Get(feature, Nan::New("sourceLayer").ToLocalChecked()).ToLocalChecked();
+ if (!sourceLayerOption->IsString()) {
+ return Nan::ThrowTypeError("RemoveFeatureState: Requires feature.sourceLayer property to be a string");
+ }
+ sourceLayerID = {*Nan::Utf8String(sourceLayerOption)};
+ }
+
+ if (Nan::Has(feature, Nan::New("id").ToLocalChecked()).FromJust()) {
+ auto idOption = Nan::Get(feature, Nan::New("id").ToLocalChecked()).ToLocalChecked();
+ if (!idOption->IsString() && !(idOption->IsNumber() || idOption->IsString())) {
+ return Nan::ThrowTypeError("Requires feature.id property to be a string or a number");
+ }
+ featureID = {*Nan::Utf8String(idOption)};
+ }
+
+ if (info.Length() == 2) {
+ auto keyParam = Nan::To<v8::String>(info[1]).ToLocalChecked();
+ if (!keyParam->IsString()) {
+ return Nan::ThrowTypeError("RemoveFeatureState: Requires feature key property to be a string");
+ }
+ stateKey = {*Nan::Utf8String(keyParam)};
+ }
+
+ try {
+ nodeMap->frontend->getRenderer()->removeFeatureState(sourceID, sourceLayerID, featureID, stateKey);
+ } catch (const std::exception& ex) {
+ return Nan::ThrowError(ex.what());
+ }
+
+ info.GetReturnValue().SetUndefined();
+}
+
void NodeMap::DumpDebugLogs(const Nan::FunctionCallbackInfo<v8::Value>& info) {
auto nodeMap = Nan::ObjectWrap::Unwrap<NodeMap>(info.Holder());
if (!nodeMap->map) return Nan::ThrowError(releasedMessage());
diff --git a/platform/node/src/node_map.hpp b/platform/node/src/node_map.hpp
index 486754c1c3..381e10381b 100644
--- a/platform/node/src/node_map.hpp
+++ b/platform/node/src/node_map.hpp
@@ -64,6 +64,10 @@ public:
static void DumpDebugLogs(const Nan::FunctionCallbackInfo<v8::Value>&);
static void QueryRenderedFeatures(const Nan::FunctionCallbackInfo<v8::Value>&);
+ static void SetFeatureState(const Nan::FunctionCallbackInfo<v8::Value>&);
+ static void GetFeatureState(const Nan::FunctionCallbackInfo<v8::Value>&);
+ static void RemoveFeatureState(const Nan::FunctionCallbackInfo<v8::Value>&);
+
static v8::Local<v8::Value> ParseError(const char* msg);
void startRender(RenderOptions options);
diff --git a/platform/node/test/ignores.json b/platform/node/test/ignores.json
index d0ae1d0b35..f053b2add1 100644
--- a/platform/node/test/ignores.json
+++ b/platform/node/test/ignores.json
@@ -20,15 +20,8 @@
"query-tests/geometry/multipolygon": "needs investigation",
"query-tests/geometry/polygon": "needs investigation",
"query-tests/world-wrapping/box": "skip - needs issue",
- "query-tests/circle-radius/feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
- "query-tests/circle-stroke-width/feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
"query-tests/fill-extrusion-translate/multiple-layers": "https://github.com/mapbox/mapbox-gl-native/issues/12701",
"query-tests/fill-translate/multiple-layers": "https://github.com/mapbox/mapbox-gl-native/issues/12701",
- "query-tests/line-gap-width/feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
- "query-tests/line-offset/feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
- "query-tests/line-offset/pattern-feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
- "query-tests/line-width/feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
- "query-tests/feature-state/default": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
"query-tests/regressions/mapbox-gl-js#6555": "skip - no querySourceFeatures in mbgl-node; needs issue",
"render-tests/background-color/transition": "https://github.com/mapbox/mapbox-gl-native/issues/10619",
"render-tests/canvas/default": "skip - js specific",
@@ -39,6 +32,7 @@
"render-tests/custom-layer-js/null-island": "skip - js specific",
"render-tests/custom-layer-js/tent-3d": "skip - js specific",
"render-tests/regressions/mapbox-gl-js#7708": "skip - js specific",
+ "render-tests/debug/overdraw": "https://github.com/mapbox/mapbox-gl-native/issues/15638",
"render-tests/debug/collision": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
"render-tests/debug/tile": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
"render-tests/debug/tile-overscaled": "https://github.com/mapbox/mapbox-gl-native/issues/3841",
@@ -51,7 +45,6 @@
"render-tests/fill-extrusion-pattern/opacity": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
"render-tests/fill-extrusion-pattern/feature-expression": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
"render-tests/fill-extrusion-pattern/tile-buffer": "https://github.com/mapbox/mapbox-gl-js/issues/3327",
- "render-tests/fill-pattern/update-feature-state": "skip - port https://github.com/mapbox/mapbox-gl-js/pull/6263 - needs issue",
"render-tests/geojson/inline-linestring-fill": "current behavior is arbitrary",
"render-tests/mixed-zoom/z10-z11": "https://github.com/mapbox/mapbox-gl-native/issues/10397",
"render-tests/raster-masking/overlapping-zoom": "https://github.com/mapbox/mapbox-gl-native/issues/10195",
@@ -72,19 +65,12 @@
"render-tests/symbol-cross-fade/chinese": "https://github.com/mapbox/mapbox-gl-native/issues/10619",
"render-tests/video/default": "skip - https://github.com/mapbox/mapbox-gl-native/issues/601",
"render-tests/background-color/colorSpace-hcl": "needs issue",
- "render-tests/feature-state/composite-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12613",
- "render-tests/feature-state/data-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12613",
- "render-tests/feature-state/vector-source": "https://github.com/mapbox/mapbox-gl-native/issues/12613",
"render-tests/text-variable-anchor/remember-last-placement": "skip - fails on gl-native, as symbol index is not functional at static map mode - needs issue",
- "render-tests/remove-feature-state/composite-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12413",
- "render-tests/remove-feature-state/data-expression": "https://github.com/mapbox/mapbox-gl-native/issues/12413",
- "render-tests/remove-feature-state/vector-source": "https://github.com/mapbox/mapbox-gl-native/issues/12413",
"render-tests/regressions/mapbox-gl-js#8026": "skip - js specific",
"render-tests/fill-extrusion-geometry/linestring": "https://github.com/mapbox/mapbox-gl-native/pull/14240",
"render-tests/circle-sort-key/literal": "https://github.com/mapbox/mapbox-gl-native/issues/15008",
"render-tests/fill-sort-key/literal": "https://github.com/mapbox/mapbox-gl-native/issues/15008",
"render-tests/line-sort-key/literal": "https://github.com/mapbox/mapbox-gl-native/issues/15008",
- "query-tests/remove-feature-state/default": "https://github.com/mapbox/mapbox-gl-native/issues/12413",
"query-tests/fill-extrusion/base-in": "https://github.com/mapbox/mapbox-gl-native/issues/13139",
"query-tests/fill-extrusion/box-in": "https://github.com/mapbox/mapbox-gl-native/issues/13139",
"query-tests/fill-extrusion/side-in": "https://github.com/mapbox/mapbox-gl-native/issues/13139",
diff --git a/platform/node/test/js/map.test.js b/platform/node/test/js/map.test.js
index b21c1519e3..d085e32f4c 100644
--- a/platform/node/test/js/map.test.js
+++ b/platform/node/test/js/map.test.js
@@ -126,6 +126,9 @@ test('Map', function(t) {
'setAxonometric',
'setXSkew',
'setYSkew',
+ 'setFeatureState',
+ 'getFeatureState',
+ 'removeFeatureState',
'dumpDebugLogs',
'queryRenderedFeatures'
]);
diff --git a/platform/node/test/suite_implementation.js b/platform/node/test/suite_implementation.js
index f868af8ece..386bd41092 100644
--- a/platform/node/test/suite_implementation.js
+++ b/platform/node/test/suite_implementation.js
@@ -122,6 +122,12 @@ export default function (style, options, callback) {
map.load(operation[1]);
applyOperations(operations.slice(1), callback);
+ } else if (operation[0] ==='setFeatureState' || operation[0] ==='getFeatureState' || operation[0] ==='removeFeatureState') {
+ map.render(options, function () {
+ map[operation[0]].apply(map, operation.slice(1));
+ applyOperations(operations.slice(1), callback);
+ });
+
} else {
// Ensure that the next `map.render(options)` does not overwrite this change.
if (operation[0] === 'setCenter') {
diff --git a/platform/qt/config.cmake b/platform/qt/config.cmake
deleted file mode 100644
index 9249f846e8..0000000000
--- a/platform/qt/config.cmake
+++ /dev/null
@@ -1,75 +0,0 @@
-include(platform/qt/qt.cmake)
-
-macro(mbgl_platform_core)
- target_sources(mbgl-core
- ${MBGL_QT_CORE_FILES}
- )
-
- target_include_directories(mbgl-core
- PRIVATE platform/qt
- PRIVATE platform/qt/include
- PUBLIC platform/default/include
- )
-
- target_link_libraries(mbgl-core PRIVATE
- ${MBGL_QT_CORE_LIBRARIES}
- nunicode
- )
-
- if(NOT WITH_QT_DECODERS)
- target_sources(mbgl-core
- PRIVATE platform/default/src/mbgl/util/jpeg_reader.cpp
- PRIVATE platform/default/src/mbgl/util/png_reader.cpp
- )
-
- target_add_mason_package(mbgl-core PRIVATE libjpeg-turbo)
- target_add_mason_package(mbgl-core PRIVATE libpng)
- else()
- add_definitions(-DQT_IMAGE_DECODERS)
- endif()
-
- if(NOT WITH_QT_I18N)
- target_sources(mbgl-core PRIVATE platform/default/src/mbgl/text/bidi.cpp)
- target_link_libraries(mbgl-core PRIVATE icu)
- else()
- target_sources(mbgl-core PRIVATE platform/qt/src/bidi.cpp)
- endif()
-endmacro()
-
-
-macro(mbgl_filesource)
- target_sources(mbgl-filesource
- ${MBGL_QT_FILESOURCE_FILES}
- )
-
- target_link_libraries(mbgl-filesource
- ${MBGL_QT_FILESOURCE_LIBRARIES}
- )
-endmacro()
-
-# FIXME: For now tests are disabled on Windows until we
-# get the node.js dependencies working.
-if (NOT CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
- macro(mbgl_platform_test)
- target_sources(mbgl-test
- PRIVATE platform/qt/test/main.cpp
- PRIVATE platform/qt/test/qmapboxgl.test.cpp
- PRIVATE platform/qt/test/qmapboxgl.test.cpp
- )
-
- target_include_directories(mbgl-test
- PRIVATE platform/qt
- )
-
- set_source_files_properties(
- platform/qt/test/main.cpp
- PROPERTIES COMPILE_FLAGS -DWORK_DIRECTORY="${CMAKE_SOURCE_DIR}"
- )
-
- target_link_libraries(mbgl-test
- PRIVATE qmapboxgl
- PRIVATE mbgl-filesource
- PRIVATE -pthread
- )
- endmacro()
-endif()
diff --git a/platform/qt/qnx.cmake b/platform/qt/qnx.cmake
deleted file mode 100644
index 7033f62362..0000000000
--- a/platform/qt/qnx.cmake
+++ /dev/null
@@ -1,77 +0,0 @@
-# CMake toolchain file for QNX Environment.
-#
-# Usage:
-#
-# To use this file, you need to set the 'CMAKE_TOOLCHAIN_FILE' to point to
-# 'qnx.cmake' on the command line:
-#
-# cmake -DDCMAKE_TOOLCHAIN_FILE=platform/qt/qnx.cmake
-#
-# You will also need to provide the locations of the QNX HOST and TARGET locations.
-# This can be done by setting the environment variables(QNX_HOST and QNX_TARGET) from
-# the command line or running the environment setup script provided by the QNX Software
-# Development Platform:
-#
-# source <SDP_DIRECTORY>/qnxsdp-env.sh
-#
-# Options:
-#
-# QCC_COMPILER_TARGET:
-# The compiler name. Default: gcc_ntox86_64.
-# QCC_NTOARCH:
-# The architecture to compile for. Default: x86_64.
-# QNX_HOST:
-# Environment variable to QNX host build tools location.
-# QNX_TARGET:
-# Environment variable to QNX target location.
-
-set(CMAKE_SYSTEM_NAME QNX)
-set(CMAKE_HOST_SYSTEM_NAME QNX)
-SET(CMAKE_SYSTEM_VERSION 7.0.0)
-set(QCC_COMPILER_TARGET "$ENV{QCC_COMPILER_TARGET}")
-set(QCC_NTOARCH "$ENV{QCC_NTOARCH}")
-
-#Check environment variables
-if ("$ENV{QNX_HOST}" STREQUAL "")
- message(FATAL_ERROR "QNX_HOST environment variable not set")
-endif()
-
-if ("$ENV{QNX_TARGET}" STREQUAL "")
- message(FATAL_ERROR "QNX_TARGET environment variable not set")
-endif()
-
-set(QNX_HOST "$ENV{QNX_HOST}")
-set(QNX_TARGET "$ENV{QNX_TARGET}")
-
-# Use 'qcc' instead of nto${QCC_NTOARCH}-gcc and nto${QCC_NTOARCH}-gcc++ once
-# the issue https://gitlab.kitware.com/cmake/cmake/issues/17126 is resolved.
-#set(CMAKE_C_COMPILER qcc)
-#set(CMAKE_C_COMPILER_TARGET ${QCC_COMPILER_TARGET})
-#set(CMAKE_CXX_COMPILER QCC)
-#set(CMAKE_CXX_COMPILER_TARGET ${QCC_COMPILER_TARGET})
-
-set(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-gcc)
-set(CMAKE_CXX_COMPILER "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-g++")
-
-set(CMAKE_LINKER "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-ld" CACHE PATH "QNX linker program" FORCE)
-set(CMAKE_AR "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-ar" CACHE PATH "QNX ar program" FORCE)
-set(CMAKE_NM "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-nm" CACHE PATH "QNX nm program" FORCE)
-set(CMAKE_OBJCOPY "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-objcopy" CACHE PATH "QNX objcopy program" FORCE)
-set(CMAKE_OBJDUMP "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-objdump" CACHE PATH "QNX objdump program" FORCE)
-set(CMAKE_RANLIB "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-ranlib" CACHE PATH "QNX ranlib program" FORCE)
-set(CMAKE_STRIP "${QNX_HOST}/usr/bin/nto${QCC_NTOARCH}-strip" CACHE PATH "QNX strip program" FORCE)
-set (CMAKE_SH "${QNX_HOST}/usr/bin/sh" CACHE PATH "QNX shell program" FORCE)
-
-set(CMAKE_C_FLAGS_DEBUG "-g")
-set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
-set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
-set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
-set(CMAKE_CXX_FLAGS_DEBUG "-g -D_DEBUG")
-set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
-set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
-set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
-
-set(CMAKE_FIND_ROOT_PATH "${QNX_TARGET}")
-set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/platform/qt/qt.cmake b/platform/qt/qt.cmake
deleted file mode 100644
index 33acb7a030..0000000000
--- a/platform/qt/qt.cmake
+++ /dev/null
@@ -1,187 +0,0 @@
-# This file is to be reused by target platforms that don't
-# support `mason` (i.e. Yocto). Do not add any `mason` macro.
-
-option(WITH_QT_DECODERS "Use builtin Qt image decoders" OFF)
-option(WITH_QT_I18N "Use builtin Qt i18n support" OFF)
-
-add_definitions("-D__QT__")
-
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
-
-set(MBGL_QT_CORE_FILES
- # Headless view
- PRIVATE platform/default/src/mbgl/gfx/headless_frontend.cpp
- PRIVATE platform/default/include/mbgl/gfx/headless_frontend.hpp
- PRIVATE platform/default/src/mbgl/gfx/headless_backend.cpp
- PRIVATE platform/default/include/mbgl/gfx/headless_backend.hpp
- PRIVATE platform/default/src/mbgl/gl/headless_backend.cpp
- PRIVATE platform/default/include/mbgl/gl/headless_backend.hpp
- PRIVATE platform/qt/src/headless_backend_qt.cpp
-
- # Thread
- PRIVATE platform/qt/src/thread_local.cpp
-
- # Platform integration
- PRIVATE platform/qt/src/async_task.cpp
- PRIVATE platform/qt/src/async_task_impl.hpp
- PRIVATE platform/qt/src/local_glyph_rasterizer.cpp
- PRIVATE platform/qt/src/qt_logging.cpp
- PRIVATE platform/qt/src/qt_image.cpp
- PRIVATE platform/qt/src/run_loop.cpp
- PRIVATE platform/qt/src/run_loop_impl.hpp
- PRIVATE platform/qt/src/string_stdlib.cpp
- PRIVATE platform/qt/src/timer.cpp
- PRIVATE platform/qt/src/timer_impl.hpp
- PRIVATE platform/qt/src/utf.cpp
- PRIVATE platform/qt/src/gl_functions.cpp
- PRIVATE platform/qt/src/format_number.cpp
-
- PRIVATE platform/default/src/mbgl/text/collator.cpp
- PRIVATE platform/default/src/mbgl/text/unaccent.cpp
- PRIVATE platform/default/include/mbgl/text/unaccent.hpp
-
- #Layer manager
- PRIVATE platform/default/src/mbgl/layermanager/layer_manager.cpp
-)
-
-set(MBGL_QT_FILESOURCE_FILES
- # File source
- PRIVATE platform/default/src/mbgl/storage/file_source.cpp
- PRIVATE platform/qt/src/http_file_source.cpp
- PRIVATE platform/qt/src/http_file_source.hpp
- PRIVATE platform/qt/src/http_request.cpp
- PRIVATE platform/qt/src/http_request.hpp
-
- # Database
- PRIVATE platform/qt/src/sqlite3.cpp
-)
-
-# Shared library
-add_library(qmapboxgl SHARED
- platform/qt/include/qmapbox.hpp
- platform/qt/include/qmapboxgl.hpp
- platform/qt/src/qt_conversion.hpp
- platform/qt/src/qt_geojson.cpp
- platform/qt/src/qt_geojson.hpp
- platform/qt/src/qmapbox.cpp
- platform/qt/src/qmapboxgl.cpp
- platform/qt/src/qmapboxgl_p.hpp
- platform/qt/src/qmapboxgl_map_observer.cpp
- platform/qt/src/qmapboxgl_map_observer.hpp
- platform/qt/src/qmapboxgl_map_renderer.cpp
- platform/qt/src/qmapboxgl_map_renderer.hpp
- platform/qt/src/qmapboxgl_renderer_backend.cpp
- platform/qt/src/qmapboxgl_renderer_backend.hpp
- platform/qt/src/qmapboxgl_scheduler.cpp
- platform/qt/src/qmapboxgl_scheduler.hpp
- platform/default/include/mbgl/util/default_styles.hpp
-)
-
-target_include_directories(qmapboxgl
- PUBLIC platform/qt/include
- PRIVATE src
-)
-
-target_compile_definitions(qmapboxgl
- PRIVATE "-DQT_BUILD_MAPBOXGL_LIB"
-)
-
-target_link_libraries(qmapboxgl
- PRIVATE mbgl-core
- PRIVATE mbgl-filesource
- ${MBGL_QT_CORE_LIBRARIES}
- ${MBGL_QT_FILESOURCE_LIBRARIES}
-)
-
-# C++ app
-add_executable(mbgl-qt
- platform/qt/app/main.cpp
- platform/qt/app/mapwindow.cpp
- platform/qt/app/mapwindow.hpp
- platform/qt/resources/common.qrc
-)
-
-target_compile_options(qmapboxgl
- PRIVATE -std=c++03
-)
-
-target_link_libraries(mbgl-qt
- PRIVATE qmapboxgl
-)
-
-find_package(Qt5Core REQUIRED)
-find_package(Qt5Gui REQUIRED)
-find_package(Qt5Network REQUIRED)
-find_package(Qt5OpenGL REQUIRED)
-find_package(Qt5Widgets REQUIRED)
-find_package(Qt5Sql REQUIRED)
-
-# Qt5 always build OpenGL ES2 which is the compatibility
-# mode. Qt5 will take care of translating the desktop
-# version of OpenGL to ES2.
-add_definitions("-DMBGL_USE_GLES2")
-
-set(MBGL_QT_CORE_LIBRARIES
- PUBLIC Qt5::Core
- PUBLIC Qt5::Gui
- PUBLIC Qt5::OpenGL
-)
-
-set(MBGL_QT_FILESOURCE_LIBRARIES
- PUBLIC Qt5::Network
- PUBLIC Qt5::Sql
-)
-
-target_link_libraries(mbgl-qt
- PRIVATE Qt5::Widgets
-)
-
-xcode_create_scheme(TARGET mbgl-qt)
-
-# OS specific configurations
-if (MASON_PLATFORM STREQUAL "osx" OR MASON_PLATFORM STREQUAL "ios")
- list(APPEND MBGL_QT_CORE_FILES
- PRIVATE platform/darwin/src/nsthread.mm
- )
- list(APPEND MBGL_QT_CORE_LIBRARIES
- PRIVATE "-framework Foundation"
- )
-elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
- list(APPEND MBGL_QT_CORE_FILES
- PRIVATE platform/default/src/mbgl/util/thread.cpp
- )
-elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
- add_definitions("-DQT_COMPILING_QIMAGE_COMPAT_CPP")
- add_definitions("-DRAPIDJSON_HAS_CXX11_RVALUE_REFS")
- add_definitions("-D_USE_MATH_DEFINES")
-
- add_definitions("-Wno-deprecated-declarations")
- add_definitions("-Wno-macro-redefined")
- add_definitions("-Wno-microsoft-exception-spec")
- add_definitions("-Wno-unknown-argument")
- add_definitions("-Wno-unknown-warning-option")
- add_definitions("-Wno-unused-command-line-argument")
- add_definitions("-Wno-unused-local-typedef")
- add_definitions("-Wno-unused-private-field")
- add_definitions("-Wno-inconsistent-missing-override")
-
- list(APPEND MBGL_QT_CORE_FILES
- PRIVATE platform/qt/src/thread.cpp
- )
-elseif (CMAKE_HOST_SYSTEM_NAME STREQUAL "QNX")
- list(APPEND MBGL_QT_CORE_FILES
- PRIVATE platform/qt/src/thread.cpp
- )
- add_definitions("-Wno-narrowing")
-endif()
-
-add_custom_command(
- TARGET qmapboxgl
- POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy_directory
- ${CMAKE_SOURCE_DIR}/platform/qt/include
- ${CMAKE_CURRENT_BINARY_DIR}/platform/qt/include
-)
-
-xcode_create_scheme(TARGET qmapboxgl)
diff --git a/platform/qt/test/qmapboxgl.test.cpp b/platform/qt/test/qmapboxgl.test.cpp
index de0314f0ee..604bdde896 100644
--- a/platform/qt/test/qmapboxgl.test.cpp
+++ b/platform/qt/test/qmapboxgl.test.cpp
@@ -1,11 +1,14 @@
#include "qmapboxgl.test.hpp"
-#include <mbgl/util/io.hpp>
-
#include <QMapbox>
+#include <QFile>
+#include <QGuiApplication>
#include <QOpenGLContext>
#include <QOpenGLFunctions>
+#include <QTextStream>
+
+#include <mbgl/test/util.hpp>
QMapboxGLTest::QMapboxGLTest() : size(512, 512), fbo((assert(widget.context()->isValid()), widget.makeCurrent(), size)), map(nullptr, settings, size) {
connect(&map, SIGNAL(mapChanged(QMapboxGL::MapChange)),
@@ -43,8 +46,12 @@ void QMapboxGLTest::onNeedsRendering() {
TEST_F(QMapboxGLTest, TEST_DISABLED_ON_CI(styleJson)) {
- QString json = QString::fromStdString(
- mbgl::util::read_file("test/fixtures/resources/style_vector.json"));
+ QFile f("test/fixtures/resources/style_vector.json");
+
+ ASSERT_TRUE(f.open(QFile::ReadOnly | QFile::Text));
+
+ QTextStream in(&f);
+ QString json = in.readAll();
map.setStyleJson(json);
ASSERT_EQ(map.styleJson(), json);
diff --git a/platform/qt/test/qmapboxgl.test.hpp b/platform/qt/test/qmapboxgl.test.hpp
index 43a7c123b7..3591dbc9d8 100644
--- a/platform/qt/test/qmapboxgl.test.hpp
+++ b/platform/qt/test/qmapboxgl.test.hpp
@@ -1,11 +1,10 @@
-#include <mbgl/test/util.hpp>
-
-#include <QApplication>
#include <QMapboxGL>
#include <QGLWidget>
#include <QGLFramebufferObject>
+#include <gtest/gtest.h>
+
class QMapboxGLTest : public QObject, public ::testing::Test {
Q_OBJECT
diff --git a/render-test/main.cpp b/render-test/main.cpp
index 3ab48fe5b2..fcdbe3ab55 100644
--- a/render-test/main.cpp
+++ b/render-test/main.cpp
@@ -19,6 +19,7 @@
#define ANSI_COLOR_LIGHT_GRAY "\x1b[90m"
#define ANSI_COLOR_RESET "\x1b[0m"
+#if !defined(SANITIZE)
void* operator new(std::size_t sz) {
void* ptr = AllocationIndex::allocate(sz);
if (!ptr) throw std::bad_alloc{};
@@ -33,6 +34,7 @@ void operator delete(void* ptr) noexcept {
void operator delete(void* ptr, size_t) noexcept {
AllocationIndex::deallocate(ptr);
}
+#endif
int main(int argc, char** argv) {
bool recycleMap;
diff --git a/render-test/runner.cpp b/render-test/runner.cpp
index 54660979cf..5c8f53759f 100644
--- a/render-test/runner.cpp
+++ b/render-test/runner.cpp
@@ -1,5 +1,6 @@
#include <mbgl/map/camera.hpp>
#include <mbgl/map/map_observer.hpp>
+#include <mbgl/renderer/renderer.hpp>
#include <mbgl/style/conversion/filter.hpp>
#include <mbgl/style/conversion/layer.hpp>
#include <mbgl/style/conversion/light.hpp>
@@ -7,11 +8,11 @@
#include <mbgl/style/image.hpp>
#include <mbgl/style/layer.hpp>
#include <mbgl/style/light.hpp>
-#include <mbgl/style/style.hpp>
#include <mbgl/style/rapidjson_conversion.hpp>
+#include <mbgl/style/style.hpp>
#include <mbgl/util/chrono.hpp>
-#include <mbgl/util/io.hpp>
#include <mbgl/util/image.hpp>
+#include <mbgl/util/io.hpp>
#include <mbgl/util/run_loop.hpp>
#include <mbgl/util/string.hpp>
#include <mbgl/util/timer.hpp>
@@ -197,6 +198,9 @@ bool TestRunner::runOperations(const std::string& key, TestMetadata& metadata) {
static const std::string memoryProbeOp("probeMemory");
static const std::string memoryProbeStartOp("probeMemoryStart");
static const std::string memoryProbeEndOp("probeMemoryEnd");
+ static const std::string setFeatureStateOp("setFeatureState");
+ static const std::string getFeatureStateOp("getFeatureState");
+ static const std::string removeFeatureStateOp("removeFeatureState");
// wait
if (operationArray[0].GetString() == waitOp) {
@@ -453,6 +457,141 @@ bool TestRunner::runOperations(const std::string& key, TestMetadata& metadata) {
assert(AllocationIndex::isActive());
AllocationIndex::setActive(false);
AllocationIndex::reset();
+
+ // setFeatureState
+ } else if (operationArray[0].GetString() == setFeatureStateOp) {
+ assert(operationArray.Size() >= 3u);
+ assert(operationArray[1].IsObject());
+ assert(operationArray[2].IsObject());
+
+ using namespace mbgl;
+ using namespace mbgl::style::conversion;
+
+ std::string sourceID;
+ mbgl::optional<std::string> sourceLayer;
+ std::string featureID;
+ std::string stateKey;
+ Value stateValue;
+ bool valueParsed = false;
+ FeatureState parsedState;
+
+ const auto& featureOptions = operationArray[1].GetObject();
+ if (featureOptions.HasMember("source")) {
+ sourceID = featureOptions["source"].GetString();
+ }
+ if (featureOptions.HasMember("sourceLayer")) {
+ sourceLayer = {featureOptions["sourceLayer"].GetString()};
+ }
+ if (featureOptions.HasMember("id")) {
+ featureID = featureOptions["id"].GetString();
+ }
+ const JSValue* state = &operationArray[2];
+
+ const std::function<optional<Error>(const std::string&, const Convertible&)> convertFn =
+ [&](const std::string& k, const Convertible& v) -> optional<Error> {
+ optional<Value> value = toValue(v);
+ if (value) {
+ stateValue = std::move(*value);
+ valueParsed = true;
+ } else if (isArray(v)) {
+ std::vector<Value> array;
+ std::size_t length = arrayLength(v);
+ array.reserve(length);
+ for (size_t i = 0; i < length; ++i) {
+ optional<Value> arrayVal = toValue(arrayMember(v, i));
+ if (arrayVal) {
+ array.emplace_back(*arrayVal);
+ }
+ }
+ std::unordered_map<std::string, Value> result;
+ result[k] = std::move(array);
+ stateValue = std::move(result);
+ valueParsed = true;
+ return {};
+
+ } else if (isObject(v)) {
+ eachMember(v, convertFn);
+ }
+
+ if (!valueParsed) {
+ metadata.errorMessage = std::string("Could not get feature state value, state key: ") + k;
+ return nullopt;
+ }
+ stateKey = k;
+ parsedState[stateKey] = stateValue;
+ return nullopt;
+ };
+
+ eachMember(state, convertFn);
+
+ try {
+ frontend.render(map);
+ } catch (const std::exception&) {
+ return false;
+ }
+ frontend.getRenderer()->setFeatureState(sourceID, sourceLayer, featureID, parsedState);
+
+ // getFeatureState
+ } else if (operationArray[0].GetString() == getFeatureStateOp) {
+ assert(operationArray.Size() >= 2u);
+ assert(operationArray[1].IsObject());
+
+ std::string sourceID;
+ mbgl::optional<std::string> sourceLayer;
+ std::string featureID;
+
+ const auto& featureOptions = operationArray[1].GetObject();
+ if (featureOptions.HasMember("source")) {
+ sourceID = featureOptions["source"].GetString();
+ }
+ if (featureOptions.HasMember("sourceLayer")) {
+ sourceLayer = {featureOptions["sourceLayer"].GetString()};
+ }
+ if (featureOptions.HasMember("id")) {
+ featureID = featureOptions["id"].GetString();
+ }
+
+ try {
+ frontend.render(map);
+ } catch (const std::exception&) {
+ return false;
+ }
+ mbgl::FeatureState state;
+ frontend.getRenderer()->getFeatureState(state, sourceID, sourceLayer, featureID);
+
+ // removeFeatureState
+ } else if (operationArray[0].GetString() == removeFeatureStateOp) {
+ assert(operationArray.Size() >= 2u);
+ assert(operationArray[1].IsObject());
+
+ std::string sourceID;
+ mbgl::optional<std::string> sourceLayer;
+ std::string featureID;
+ mbgl::optional<std::string> stateKey;
+
+ const auto& featureOptions = operationArray[1].GetObject();
+ if (featureOptions.HasMember("source")) {
+ sourceID = featureOptions["source"].GetString();
+ }
+ if (featureOptions.HasMember("sourceLayer")) {
+ sourceLayer = {featureOptions["sourceLayer"].GetString()};
+ }
+ if (featureOptions.HasMember("id")) {
+ featureID = featureOptions["id"].GetString();
+ }
+
+ if (operationArray.Size() >= 3u) {
+ assert(operationArray[2].IsString());
+ stateKey = {operationArray[2].GetString()};
+ }
+
+ try {
+ frontend.render(map);
+ } catch (const std::exception&) {
+ return false;
+ }
+ frontend.getRenderer()->removeFeatureState(sourceID, sourceLayer, featureID, stateKey);
+
} else {
metadata.errorMessage = std::string("Unsupported operation: ") + operationArray[0].GetString();
return false;
diff --git a/scripts/ci/Dockerfile b/scripts/ci/Dockerfile
new file mode 100644
index 0000000000..648581044f
--- /dev/null
+++ b/scripts/ci/Dockerfile
@@ -0,0 +1,110 @@
+FROM ubuntu:disco-20190718
+
+ENV DEBIAN_FRONTEND="noninteractive"
+ENV ANDROID_HOME="/opt/android"
+
+WORKDIR /src
+
+# Use faster mirrors from Finland
+COPY etc/apt/sources.list /etc/apt
+
+RUN set -eu \
+ && apt-get update\
+ && apt-get dist-upgrade -y
+
+# CI requirements
+RUN set -eu && apt-get install -y \
+ ca-certificates \
+ git \
+ gzip \
+ ssh \
+ tar
+
+# Base dependencies
+RUN set -eu && apt-get install -y \
+ ccache \
+ clang-8 \
+ clang-format-8 \
+ clang-tidy-8 \
+ cmake \
+ fonts-noto \
+ g++-8 \
+ libc++-8-dev \
+ libc++abi-8-dev \
+ mesa-common-dev \
+ ninja-build \
+ nodejs \
+ npm \
+ pkg-config \
+ python3-pip \
+ software-properties-common \
+ xvfb
+
+RUN pip3 install cmake_format
+
+# Linux dependencies
+RUN set -eu && apt-get install -y \
+ libcurl4-openssl-dev \
+ libgl1-mesa-dev \
+ libglfw3-dev \
+ libicu-dev \
+ libjpeg-turbo8-dev \
+ libpng-dev \
+ libuv1-dev \
+ zlib1g-dev
+
+# Qt dependencies
+RUN set -eu && apt-get install -y \
+ qdoc-qt5 \
+ qt5-default
+
+# Android dependencies
+RUN set -eu && apt-get install -y \
+ coreutils \
+ curl \
+ openjdk-8-jdk-headless \
+ unzip
+
+# Install old compilers
+RUN set -eu \
+ && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1E9377A2BA9EF27F \
+ && add-apt-repository "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu xenial main" \
+ && add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe" \
+ && apt-get install -y \
+ g++-4.9 \
+ g++-5
+
+# Install Android NDK
+RUN set -eu \
+ && mkdir -p ${ANDROID_HOME} && cd ${ANDROID_HOME} \
+ && curl -L --retry 3 https://dl.google.com/android/repository/android-ndk-r19-linux-x86_64.zip -o ndk.zip \
+ && (echo "f02ad84cb5b6e1ff3eea9e6168037c823408c8ac ndk.zip" | sha1sum -c) \
+ && unzip -q ndk.zip && rm ndk.zip && mv android-ndk-r* ndk-bundle
+
+
+RUN set -eu \
+ && cd ${ANDROID_HOME} \
+ && curl -L --retry 3 https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip -o tools.zip \
+ && (echo "92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9 tools.zip" | sha256sum -c) \
+ && unzip -q tools.zip && rm tools.zip
+
+RUN set -eu \
+ && yes | ${ANDROID_HOME}/tools/bin/sdkmanager \
+ "platform-tools" \
+ "platforms;android-26" \
+ "build-tools;26.0.3" \
+ "platforms;android-27" \
+ "build-tools;27.0.3" \
+ "platforms;android-28" \
+ "build-tools;28.0.3" \
+ "extras;android;m2repository" \
+ "patcher;v4" \
+ "extras;google;m2repository" \
+ "extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2" \
+ "cmake;3.10.2.4988404"
+
+# Configure ccache
+RUN set -eu && /usr/sbin/update-ccache-symlinks
+
+# Cleanup
+RUN set -eu && apt-get clean
diff --git a/scripts/ci/etc/apt/sources.list b/scripts/ci/etc/apt/sources.list
new file mode 100644
index 0000000000..c5359e131a
--- /dev/null
+++ b/scripts/ci/etc/apt/sources.list
@@ -0,0 +1,10 @@
+deb http://fi.archive.ubuntu.com/ubuntu/ disco main restricted
+deb http://fi.archive.ubuntu.com/ubuntu/ disco-updates main restricted
+deb http://fi.archive.ubuntu.com/ubuntu/ disco universe
+deb http://fi.archive.ubuntu.com/ubuntu/ disco-updates universe
+deb http://fi.archive.ubuntu.com/ubuntu/ disco multiverse
+deb http://fi.archive.ubuntu.com/ubuntu/ disco-updates multiverse
+deb http://fi.archive.ubuntu.com/ubuntu/ disco-backports main restricted universe multiverse
+deb http://security.ubuntu.com/ubuntu/ disco-security main restricted
+deb http://security.ubuntu.com/ubuntu/ disco-security universe
+deb http://security.ubuntu.com/ubuntu/ disco-security multiverse
diff --git a/platform/ios/scripts/trigger-external-deploy-steps.sh b/scripts/trigger-maps-documentation-deploy-steps.sh
index c1ee7c783f..128b7cda8b 100755
--- a/platform/ios/scripts/trigger-external-deploy-steps.sh
+++ b/scripts/trigger-maps-documentation-deploy-steps.sh
@@ -10,6 +10,7 @@ SDK_FLAVOR=${SDK_FLAVOR:-"maps"}
step "Triggering automated site and documentation generation for ${SDK_FLAVOR} SDK ${VERSION_TAG}"
+# No branch specified, so default branch will be used
request_body="{
\"request\": {
\"message\": \"[${SDK_FLAVOR}] ${VERSION_TAG} automated site and documentation generation\",
@@ -25,10 +26,11 @@ request_body="{
step "Making request…"
+# Request URL set to docs-sandbox while testing
curl -s -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Travis-API-Version: 3" \
-H "Authorization: token ${TRAVISCI_API_TOKEN}" \
-d "${request_body}" \
- https://api.travis-ci.com/repo/mapbox%2Fios-sdk/requests
+ https://api.travis-ci.com/repo/mapbox%2F${DOCS_REPO}/requests
diff --git a/src/core-files.json b/src/core-files.json
index 9453e504bb..4867bd3dc4 100644
--- a/src/core-files.json
+++ b/src/core-files.json
@@ -134,6 +134,7 @@
"src/mbgl/renderer/renderer.cpp",
"src/mbgl/renderer/renderer_impl.cpp",
"src/mbgl/renderer/renderer_state.cpp",
+ "src/mbgl/renderer/source_state.cpp",
"src/mbgl/renderer/sources/render_custom_geometry_source.cpp",
"src/mbgl/renderer/sources/render_geojson_source.cpp",
"src/mbgl/renderer/sources/render_image_source.cpp",
@@ -463,6 +464,7 @@
"mbgl/util/compression.hpp": "include/mbgl/util/compression.hpp",
"mbgl/util/constants.hpp": "include/mbgl/util/constants.hpp",
"mbgl/util/convert.hpp": "include/mbgl/util/convert.hpp",
+ "mbgl/util/default_styles.hpp": "include/mbgl/util/default_styles.hpp",
"mbgl/util/enum.hpp": "include/mbgl/util/enum.hpp",
"mbgl/util/event.hpp": "include/mbgl/util/event.hpp",
"mbgl/util/exception.hpp": "include/mbgl/util/exception.hpp",
@@ -655,6 +657,7 @@
"mbgl/renderer/render_tile.hpp": "src/mbgl/renderer/render_tile.hpp",
"mbgl/renderer/render_tree.hpp": "src/mbgl/renderer/render_tree.hpp",
"mbgl/renderer/renderer_impl.hpp": "src/mbgl/renderer/renderer_impl.hpp",
+ "mbgl/renderer/source_state.hpp": "src/mbgl/renderer/source_state.hpp",
"mbgl/renderer/sources/render_custom_geometry_source.hpp": "src/mbgl/renderer/sources/render_custom_geometry_source.hpp",
"mbgl/renderer/sources/render_geojson_source.hpp": "src/mbgl/renderer/sources/render_geojson_source.hpp",
"mbgl/renderer/sources/render_image_source.hpp": "src/mbgl/renderer/sources/render_image_source.hpp",
diff --git a/src/mbgl/annotation/annotation_source.cpp b/src/mbgl/annotation/annotation_source.cpp
index 68f36f2d3a..7a137f1881 100644
--- a/src/mbgl/annotation/annotation_source.cpp
+++ b/src/mbgl/annotation/annotation_source.cpp
@@ -1,5 +1,6 @@
-#include <mbgl/annotation/annotation_source.hpp>
#include <mbgl/annotation/annotation_manager.hpp>
+#include <mbgl/annotation/annotation_source.hpp>
+#include <mbgl/style/layer.hpp>
namespace mbgl {
@@ -21,4 +22,8 @@ optional<std::string> AnnotationSource::Impl::getAttribution() const {
return {};
}
+bool AnnotationSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return !std::strcmp(info->type, "line") || !std::strcmp(info->type, "symbol") || !std::strcmp(info->type, "fill");
+}
+
} // namespace mbgl
diff --git a/src/mbgl/annotation/annotation_source.hpp b/src/mbgl/annotation/annotation_source.hpp
index 018e2136ea..0379426b3e 100644
--- a/src/mbgl/annotation/annotation_source.hpp
+++ b/src/mbgl/annotation/annotation_source.hpp
@@ -12,13 +12,12 @@ public:
class Impl;
const Impl& impl() const;
+private:
+ void loadDescription(FileSource&) final;
+ bool supportsLayerType(const mbgl::style::LayerTypeInfo*) const override;
mapbox::base::WeakPtr<Source> makeWeakPtr() override {
return weakFactory.makeWeakPtr();
}
-
-private:
- void loadDescription(FileSource&) final;
-
Mutable<Impl> mutableImpl() const;
mapbox::base::WeakPtrFactory<Source> weakFactory {this};
};
diff --git a/src/mbgl/annotation/render_annotation_source.cpp b/src/mbgl/annotation/render_annotation_source.cpp
index 903825d5f5..e3acfcb3c0 100644
--- a/src/mbgl/annotation/render_annotation_source.cpp
+++ b/src/mbgl/annotation/render_annotation_source.cpp
@@ -49,7 +49,7 @@ RenderAnnotationSource::queryRenderedFeatures(const ScreenLineString& geometry,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) const {
- return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix);
+ return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix, {});
}
std::vector<Feature> RenderAnnotationSource::querySourceFeatures(const SourceQueryOptions&) const {
diff --git a/src/mbgl/geometry/feature_index.cpp b/src/mbgl/geometry/feature_index.cpp
index b76e02be3f..20026dd117 100644
--- a/src/mbgl/geometry/feature_index.cpp
+++ b/src/mbgl/geometry/feature_index.cpp
@@ -1,13 +1,14 @@
#include <mbgl/geometry/feature_index.hpp>
-#include <mbgl/renderer/render_layer.hpp>
-#include <mbgl/renderer/query.hpp>
+#include <mbgl/math/minmax.hpp>
#include <mbgl/renderer/layers/render_symbol_layer.hpp>
+#include <mbgl/renderer/query.hpp>
+#include <mbgl/renderer/render_layer.hpp>
+#include <mbgl/renderer/source_state.hpp>
+#include <mbgl/style/filter.hpp>
#include <mbgl/text/collision_index.hpp>
+#include <mbgl/tile/tile_id.hpp>
#include <mbgl/util/constants.hpp>
#include <mbgl/util/math.hpp>
-#include <mbgl/math/minmax.hpp>
-#include <mbgl/style/filter.hpp>
-#include <mbgl/tile/tile_id.hpp>
#include <mapbox/geometry/envelope.hpp>
@@ -38,18 +39,12 @@ void FeatureIndex::insert(const GeometryCollection& geometries,
}
}
-void FeatureIndex::query(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState& transformState,
- const mat4& posMatrix,
- const double tileSize,
- const double scale,
- const RenderedQueryOptions& queryOptions,
- const UnwrappedTileID& tileID,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const float additionalQueryPadding) const {
-
+void FeatureIndex::query(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState& transformState,
+ const mat4& posMatrix, const double tileSize, const double scale,
+ const RenderedQueryOptions& queryOptions, const UnwrappedTileID& tileID,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const float additionalQueryPadding, const SourceFeatureState& sourceFeatureState) const {
if (!tileData) {
return;
}
@@ -74,10 +69,11 @@ void FeatureIndex::query(
if (indexedFeature.sortIndex == previousSortIndex) continue;
previousSortIndex = indexedFeature.sortIndex;
- addFeature(result, indexedFeature, queryOptions, tileID.canonical, layers, queryGeometry, transformState, pixelsToTileUnits, posMatrix);
+ addFeature(result, indexedFeature, queryOptions, tileID.canonical, layers, queryGeometry, transformState,
+ pixelsToTileUnits, posMatrix, &sourceFeatureState);
}
}
-
+
std::unordered_map<std::string, std::vector<Feature>>
FeatureIndex::lookupSymbolFeatures(const std::vector<IndexedSubfeature>& symbolFeatures,
const RenderedQueryOptions& queryOptions,
@@ -113,22 +109,19 @@ FeatureIndex::lookupSymbolFeatures(const std::vector<IndexedSubfeature>& symbolF
for (const auto& symbolFeature : sortedFeatures) {
mat4 unusedMatrix;
- addFeature(result, symbolFeature, queryOptions, tileID.canonical, layers, GeometryCoordinates(), {}, 0, unusedMatrix);
+ addFeature(result, symbolFeature, queryOptions, tileID.canonical, layers, GeometryCoordinates(), {}, 0,
+ unusedMatrix, nullptr);
}
return result;
}
-void FeatureIndex::addFeature(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const IndexedSubfeature& indexedFeature,
- const RenderedQueryOptions& options,
- const CanonicalTileID& tileID,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const GeometryCoordinates& queryGeometry,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4& posMatrix) const {
-
+void FeatureIndex::addFeature(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const IndexedSubfeature& indexedFeature, const RenderedQueryOptions& options,
+ const CanonicalTileID& tileID,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const GeometryCoordinates& queryGeometry, const TransformState& transformState,
+ const float pixelsToTileUnits, const mat4& posMatrix,
+ const SourceFeatureState* sourceFeatureState) const {
// Lazily calculated.
std::unique_ptr<GeometryTileLayer> sourceLayer;
std::unique_ptr<GeometryTileFeature> geometryTileFeature;
@@ -148,10 +141,18 @@ void FeatureIndex::addFeature(
geometryTileFeature = sourceLayer->getFeature(indexedFeature.index);
assert(geometryTileFeature);
}
+ FeatureState state;
+ if (sourceFeatureState != nullptr) {
+ optional<std::string> idStr = featureIDtoString(geometryTileFeature->getID());
+ if (idStr) {
+ sourceFeatureState->getState(state, sourceLayer->getName(), *idStr);
+ }
+ }
bool needsCrossTileIndex = renderLayer->baseImpl->getTypeInfo()->crossTileIndex == style::LayerTypeInfo::CrossTileIndex::Required;
if (!needsCrossTileIndex &&
- !renderLayer->queryIntersectsFeature(queryGeometry, *geometryTileFeature, tileID.z, transformState, pixelsToTileUnits, posMatrix)) {
+ !renderLayer->queryIntersectsFeature(queryGeometry, *geometryTileFeature, tileID.z, transformState,
+ pixelsToTileUnits, posMatrix, state)) {
continue;
}
@@ -159,7 +160,11 @@ void FeatureIndex::addFeature(
continue;
}
- result[layerID].emplace_back(convertFeature(*geometryTileFeature, tileID));
+ Feature feature = convertFeature(*geometryTileFeature, tileID);
+ feature.source = renderLayer->baseImpl->source;
+ feature.sourceLayer = sourceLayer->getName();
+ feature.state = state;
+ result[layerID].emplace_back(feature);
}
}
diff --git a/src/mbgl/geometry/feature_index.hpp b/src/mbgl/geometry/feature_index.hpp
index 1a212761fa..5a006a51bc 100644
--- a/src/mbgl/geometry/feature_index.hpp
+++ b/src/mbgl/geometry/feature_index.hpp
@@ -16,6 +16,7 @@ namespace mbgl {
class RenderedQueryOptions;
class RenderLayer;
class TransformState;
+class SourceFeatureState;
class CollisionIndex;
@@ -58,17 +59,11 @@ public:
void insert(const GeometryCollection&, std::size_t index, const std::string& sourceLayerName, const std::string& bucketLeaderID);
- void query(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState&,
- const mat4& posMatrix,
- const double tileSize,
- const double scale,
- const RenderedQueryOptions& options,
- const UnwrappedTileID&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const float additionalQueryPadding) const;
+ void query(std::unordered_map<std::string, std::vector<Feature>>& result, const GeometryCoordinates& queryGeometry,
+ const TransformState&, const mat4& posMatrix, const double tileSize, const double scale,
+ const RenderedQueryOptions& options, const UnwrappedTileID&,
+ const std::unordered_map<std::string, const RenderLayer*>&, const float additionalQueryPadding,
+ const SourceFeatureState& sourceFeatureState) const;
static optional<GeometryCoordinates> translateQueryGeometry(
const GeometryCoordinates& queryGeometry,
@@ -87,16 +82,12 @@ public:
const std::shared_ptr<std::vector<size_t>>& featureSortOrder) const;
private:
- void addFeature(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const IndexedSubfeature&,
- const RenderedQueryOptions& options,
- const CanonicalTileID&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const GeometryCoordinates& queryGeometry,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4& posMatrix) const;
+ void addFeature(std::unordered_map<std::string, std::vector<Feature>>& result, const IndexedSubfeature&,
+ const RenderedQueryOptions& options, const CanonicalTileID&,
+ const std::unordered_map<std::string, const RenderLayer*>&,
+ const GeometryCoordinates& queryGeometry, const TransformState& transformState,
+ const float pixelsToTileUnits, const mat4& posMatrix,
+ const SourceFeatureState* sourceFeatureState) const;
GridIndex<IndexedSubfeature> grid;
unsigned int sortIndex = 0;
diff --git a/src/mbgl/gfx/vertex_vector.hpp b/src/mbgl/gfx/vertex_vector.hpp
index 59fe67586b..091ecb912e 100644
--- a/src/mbgl/gfx/vertex_vector.hpp
+++ b/src/mbgl/gfx/vertex_vector.hpp
@@ -20,6 +20,11 @@ public:
v.resize(v.size() + n, val);
}
+ Vertex& at(std::size_t n) {
+ assert(n < v.size());
+ return v.at(n);
+ }
+
std::size_t elements() const {
return v.size();
}
diff --git a/src/mbgl/layout/pattern_layout.hpp b/src/mbgl/layout/pattern_layout.hpp
index 858d515347..d6d878955f 100644
--- a/src/mbgl/layout/pattern_layout.hpp
+++ b/src/mbgl/layout/pattern_layout.hpp
@@ -108,7 +108,7 @@ public:
const PatternLayerMap& patterns = patternFeature.patterns;
const GeometryCollection& geometries = feature->getGeometries();
- bucket->addFeature(*feature, geometries, patternPositions, patterns);
+ bucket->addFeature(*feature, geometries, patternPositions, patterns, i);
featureIndex->insert(geometries, i, sourceLayerID, bucketLeaderID);
}
if (bucket->hasData()) {
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp
index 1dbb5d91dc..81d1d9a5b6 100644
--- a/src/mbgl/layout/symbol_layout.cpp
+++ b/src/mbgl/layout/symbol_layout.cpp
@@ -713,7 +713,8 @@ void SymbolLayout::createBucket(const ImagePositions&, std::unique_ptr<FeatureIn
}
for (auto& pair : bucket->paintProperties) {
- pair.second.iconBinders.populateVertexVectors(feature, iconBuffer.vertices.elements(), {}, {});
+ pair.second.iconBinders.populateVertexVectors(feature, iconBuffer.vertices.elements(),
+ symbolInstance.dataFeatureIndex, {}, {});
}
}
@@ -765,7 +766,8 @@ void SymbolLayout::updatePaintPropertiesForSection(SymbolBucket& bucket,
std::size_t sectionIndex) {
const auto& formattedSection = sectionOptionsToValue((*feature.formattedText).sectionAt(sectionIndex));
for (auto& pair : bucket.paintProperties) {
- pair.second.textBinders.populateVertexVectors(feature, bucket.text.vertices.elements(), {}, {}, formattedSection);
+ pair.second.textBinders.populateVertexVectors(feature, bucket.text.vertices.elements(), feature.index, {}, {},
+ formattedSection);
}
}
diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp
index a978c06d6b..6c74b8309f 100644
--- a/src/mbgl/renderer/bucket.hpp
+++ b/src/mbgl/renderer/bucket.hpp
@@ -32,10 +32,10 @@ public:
// Feature geometries are also used to populate the feature index.
// Obtaining these is a costly operation, so we do it only once, and
// pass-by-const-ref the geometries as a second parameter.
- virtual void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const ImagePositions&,
- const PatternLayerMap&) {};
+ virtual void addFeature(const GeometryTileFeature&, const GeometryCollection&, const ImagePositions&,
+ const PatternLayerMap&, std::size_t){};
+
+ virtual void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) {}
// As long as this bucket has a Prepare render pass, this function is getting called. Typically,
// this only happens once when the bucket is being rendered for the first time.
diff --git a/src/mbgl/renderer/buckets/circle_bucket.cpp b/src/mbgl/renderer/buckets/circle_bucket.cpp
index 7ba130da64..560a74781a 100644
--- a/src/mbgl/renderer/buckets/circle_bucket.cpp
+++ b/src/mbgl/renderer/buckets/circle_bucket.cpp
@@ -25,8 +25,10 @@ CircleBucket::CircleBucket(const BucketParameters& parameters, const std::vector
CircleBucket::~CircleBucket() = default;
void CircleBucket::upload(gfx::UploadPass& uploadPass) {
- vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
- indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ if (!uploaded) {
+ vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
+ indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ }
for (auto& pair : paintPropertyBinders) {
pair.second.upload(uploadPass);
@@ -39,10 +41,8 @@ bool CircleBucket::hasData() const {
return !segments.empty();
}
-void CircleBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry,
- const ImagePositions&,
- const PatternLayerMap&) {
+void CircleBucket::addFeature(const GeometryTileFeature& feature, const GeometryCollection& geometry,
+ const ImagePositions&, const PatternLayerMap&, std::size_t featureIndex) {
constexpr const uint16_t vertexLength = 4;
for (auto& circle : geometry) {
@@ -90,7 +90,7 @@ void CircleBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.elements(), {}, {});
+ pair.second.populateVertexVectors(feature, vertices.elements(), featureIndex, {}, {});
}
}
@@ -112,4 +112,13 @@ float CircleBucket::getQueryRadius(const RenderLayer& layer) const {
return radius + stroke + util::length(translate[0], translate[1]);
}
+void CircleBucket::update(const FeatureStates& states, const GeometryTileLayer& layer, const std::string& layerID,
+ const ImagePositions& imagePositions) {
+ auto it = paintPropertyBinders.find(layerID);
+ if (it != paintPropertyBinders.end()) {
+ it->second.updateVertexVectors(states, layer, imagePositions);
+ uploaded = false;
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/circle_bucket.hpp b/src/mbgl/renderer/buckets/circle_bucket.hpp
index 27423bc568..e514f8a5f2 100644
--- a/src/mbgl/renderer/buckets/circle_bucket.hpp
+++ b/src/mbgl/renderer/buckets/circle_bucket.hpp
@@ -18,10 +18,8 @@ public:
CircleBucket(const BucketParameters&, const std::vector<Immutable<style::LayerProperties>>&);
~CircleBucket() override;
- void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const ImagePositions&,
- const PatternLayerMap&) override;
+ void addFeature(const GeometryTileFeature&, const GeometryCollection&, const ImagePositions&,
+ const PatternLayerMap&, std::size_t) override;
bool hasData() const override;
@@ -29,6 +27,8 @@ public:
float getQueryRadius(const RenderLayer&) const override;
+ void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override;
+
gfx::VertexVector<CircleLayoutVertex> vertices;
gfx::IndexVector<gfx::Triangles> triangles;
SegmentVector<CircleAttributes> segments;
diff --git a/src/mbgl/renderer/buckets/fill_bucket.cpp b/src/mbgl/renderer/buckets/fill_bucket.cpp
index 8a089c679e..6660934f8d 100644
--- a/src/mbgl/renderer/buckets/fill_bucket.cpp
+++ b/src/mbgl/renderer/buckets/fill_bucket.cpp
@@ -44,10 +44,9 @@ FillBucket::FillBucket(const FillBucket::PossiblyEvaluatedLayoutProperties,
FillBucket::~FillBucket() = default;
-void FillBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry,
- const ImagePositions& patternPositions,
- const PatternLayerMap& patternDependencies) {
+void FillBucket::addFeature(const GeometryTileFeature& feature, const GeometryCollection& geometry,
+ const ImagePositions& patternPositions, const PatternLayerMap& patternDependencies,
+ std::size_t index) {
for (auto& polygon : classifyRings(geometry)) {
// Optimize polygons with many interior rings for earcut tesselation.
limitHoles(polygon, 500);
@@ -114,17 +113,20 @@ void FillBucket::addFeature(const GeometryTileFeature& feature,
for (auto& pair : paintPropertyBinders) {
const auto it = patternDependencies.find(pair.first);
if (it != patternDependencies.end()){
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, it->second);
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, it->second);
} else {
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, {});
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, {});
}
}
}
void FillBucket::upload(gfx::UploadPass& uploadPass) {
- vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
- lineIndexBuffer = uploadPass.createIndexBuffer(std::move(lines));
- triangleIndexBuffer = triangles.empty() ? optional<gfx::IndexBuffer> {} : uploadPass.createIndexBuffer(std::move(triangles));
+ if (!uploaded) {
+ vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
+ lineIndexBuffer = uploadPass.createIndexBuffer(std::move(lines));
+ triangleIndexBuffer =
+ triangles.empty() ? optional<gfx::IndexBuffer>{} : uploadPass.createIndexBuffer(std::move(triangles));
+ }
for (auto& pair : paintPropertyBinders) {
pair.second.upload(uploadPass);
@@ -143,4 +145,13 @@ float FillBucket::getQueryRadius(const RenderLayer& layer) const {
return util::length(translate[0], translate[1]);
}
+void FillBucket::update(const FeatureStates& states, const GeometryTileLayer& layer, const std::string& layerID,
+ const ImagePositions& imagePositions) {
+ auto it = paintPropertyBinders.find(layerID);
+ if (it != paintPropertyBinders.end()) {
+ it->second.updateVertexVectors(states, layer, imagePositions);
+ uploaded = false;
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/fill_bucket.hpp b/src/mbgl/renderer/buckets/fill_bucket.hpp
index 6747c1083f..9f65e774ca 100644
--- a/src/mbgl/renderer/buckets/fill_bucket.hpp
+++ b/src/mbgl/renderer/buckets/fill_bucket.hpp
@@ -26,10 +26,8 @@ public:
const float zoom,
const uint32_t overscaling);
- void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const mbgl::ImagePositions&,
- const PatternLayerMap&) override;
+ void addFeature(const GeometryTileFeature&, const GeometryCollection&, const mbgl::ImagePositions&,
+ const PatternLayerMap&, std::size_t) override;
bool hasData() const override;
@@ -37,6 +35,8 @@ public:
float getQueryRadius(const RenderLayer&) const override;
+ void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override;
+
gfx::VertexVector<FillLayoutVertex> vertices;
gfx::IndexVector<gfx::Lines> lines;
gfx::IndexVector<gfx::Triangles> triangles;
diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
index be13850e55..698895fdcf 100644
--- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
+++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.cpp
@@ -50,10 +50,9 @@ FillExtrusionBucket::FillExtrusionBucket(const FillExtrusionBucket::PossiblyEval
FillExtrusionBucket::~FillExtrusionBucket() = default;
-void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry,
- const ImagePositions& patternPositions,
- const PatternLayerMap& patternDependencies) {
+void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature, const GeometryCollection& geometry,
+ const ImagePositions& patternPositions, const PatternLayerMap& patternDependencies,
+ std::size_t index) {
for (auto& polygon : classifyRings(geometry)) {
// Optimize polygons with many interior rings for earcut tesselation.
limitHoles(polygon, 500);
@@ -158,16 +157,18 @@ void FillExtrusionBucket::addFeature(const GeometryTileFeature& feature,
for (auto& pair : paintPropertyBinders) {
const auto it = patternDependencies.find(pair.first);
if (it != patternDependencies.end()){
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, it->second);
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, it->second);
} else {
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, {});
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, {});
}
}
}
void FillExtrusionBucket::upload(gfx::UploadPass& uploadPass) {
- vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
- indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ if (!uploaded) {
+ vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
+ indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ }
for (auto& pair : paintPropertyBinders) {
pair.second.upload(uploadPass);
@@ -186,4 +187,13 @@ float FillExtrusionBucket::getQueryRadius(const RenderLayer& layer) const {
return util::length(translate[0], translate[1]);
}
+void FillExtrusionBucket::update(const FeatureStates& states, const GeometryTileLayer& layer,
+ const std::string& layerID, const ImagePositions& imagePositions) {
+ auto it = paintPropertyBinders.find(layerID);
+ if (it != paintPropertyBinders.end()) {
+ it->second.updateVertexVectors(states, layer, imagePositions);
+ uploaded = false;
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
index 4c97618a77..8535f99b70 100644
--- a/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
+++ b/src/mbgl/renderer/buckets/fill_extrusion_bucket.hpp
@@ -24,10 +24,8 @@ public:
const float,
const uint32_t);
- void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const mbgl::ImagePositions&,
- const PatternLayerMap&) override;
+ void addFeature(const GeometryTileFeature&, const GeometryCollection&, const mbgl::ImagePositions&,
+ const PatternLayerMap&, std::size_t) override;
bool hasData() const override;
@@ -35,6 +33,8 @@ public:
float getQueryRadius(const RenderLayer&) const override;
+ void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override;
+
gfx::VertexVector<FillExtrusionLayoutVertex> vertices;
gfx::IndexVector<gfx::Triangles> triangles;
SegmentVector<FillExtrusionAttributes> triangleSegments;
diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.cpp b/src/mbgl/renderer/buckets/heatmap_bucket.cpp
index fad78f6cec..78c4fb7507 100644
--- a/src/mbgl/renderer/buckets/heatmap_bucket.cpp
+++ b/src/mbgl/renderer/buckets/heatmap_bucket.cpp
@@ -39,10 +39,8 @@ bool HeatmapBucket::hasData() const {
return !segments.empty();
}
-void HeatmapBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometry,
- const ImagePositions&,
- const PatternLayerMap&) {
+void HeatmapBucket::addFeature(const GeometryTileFeature& feature, const GeometryCollection& geometry,
+ const ImagePositions&, const PatternLayerMap&, std::size_t featureIndex) {
constexpr const uint16_t vertexLength = 4;
for (auto& points : geometry) {
@@ -89,7 +87,7 @@ void HeatmapBucket::addFeature(const GeometryTileFeature& feature,
}
for (auto& pair : paintPropertyBinders) {
- pair.second.populateVertexVectors(feature, vertices.elements(), {}, {});
+ pair.second.populateVertexVectors(feature, vertices.elements(), featureIndex, {}, {});
}
}
diff --git a/src/mbgl/renderer/buckets/heatmap_bucket.hpp b/src/mbgl/renderer/buckets/heatmap_bucket.hpp
index 68790bf5bf..04d4170b50 100644
--- a/src/mbgl/renderer/buckets/heatmap_bucket.hpp
+++ b/src/mbgl/renderer/buckets/heatmap_bucket.hpp
@@ -18,10 +18,8 @@ public:
HeatmapBucket(const BucketParameters&, const std::vector<Immutable<style::LayerProperties>>&);
~HeatmapBucket() override;
- void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const ImagePositions&,
- const PatternLayerMap&) override;
+ void addFeature(const GeometryTileFeature&, const GeometryCollection&, const ImagePositions&,
+ const PatternLayerMap&, std::size_t) override;
bool hasData() const override;
void upload(gfx::UploadPass&) override;
diff --git a/src/mbgl/renderer/buckets/line_bucket.cpp b/src/mbgl/renderer/buckets/line_bucket.cpp
index 9019e76d3b..f65c239968 100644
--- a/src/mbgl/renderer/buckets/line_bucket.cpp
+++ b/src/mbgl/renderer/buckets/line_bucket.cpp
@@ -30,10 +30,9 @@ LineBucket::LineBucket(const style::LineLayoutProperties::PossiblyEvaluated layo
LineBucket::~LineBucket() = default;
-void LineBucket::addFeature(const GeometryTileFeature& feature,
- const GeometryCollection& geometryCollection,
- const ImagePositions& patternPositions,
- const PatternLayerMap& patternDependencies) {
+void LineBucket::addFeature(const GeometryTileFeature& feature, const GeometryCollection& geometryCollection,
+ const ImagePositions& patternPositions, const PatternLayerMap& patternDependencies,
+ std::size_t index) {
for (auto& line : geometryCollection) {
addGeometry(line, feature);
}
@@ -41,14 +40,13 @@ void LineBucket::addFeature(const GeometryTileFeature& feature,
for (auto& pair : paintPropertyBinders) {
const auto it = patternDependencies.find(pair.first);
if (it != patternDependencies.end()){
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, it->second);
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, it->second);
} else {
- pair.second.populateVertexVectors(feature, vertices.elements(), patternPositions, {});
+ pair.second.populateVertexVectors(feature, vertices.elements(), index, patternPositions, {});
}
}
}
-
/*
* Sharp corners cause dashed lines to tilt because the distance along the line
* is the same at both the inner and outer corners. To improve the appearance of
@@ -517,8 +515,10 @@ void LineBucket::addPieSliceVertex(const GeometryCoordinate& currentVertex,
}
void LineBucket::upload(gfx::UploadPass& uploadPass) {
- vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
- indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ if (!uploaded) {
+ vertexBuffer = uploadPass.createVertexBuffer(std::move(vertices));
+ indexBuffer = uploadPass.createIndexBuffer(std::move(triangles));
+ }
for (auto& pair : paintPropertyBinders) {
pair.second.upload(uploadPass);
@@ -554,4 +554,13 @@ float LineBucket::getQueryRadius(const RenderLayer& layer) const {
return lineWidth / 2.0f + std::abs(offset) + util::length(translate[0], translate[1]);
}
+void LineBucket::update(const FeatureStates& states, const GeometryTileLayer& layer, const std::string& layerID,
+ const ImagePositions& imagePositions) {
+ auto it = paintPropertyBinders.find(layerID);
+ if (it != paintPropertyBinders.end()) {
+ it->second.updateVertexVectors(states, layer, imagePositions);
+ uploaded = false;
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/buckets/line_bucket.hpp b/src/mbgl/renderer/buckets/line_bucket.hpp
index eac9e14e4c..6343aab2be 100644
--- a/src/mbgl/renderer/buckets/line_bucket.hpp
+++ b/src/mbgl/renderer/buckets/line_bucket.hpp
@@ -26,10 +26,8 @@ public:
const uint32_t overscaling);
~LineBucket() override;
- void addFeature(const GeometryTileFeature&,
- const GeometryCollection&,
- const mbgl::ImagePositions& patternPositions,
- const PatternLayerMap&) override;
+ void addFeature(const GeometryTileFeature&, const GeometryCollection&, const mbgl::ImagePositions& patternPositions,
+ const PatternLayerMap&, std::size_t) override;
bool hasData() const override;
@@ -37,6 +35,8 @@ public:
float getQueryRadius(const RenderLayer&) const override;
+ void update(const FeatureStates&, const GeometryTileLayer&, const std::string&, const ImagePositions&) override;
+
PossiblyEvaluatedLayoutProperties layout;
gfx::VertexVector<LineLayoutVertex> vertices;
diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp
index ea0c20f124..b88a026e11 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.cpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.cpp
@@ -141,13 +141,10 @@ GeometryCoordinates projectQueryGeometry(const GeometryCoordinates& queryGeometr
return projectedGeometry;
}
-bool RenderCircleLayer::queryIntersectsFeature(
- const GeometryCoordinates& queryGeometry,
- const GeometryTileFeature& feature,
- const float zoom,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4& posMatrix) const {
+bool RenderCircleLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry,
+ const GeometryTileFeature& feature, const float zoom,
+ const TransformState& transformState, const float pixelsToTileUnits,
+ const mat4& posMatrix, const FeatureState& featureState) const {
const auto& evaluated = static_cast<const CircleLayerProperties&>(*evaluatedProperties).evaluated;
// Translate query geometry
const GeometryCoordinates& translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
@@ -158,8 +155,8 @@ bool RenderCircleLayer::queryIntersectsFeature(
pixelsToTileUnits).value_or(queryGeometry);
// Evaluate functions
- auto radius = evaluated.evaluate<style::CircleRadius>(zoom, feature);
- auto stroke = evaluated.evaluate<style::CircleStrokeWidth>(zoom, feature);
+ auto radius = evaluated.evaluate<style::CircleRadius>(zoom, feature, featureState);
+ auto stroke = evaluated.evaluate<style::CircleStrokeWidth>(zoom, feature, featureState);
auto size = radius + stroke;
// For pitch-alignment: map, compare feature geometry to query geometry in the plane of the tile
diff --git a/src/mbgl/renderer/layers/render_circle_layer.hpp b/src/mbgl/renderer/layers/render_circle_layer.hpp
index 9348e48929..70af20f0cf 100644
--- a/src/mbgl/renderer/layers/render_circle_layer.hpp
+++ b/src/mbgl/renderer/layers/render_circle_layer.hpp
@@ -18,13 +18,8 @@ private:
bool hasCrossfade() const override;
void render(PaintParameters&) override;
- bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const override;
+ bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const override;
// Paint properties
style::CirclePaintProperties::Unevaluated unevaluated;
diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
index 835e8c8ee5..fc830e462c 100644
--- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
+++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp
@@ -224,13 +224,11 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters) {
}
}
-bool RenderFillExtrusionLayer::queryIntersectsFeature(
- const GeometryCoordinates& queryGeometry,
- const GeometryTileFeature& feature,
- const float,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4&) const {
+bool RenderFillExtrusionLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry,
+ const GeometryTileFeature& feature, const float,
+ const TransformState& transformState,
+ const float pixelsToTileUnits, const mat4&,
+ const FeatureState&) const {
const auto& evaluated = static_cast<const FillExtrusionLayerProperties&>(*evaluatedProperties).evaluated;
auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
queryGeometry,
diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp
index 8bd1f52adf..0e6a747c71 100644
--- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp
+++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp
@@ -20,13 +20,8 @@ private:
bool is3D() const override;
void render(PaintParameters&) override;
- bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const override;
+ bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const override;
// Paint properties
style::FillExtrusionPaintProperties::Unevaluated unevaluated;
diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp
index 27cb76fede..e855866eea 100644
--- a/src/mbgl/renderer/layers/render_fill_layer.cpp
+++ b/src/mbgl/renderer/layers/render_fill_layer.cpp
@@ -249,13 +249,10 @@ void RenderFillLayer::render(PaintParameters& parameters) {
}
}
-bool RenderFillLayer::queryIntersectsFeature(
- const GeometryCoordinates& queryGeometry,
- const GeometryTileFeature& feature,
- const float,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4&) const {
+bool RenderFillLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry,
+ const GeometryTileFeature& feature, const float,
+ const TransformState& transformState, const float pixelsToTileUnits,
+ const mat4&, const FeatureState&) const {
const auto& evaluated = getEvaluated<FillLayerProperties>(evaluatedProperties);
auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
queryGeometry,
@@ -267,5 +264,4 @@ bool RenderFillLayer::queryIntersectsFeature(
return util::polygonIntersectsMultiPolygon(translatedQueryGeometry.value_or(queryGeometry), feature.getGeometries());
}
-
} // namespace mbgl
diff --git a/src/mbgl/renderer/layers/render_fill_layer.hpp b/src/mbgl/renderer/layers/render_fill_layer.hpp
index 79adc9dab4..12484dbfb1 100644
--- a/src/mbgl/renderer/layers/render_fill_layer.hpp
+++ b/src/mbgl/renderer/layers/render_fill_layer.hpp
@@ -21,13 +21,8 @@ private:
bool hasCrossfade() const override;
void render(PaintParameters&) override;
- bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const override;
+ bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const override;
// Paint properties
style::FillPaintProperties::Unevaluated unevaluated;
diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp
index 4fa20ffd13..797aedd297 100644
--- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp
+++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp
@@ -219,13 +219,10 @@ void RenderHeatmapLayer::updateColorRamp() {
}
}
-bool RenderHeatmapLayer::queryIntersectsFeature(
- const GeometryCoordinates& queryGeometry,
- const GeometryTileFeature& feature,
- const float zoom,
- const TransformState&,
- const float pixelsToTileUnits,
- const mat4&) const {
+bool RenderHeatmapLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry,
+ const GeometryTileFeature& feature, const float zoom,
+ const TransformState&, const float pixelsToTileUnits, const mat4&,
+ const FeatureState&) const {
(void) queryGeometry;
(void) feature;
(void) zoom;
diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.hpp b/src/mbgl/renderer/layers/render_heatmap_layer.hpp
index 27e27adb28..1e9b1063ae 100644
--- a/src/mbgl/renderer/layers/render_heatmap_layer.hpp
+++ b/src/mbgl/renderer/layers/render_heatmap_layer.hpp
@@ -22,13 +22,8 @@ private:
void upload(gfx::UploadPass&) override;
void render(PaintParameters&) override;
- bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const override;
+ bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const override;
// Paint properties
style::HeatmapPaintProperties::Unevaluated unevaluated;
diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp
index 6d635f65e7..36665c1db4 100644
--- a/src/mbgl/renderer/layers/render_line_layer.cpp
+++ b/src/mbgl/renderer/layers/render_line_layer.cpp
@@ -257,13 +257,10 @@ GeometryCollection offsetLine(const GeometryCollection& rings, double offset) {
} // namespace
-bool RenderLineLayer::queryIntersectsFeature(
- const GeometryCoordinates& queryGeometry,
- const GeometryTileFeature& feature,
- const float zoom,
- const TransformState& transformState,
- const float pixelsToTileUnits,
- const mat4&) const {
+bool RenderLineLayer::queryIntersectsFeature(const GeometryCoordinates& queryGeometry,
+ const GeometryTileFeature& feature, const float zoom,
+ const TransformState& transformState, const float pixelsToTileUnits,
+ const mat4&, const FeatureState& featureState) const {
const auto& evaluated = static_cast<const LineLayerProperties&>(*evaluatedProperties).evaluated;
// Translate query geometry
auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry(
@@ -274,10 +271,11 @@ bool RenderLineLayer::queryIntersectsFeature(
pixelsToTileUnits);
// Evaluate function
- auto offset = evaluated.get<style::LineOffset>()
- .evaluate(feature, zoom, style::LineOffset::defaultValue()) * pixelsToTileUnits;
+ auto offset =
+ evaluated.get<style::LineOffset>().evaluate(feature, zoom, featureState, style::LineOffset::defaultValue()) *
+ pixelsToTileUnits;
// Test intersection
- const float halfWidth = getLineWidth(feature, zoom) / 2.0 * pixelsToTileUnits;
+ const auto halfWidth = static_cast<float>(getLineWidth(feature, zoom, featureState) / 2.0 * pixelsToTileUnits);
// Apply offset to geometry
if (offset != 0.0f && !feature.getGeometries().empty()) {
@@ -314,12 +312,13 @@ void RenderLineLayer::updateColorRamp() {
}
}
-float RenderLineLayer::getLineWidth(const GeometryTileFeature& feature, const float zoom) const {
+float RenderLineLayer::getLineWidth(const GeometryTileFeature& feature, const float zoom,
+ const FeatureState& featureState) const {
const auto& evaluated = static_cast<const LineLayerProperties&>(*evaluatedProperties).evaluated;
- float lineWidth = evaluated.get<style::LineWidth>()
- .evaluate(feature, zoom, style::LineWidth::defaultValue());
- float gapWidth = evaluated.get<style::LineGapWidth>()
- .evaluate(feature, zoom, style::LineGapWidth::defaultValue());
+ float lineWidth =
+ evaluated.get<style::LineWidth>().evaluate(feature, zoom, featureState, style::LineWidth::defaultValue());
+ float gapWidth =
+ evaluated.get<style::LineGapWidth>().evaluate(feature, zoom, featureState, style::LineGapWidth::defaultValue());
if (gapWidth) {
return gapWidth + 2 * lineWidth;
} else {
diff --git a/src/mbgl/renderer/layers/render_line_layer.hpp b/src/mbgl/renderer/layers/render_line_layer.hpp
index 4454d215d9..1914a82b77 100644
--- a/src/mbgl/renderer/layers/render_line_layer.hpp
+++ b/src/mbgl/renderer/layers/render_line_layer.hpp
@@ -24,18 +24,13 @@ private:
void upload(gfx::UploadPass&) override;
void render(PaintParameters&) override;
- bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const override;
+ bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const override;
// Paint properties
style::LinePaintProperties::Unevaluated unevaluated;
- float getLineWidth(const GeometryTileFeature&, const float) const;
+ float getLineWidth(const GeometryTileFeature&, const float, const FeatureState&) const;
void updateColorRamp();
PremultipliedImage colorRamp;
diff --git a/src/mbgl/renderer/paint_property_binder.hpp b/src/mbgl/renderer/paint_property_binder.hpp
index cd6b259e88..1a36f8a2e5 100644
--- a/src/mbgl/renderer/paint_property_binder.hpp
+++ b/src/mbgl/renderer/paint_property_binder.hpp
@@ -19,6 +19,15 @@
namespace mbgl {
+// Maps vertex range to feature index
+struct FeatureVertexRange {
+ std::size_t featureIndex;
+ std::size_t start;
+ std::size_t end;
+};
+
+using FeatureVertexRangeMap = std::map<std::string, std::vector<FeatureVertexRange>>;
+
/*
ZoomInterpolatedAttribute<Attr> is a 'compound' attribute, representing two values of the
the base attribute Attr. These two values are provided to the shader to allow interpolation
@@ -96,10 +105,14 @@ public:
virtual ~PaintPropertyBinder() = default;
- virtual void populateVertexVector(const GeometryTileFeature& feature,
- std::size_t length, const ImagePositions&,
- const optional<PatternDependency>&,
+ virtual void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, std::size_t index,
+ const ImagePositions&, const optional<PatternDependency>&,
const style::expression::Value&) = 0;
+
+ virtual void updateVertexVectors(const FeatureStates&, const GeometryTileLayer&, const ImagePositions&) {}
+
+ virtual void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) = 0;
+
virtual void upload(gfx::UploadPass&) = 0;
virtual void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, const CrossfadeParameters&) = 0;
virtual std::tuple<ExpandToType<As, optional<gfx::AttributeBinding>>...> attributeBinding(const PossiblyEvaluatedType& currentValue) const = 0;
@@ -118,7 +131,9 @@ public:
: constant(std::move(constant_)) {
}
- void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&, const optional<PatternDependency>&, const style::expression::Value&) override {}
+ void populateVertexVector(const GeometryTileFeature&, std::size_t, std::size_t, const ImagePositions&,
+ const optional<PatternDependency>&, const style::expression::Value&) override {}
+ void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) override {}
void upload(gfx::UploadPass&) override {}
void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, const CrossfadeParameters&) override {};
@@ -145,7 +160,9 @@ public:
: constant(std::move(constant_)), constantPatternPositions({}) {
}
- void populateVertexVector(const GeometryTileFeature&, std::size_t, const ImagePositions&, const optional<PatternDependency>&, const style::expression::Value&) override {}
+ void populateVertexVector(const GeometryTileFeature&, std::size_t, std::size_t, const ImagePositions&,
+ const optional<PatternDependency>&, const style::expression::Value&) override {}
+ void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) override {}
void upload(gfx::UploadPass&) override {}
void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, const CrossfadeParameters&) override {
@@ -187,14 +204,50 @@ public:
defaultValue(std::move(defaultValue_)) {
}
void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, const CrossfadeParameters&) override {};
- void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&, const optional<PatternDependency>&, const style::expression::Value& formattedSection) override {
+ void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, std::size_t index,
+ const ImagePositions&, const optional<PatternDependency>&,
+ const style::expression::Value& formattedSection) override {
using style::expression::EvaluationContext;
auto evaluated = expression.evaluate(EvaluationContext(&feature).withFormattedSection(&formattedSection), defaultValue);
this->statistics.add(evaluated);
auto value = attributeValue(evaluated);
- for (std::size_t i = vertexVector.elements(); i < length; ++i) {
+ auto elements = vertexVector.elements();
+ for (std::size_t i = elements; i < length; ++i) {
vertexVector.emplace_back(BaseVertex { value });
}
+ optional<std::string> idStr = featureIDtoString(feature.getID());
+ if (idStr) {
+ featureMap[*idStr].emplace_back(FeatureVertexRange{index, elements, length});
+ }
+ }
+
+ void updateVertexVectors(const FeatureStates& states, const GeometryTileLayer& layer,
+ const ImagePositions&) override {
+ for (const auto& it : states) {
+ const auto positions = featureMap.find(it.first);
+ if (positions == featureMap.end()) {
+ continue;
+ }
+
+ for (const auto& pos : positions->second) {
+ std::unique_ptr<GeometryTileFeature> feature = layer.getFeature(pos.featureIndex);
+ if (feature) {
+ updateVertexVector(pos.start, pos.end, *feature, it.second);
+ }
+ }
+ }
+ }
+
+ void updateVertexVector(std::size_t start, std::size_t end, const GeometryTileFeature& feature,
+ const FeatureState& state) override {
+ using style::expression::EvaluationContext;
+
+ auto evaluated = expression.evaluate(EvaluationContext(&feature).withFeatureState(&state), defaultValue);
+ this->statistics.add(evaluated);
+ auto value = attributeValue(evaluated);
+ for (std::size_t i = start; i < end; ++i) {
+ vertexVector.at(i) = BaseVertex{value};
+ }
}
void upload(gfx::UploadPass& uploadPass) override {
@@ -229,6 +282,7 @@ private:
T defaultValue;
gfx::VertexVector<BaseVertex> vertexVector;
optional<gfx::VertexBuffer<BaseVertex>> vertexBuffer;
+ FeatureVertexRangeMap featureMap;
};
template <class T, class A>
@@ -245,7 +299,9 @@ public:
zoomRange({zoom, zoom + 1}) {
}
void setPatternParameters(const optional<ImagePosition>&, const optional<ImagePosition>&, const CrossfadeParameters&) override {};
- void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, const ImagePositions&, const optional<PatternDependency>&, const style::expression::Value& formattedSection) override {
+ void populateVertexVector(const GeometryTileFeature& feature, std::size_t length, std::size_t index,
+ const ImagePositions&, const optional<PatternDependency>&,
+ const style::expression::Value& formattedSection) override {
using style::expression::EvaluationContext;
Range<T> range = {
expression.evaluate(EvaluationContext(zoomRange.min, &feature).withFormattedSection(&formattedSection), defaultValue),
@@ -256,9 +312,47 @@ public:
AttributeValue value = zoomInterpolatedAttributeValue(
attributeValue(range.min),
attributeValue(range.max));
- for (std::size_t i = vertexVector.elements(); i < length; ++i) {
+ auto elements = vertexVector.elements();
+ for (std::size_t i = elements; i < length; ++i) {
vertexVector.emplace_back(Vertex { value });
}
+ optional<std::string> idStr = featureIDtoString(feature.getID());
+ if (idStr) {
+ featureMap[*idStr].emplace_back(FeatureVertexRange{index, elements, length});
+ }
+ }
+
+ void updateVertexVectors(const FeatureStates& states, const GeometryTileLayer& layer,
+ const ImagePositions&) override {
+ for (const auto& it : states) {
+ const auto positions = featureMap.find(it.first);
+ if (positions == featureMap.end()) {
+ continue;
+ }
+
+ for (const auto& pos : positions->second) {
+ std::unique_ptr<GeometryTileFeature> feature = layer.getFeature(pos.featureIndex);
+ if (feature) {
+ updateVertexVector(pos.start, pos.end, *feature, it.second);
+ }
+ }
+ }
+ }
+
+ void updateVertexVector(std::size_t start, std::size_t end, const GeometryTileFeature& feature,
+ const FeatureState& state) override {
+ using style::expression::EvaluationContext;
+ Range<T> range = {
+ expression.evaluate(EvaluationContext(zoomRange.min, &feature, &state), defaultValue),
+ expression.evaluate(EvaluationContext(zoomRange.max, &feature, &state), defaultValue),
+ };
+ this->statistics.add(range.min);
+ this->statistics.add(range.max);
+ AttributeValue value = zoomInterpolatedAttributeValue(attributeValue(range.min), attributeValue(range.max));
+
+ for (std::size_t i = start; i < end; ++i) {
+ vertexVector.at(i) = Vertex{value};
+ }
}
void upload(gfx::UploadPass& uploadPass) override {
@@ -298,6 +392,7 @@ private:
Range<float> zoomRange;
gfx::VertexVector<Vertex> vertexVector;
optional<gfx::VertexBuffer<Vertex>> vertexBuffer;
+ FeatureVertexRangeMap featureMap;
};
template <class T, class A1, class A2>
@@ -322,8 +417,10 @@ public:
crossfade = crossfade_;
};
- void populateVertexVector(const GeometryTileFeature&, std::size_t length, const ImagePositions& patternPositions, const optional<PatternDependency>& patternDependencies, const style::expression::Value&) override {
-
+ void populateVertexVector(const GeometryTileFeature&, std::size_t length, std::size_t /* index */,
+ const ImagePositions& patternPositions,
+ const optional<PatternDependency>& patternDependencies,
+ const style::expression::Value&) override {
if (!patternDependencies || patternDependencies->mid.empty()) {
// Unlike other propperties with expressions that evaluate to null, the default value for `*-pattern` properties is an empty
// string and will not have a valid entry in patternPositions. We still need to populate the attribute buffers to avoid crashes
@@ -353,6 +450,8 @@ public:
}
}
+ void updateVertexVector(std::size_t, std::size_t, const GeometryTileFeature&, const FeatureState&) override {}
+
void upload(gfx::UploadPass& uploadPass) override {
if (!patternToVertexVector.empty()) {
assert(!zoomInVertexVector.empty());
@@ -491,10 +590,18 @@ public:
PaintPropertyBinders(PaintPropertyBinders&&) = default;
PaintPropertyBinders(const PaintPropertyBinders&) = delete;
- void populateVertexVectors(const GeometryTileFeature& feature, std::size_t length, const ImagePositions& patternPositions, const optional<PatternDependency>& patternDependencies, const style::expression::Value& formattedSection = {}) {
- util::ignore({
- (binders.template get<Ps>()->populateVertexVector(feature, length, patternPositions, patternDependencies, formattedSection), 0)...
- });
+ void populateVertexVectors(const GeometryTileFeature& feature, std::size_t length, std::size_t index,
+ const ImagePositions& patternPositions,
+ const optional<PatternDependency>& patternDependencies,
+ const style::expression::Value& formattedSection = {}) {
+ util::ignore({(binders.template get<Ps>()->populateVertexVector(feature, length, index, patternPositions,
+ patternDependencies, formattedSection),
+ 0)...});
+ }
+
+ void updateVertexVectors(const FeatureStates& states, const GeometryTileLayer& layer,
+ const ImagePositions& imagePositions) {
+ util::ignore({(binders.template get<Ps>()->updateVertexVectors(states, layer, imagePositions), 0)...});
}
void setPatternParameters(const optional<ImagePosition>& posA, const optional<ImagePosition>& posB, const CrossfadeParameters& crossfade) const {
diff --git a/src/mbgl/renderer/possibly_evaluated_property_value.hpp b/src/mbgl/renderer/possibly_evaluated_property_value.hpp
index 625235011c..1198e43aae 100644
--- a/src/mbgl/renderer/possibly_evaluated_property_value.hpp
+++ b/src/mbgl/renderer/possibly_evaluated_property_value.hpp
@@ -49,6 +49,14 @@ public:
}
);
}
+
+ template <class Feature>
+ T evaluate(const Feature& feature, float zoom, const FeatureState& featureState, T defaultValue) const {
+ return this->match([&](const T& constant_) { return constant_; },
+ [&](const style::PropertyExpression<T>& expression) {
+ return expression.evaluate(zoom, feature, featureState, defaultValue);
+ });
+ }
};
template <class T>
diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp
index 75c729444b..ba3c638f88 100644
--- a/src/mbgl/renderer/render_layer.hpp
+++ b/src/mbgl/renderer/render_layer.hpp
@@ -88,13 +88,10 @@ public:
// Check wether the given geometry intersects
// with the feature
- virtual bool queryIntersectsFeature(
- const GeometryCoordinates&,
- const GeometryTileFeature&,
- const float,
- const TransformState&,
- const float,
- const mat4&) const { return false; };
+ virtual bool queryIntersectsFeature(const GeometryCoordinates&, const GeometryTileFeature&, const float,
+ const TransformState&, const float, const mat4&, const FeatureState&) const {
+ return false;
+ };
virtual void prepare(const LayerPrepareParameters&);
diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp
index a62ccb0a0a..a1280331b1 100644
--- a/src/mbgl/renderer/render_orchestrator.cpp
+++ b/src/mbgl/renderer/render_orchestrator.cpp
@@ -562,6 +562,29 @@ FeatureExtensionValue RenderOrchestrator::queryFeatureExtensions(const std::stri
return {};
}
+void RenderOrchestrator::setFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const std::string& featureID, const FeatureState& state) {
+ if (RenderSource* renderSource = getRenderSource(sourceID)) {
+ renderSource->setFeatureState(sourceLayerID, featureID, state);
+ }
+}
+
+void RenderOrchestrator::getFeatureState(FeatureState& state, const std::string& sourceID,
+ const optional<std::string>& sourceLayerID,
+ const std::string& featureID) const {
+ if (RenderSource* renderSource = getRenderSource(sourceID)) {
+ renderSource->getFeatureState(state, sourceLayerID, featureID);
+ }
+}
+
+void RenderOrchestrator::removeFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const optional<std::string>& featureID,
+ const optional<std::string>& stateKey) {
+ if (RenderSource* renderSource = getRenderSource(sourceID)) {
+ renderSource->removeFeatureState(sourceLayerID, featureID, stateKey);
+ }
+}
+
void RenderOrchestrator::reduceMemoryUse() {
filteredLayersForSource.shrink_to_fit();
for (const auto& entry : renderSources) {
diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp
index 884bd21b7b..34b623348f 100644
--- a/src/mbgl/renderer/render_orchestrator.hpp
+++ b/src/mbgl/renderer/render_orchestrator.hpp
@@ -64,6 +64,15 @@ public:
const std::string& extensionField,
const optional<std::map<std::string, Value>>& args) const;
+ void setFeatureState(const std::string& sourceID, const optional<std::string>& layerID,
+ const std::string& featureID, const FeatureState& state);
+
+ void getFeatureState(FeatureState& state, const std::string& sourceID, const optional<std::string>& layerID,
+ const std::string& featureID) const;
+
+ void removeFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const optional<std::string>& featureID, const optional<std::string>& stateKey);
+
void reduceMemoryUse();
void dumpDebugLogs();
diff --git a/src/mbgl/renderer/render_source.hpp b/src/mbgl/renderer/render_source.hpp
index cd471223a8..ee90e1c4d0 100644
--- a/src/mbgl/renderer/render_source.hpp
+++ b/src/mbgl/renderer/render_source.hpp
@@ -93,6 +93,13 @@ public:
return {};
}
+ virtual void setFeatureState(const optional<std::string>&, const std::string&, const FeatureState&) {}
+
+ virtual void getFeatureState(FeatureState&, const optional<std::string>&, const std::string&) const {}
+
+ virtual void removeFeatureState(const optional<std::string>&, const optional<std::string>&,
+ const optional<std::string>&) {}
+
virtual void reduceMemoryUse() = 0;
virtual void dumpDebugLogs() const = 0;
diff --git a/src/mbgl/renderer/render_tile.cpp b/src/mbgl/renderer/render_tile.cpp
index 65a6cb9f30..0d63e5b265 100644
--- a/src/mbgl/renderer/render_tile.cpp
+++ b/src/mbgl/renderer/render_tile.cpp
@@ -227,4 +227,8 @@ void RenderTile::finishRender(PaintParameters& parameters) const {
}
}
+void RenderTile::setFeatureState(const LayerFeatureStates& states) {
+ tile.setFeatureState(states);
+}
+
} // namespace mbgl
diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp
index 34d027cae5..483dbf7413 100644
--- a/src/mbgl/renderer/render_tile.hpp
+++ b/src/mbgl/renderer/render_tile.hpp
@@ -68,6 +68,9 @@ public:
style::TranslateAnchorType anchor,
const TransformState& state,
const bool inViewportPixelUnits) const;
+
+ void setFeatureState(const LayerFeatureStates&);
+
private:
Tile& tile;
// The following members are reset at placement stage.
diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp
index 52cd7a4351..cf4072036c 100644
--- a/src/mbgl/renderer/renderer.cpp
+++ b/src/mbgl/renderer/renderer.cpp
@@ -109,6 +109,21 @@ FeatureExtensionValue Renderer::queryFeatureExtensions(const std::string& source
return impl->orchestrator.queryFeatureExtensions(sourceID, feature, extension, extensionField, args);
}
+void Renderer::setFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const std::string& featureID, const FeatureState& state) {
+ impl->orchestrator.setFeatureState(sourceID, sourceLayerID, featureID, state);
+}
+
+void Renderer::getFeatureState(FeatureState& state, const std::string& sourceID,
+ const optional<std::string>& sourceLayerID, const std::string& featureID) const {
+ impl->orchestrator.getFeatureState(state, sourceID, sourceLayerID, featureID);
+}
+
+void Renderer::removeFeatureState(const std::string& sourceID, const optional<std::string>& sourceLayerID,
+ const optional<std::string>& featureID, const optional<std::string>& stateKey) {
+ impl->orchestrator.removeFeatureState(sourceID, sourceLayerID, featureID, stateKey);
+}
+
void Renderer::dumpDebugLogs() {
impl->orchestrator.dumpDebugLogs();
}
diff --git a/src/mbgl/renderer/source_state.cpp b/src/mbgl/renderer/source_state.cpp
new file mode 100644
index 0000000000..d057c211b5
--- /dev/null
+++ b/src/mbgl/renderer/source_state.cpp
@@ -0,0 +1,132 @@
+#include <mbgl/renderer/render_tile.hpp>
+#include <mbgl/renderer/source_state.hpp>
+#include <mbgl/style/conversion_impl.hpp>
+#include <mbgl/util/logging.hpp>
+
+namespace mbgl {
+
+void SourceFeatureState::updateState(const optional<std::string>& sourceLayerID, const std::string& featureID,
+ const FeatureState& newState) {
+ std::string sourceLayer = sourceLayerID.value_or(std::string());
+ for (const auto& state : newState) {
+ auto& layerStates = stateChanges[sourceLayer];
+ auto& featureStates = layerStates[featureID];
+ featureStates[state.first] = state.second;
+ }
+}
+
+void SourceFeatureState::getState(FeatureState& result, const optional<std::string>& sourceLayerID,
+ const std::string& featureID) const {
+ std::string sourceLayer = sourceLayerID.value_or(std::string());
+ FeatureState current;
+ FeatureState changes;
+ auto layerStates = currentStates.find(sourceLayer);
+ if (layerStates != currentStates.end()) {
+ const auto currentStateEntry = layerStates->second.find(featureID);
+ if (currentStateEntry != layerStates->second.end()) {
+ current = currentStateEntry->second;
+ }
+ }
+
+ layerStates = stateChanges.find(sourceLayer);
+ if (layerStates != stateChanges.end()) {
+ const auto stateChangesEntry = layerStates->second.find(featureID);
+ if (stateChangesEntry != layerStates->second.end()) {
+ changes = stateChangesEntry->second;
+ }
+ }
+ result = std::move(changes);
+ result.insert(current.begin(), current.end());
+}
+
+void SourceFeatureState::coalesceChanges(std::vector<RenderTile>& tiles) {
+ LayerFeatureStates changes;
+ for (const auto& layerStatesEntry : stateChanges) {
+ const auto& sourceLayer = layerStatesEntry.first;
+ FeatureStates layerStates;
+ for (const auto& featureStatesEntry : stateChanges[sourceLayer]) {
+ const auto& featureID = featureStatesEntry.first;
+ for (const auto& stateEntry : stateChanges[sourceLayer][featureID]) {
+ const auto& stateKey = stateEntry.first;
+ const auto& stateVal = stateEntry.second;
+
+ auto currentState = currentStates[sourceLayer][featureID].find(stateKey);
+ if (currentState != currentStates[sourceLayer][featureID].end()) {
+ currentState->second = stateVal;
+ } else {
+ currentStates[sourceLayer][featureID].insert(std::make_pair(stateKey, stateVal));
+ }
+ }
+ layerStates[featureID] = currentStates[sourceLayer][featureID];
+ }
+ changes[sourceLayer] = std::move(layerStates);
+ }
+
+ for (const auto& layerStatesEntry : deletedStates) {
+ const auto& sourceLayer = layerStatesEntry.first;
+ FeatureStates layerStates = {{}, {}};
+
+ if (deletedStates[sourceLayer].empty()) {
+ for (const auto& featureStatesEntry : currentStates[sourceLayer]) {
+ const auto& featureID = featureStatesEntry.first;
+ layerStates[featureID] = {};
+ currentStates[sourceLayer][featureID] = {};
+ }
+ } else {
+ for (const auto& feature : deletedStates[sourceLayer]) {
+ const auto& featureID = feature.first;
+ bool deleteWholeFeatureState = deletedStates[sourceLayer][featureID].empty();
+ if (deleteWholeFeatureState) {
+ currentStates[sourceLayer][featureID] = {};
+ } else {
+ for (const auto& stateEntry : deletedStates[sourceLayer][featureID]) {
+ currentStates[sourceLayer][featureID].erase(stateEntry.first);
+ }
+ }
+ layerStates[featureID] = currentStates[sourceLayer][featureID];
+ }
+ }
+ changes[sourceLayer] = std::move(layerStates);
+ }
+
+ stateChanges.clear();
+ deletedStates.clear();
+
+ if (changes.empty()) {
+ return;
+ }
+
+ for (auto& tile : tiles) {
+ tile.setFeatureState(changes);
+ }
+}
+
+void SourceFeatureState::removeState(const optional<std::string>& sourceLayerID, const optional<std::string>& featureID,
+ const optional<std::string>& stateKey) {
+ std::string sourceLayer = sourceLayerID.value_or(std::string());
+
+ bool sourceLayerDeleted = (deletedStates.count(sourceLayer) > 0) && deletedStates[sourceLayer].empty();
+ if (sourceLayerDeleted) {
+ return;
+ }
+
+ if (stateKey && featureID) {
+ if ((deletedStates.count(sourceLayer) == 0) && (deletedStates[sourceLayer].count(*featureID)) == 0) {
+ deletedStates[sourceLayer][*featureID][*stateKey] = {};
+ }
+ } else if (featureID) {
+ bool updateInQueue =
+ (stateChanges.count(sourceLayer) != 0U) && (stateChanges[sourceLayer].count(*featureID) != 0U);
+ if (updateInQueue) {
+ for (const auto& changeEntry : stateChanges[sourceLayer][*featureID]) {
+ deletedStates[sourceLayer][*featureID][changeEntry.first] = {};
+ }
+ } else {
+ deletedStates[sourceLayer][*featureID] = {};
+ }
+ } else {
+ deletedStates[sourceLayer] = {};
+ }
+}
+
+} // namespace mbgl
diff --git a/src/mbgl/renderer/source_state.hpp b/src/mbgl/renderer/source_state.hpp
new file mode 100644
index 0000000000..7217302630
--- /dev/null
+++ b/src/mbgl/renderer/source_state.hpp
@@ -0,0 +1,29 @@
+#pragma once
+
+#include <mbgl/style/conversion.hpp>
+#include <mbgl/util/feature.hpp>
+
+namespace mbgl {
+
+class RenderTile;
+
+class SourceFeatureState {
+public:
+ SourceFeatureState() = default;
+ ~SourceFeatureState() = default;
+
+ void updateState(const optional<std::string>& sourceLayerID, const std::string& featureID,
+ const FeatureState& newState);
+ void getState(FeatureState& result, const optional<std::string>& sourceLayerID, const std::string& featureID) const;
+ void removeState(const optional<std::string>& sourceLayerID, const optional<std::string>& featureID,
+ const optional<std::string>& stateKey);
+
+ void coalesceChanges(std::vector<RenderTile>& tiles);
+
+private:
+ LayerFeatureStates currentStates;
+ LayerFeatureStates stateChanges;
+ LayerFeatureStates deletedStates;
+};
+
+} // namespace mbgl
diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp
index c5afb38435..221f976c50 100644
--- a/src/mbgl/renderer/sources/render_tile_source.cpp
+++ b/src/mbgl/renderer/sources/render_tile_source.cpp
@@ -68,6 +68,7 @@ void RenderTileSource::prepare(const SourcePrepareParameters& parameters) {
tiles->emplace_back(entry.first, entry.second);
tiles->back().prepare(parameters);
}
+ featureState.coalesceChanges(*tiles);
renderTiles = std::move(tiles);
}
@@ -126,13 +127,29 @@ RenderTileSource::queryRenderedFeatures(const ScreenLineString& geometry,
const std::unordered_map<std::string, const RenderLayer*>& layers,
const RenderedQueryOptions& options,
const mat4& projMatrix) const {
- return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix);
+ return tilePyramid.queryRenderedFeatures(geometry, transformState, layers, options, projMatrix, featureState);
}
std::vector<Feature> RenderTileSource::querySourceFeatures(const SourceQueryOptions& options) const {
return tilePyramid.querySourceFeatures(options);
}
+void RenderTileSource::setFeatureState(const optional<std::string>& sourceLayerID, const std::string& featureID,
+ const FeatureState& state) {
+ featureState.updateState(sourceLayerID, featureID, state);
+}
+
+void RenderTileSource::getFeatureState(FeatureState& state, const optional<std::string>& sourceLayerID,
+ const std::string& featureID) const {
+ featureState.getState(state, sourceLayerID, featureID);
+}
+
+void RenderTileSource::removeFeatureState(const optional<std::string>& sourceLayerID,
+ const optional<std::string>& featureID,
+ const optional<std::string>& stateKey) {
+ featureState.removeState(sourceLayerID, featureID, stateKey);
+}
+
void RenderTileSource::reduceMemoryUse() {
tilePyramid.reduceMemoryUse();
}
diff --git a/src/mbgl/renderer/sources/render_tile_source.hpp b/src/mbgl/renderer/sources/render_tile_source.hpp
index 7edff726d5..7756bd8ed0 100644
--- a/src/mbgl/renderer/sources/render_tile_source.hpp
+++ b/src/mbgl/renderer/sources/render_tile_source.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/renderer/render_source.hpp>
+#include <mbgl/renderer/source_state.hpp>
#include <mbgl/renderer/tile_pyramid.hpp>
#include <mbgl/style/sources/vector_source_impl.hpp>
@@ -34,6 +35,13 @@ public:
std::vector<Feature>
querySourceFeatures(const SourceQueryOptions&) const override;
+ void setFeatureState(const optional<std::string>&, const std::string&, const FeatureState&) override;
+
+ void getFeatureState(FeatureState& state, const optional<std::string>&, const std::string&) const override;
+
+ void removeFeatureState(const optional<std::string>&, const optional<std::string>&,
+ const optional<std::string>&) override;
+
void reduceMemoryUse() override;
void dumpDebugLogs() const override;
@@ -43,7 +51,10 @@ protected:
Immutable<std::vector<RenderTile>> renderTiles;
mutable RenderTiles filteredRenderTiles;
mutable RenderTiles renderTilesSortedByY;
- float bearing = 0.0f;
+
+private:
+ float bearing = 0.0F;
+ SourceFeatureState featureState;
};
/**
diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp
index 7f0fad1500..2bf6e2e1a9 100644
--- a/src/mbgl/renderer/tile_pyramid.cpp
+++ b/src/mbgl/renderer/tile_pyramid.cpp
@@ -278,12 +278,10 @@ void TilePyramid::handleWrapJump(float lng) {
}
}
-
-std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRenderedFeatures(const ScreenLineString& geometry,
- const TransformState& transformState,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) const {
+std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRenderedFeatures(
+ const ScreenLineString& geometry, const TransformState& transformState,
+ const std::unordered_map<std::string, const RenderLayer*>& layers, const RenderedQueryOptions& options,
+ const mat4& projMatrix, const SourceFeatureState& featureState) const {
std::unordered_map<std::string, std::vector<Feature>> result;
if (renderedTiles.empty() || geometry.empty()) {
return result;
@@ -331,12 +329,8 @@ std::unordered_map<std::string, std::vector<Feature>> TilePyramid::queryRendered
tileSpaceQueryGeometry.push_back(TileCoordinate::toGeometryCoordinate(id, c));
}
- tile.queryRenderedFeatures(result,
- tileSpaceQueryGeometry,
- transformState,
- layers,
- options,
- projMatrix);
+ tile.queryRenderedFeatures(result, tileSpaceQueryGeometry, transformState, layers, options, projMatrix,
+ featureState);
}
return result;
diff --git a/src/mbgl/renderer/tile_pyramid.hpp b/src/mbgl/renderer/tile_pyramid.hpp
index f80eb0db78..3b5cab5d6c 100644
--- a/src/mbgl/renderer/tile_pyramid.hpp
+++ b/src/mbgl/renderer/tile_pyramid.hpp
@@ -49,12 +49,10 @@ public:
void handleWrapJump(float lng);
- std::unordered_map<std::string, std::vector<Feature>>
- queryRenderedFeatures(const ScreenLineString& geometry,
- const TransformState& transformState,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) const;
+ std::unordered_map<std::string, std::vector<Feature>> queryRenderedFeatures(
+ const ScreenLineString& geometry, const TransformState& transformState,
+ const std::unordered_map<std::string, const RenderLayer*>&, const RenderedQueryOptions& options,
+ const mat4& projMatrix, const mbgl::SourceFeatureState& featureState) const;
std::vector<Feature> querySourceFeatures(const SourceQueryOptions&) const;
diff --git a/src/mbgl/style/conversion/source.cpp b/src/mbgl/style/conversion/source.cpp
index 5ecbd3b474..de41adc89f 100644
--- a/src/mbgl/style/conversion/source.cpp
+++ b/src/mbgl/style/conversion/source.cpp
@@ -86,8 +86,25 @@ static optional<std::unique_ptr<Source>> convertVectorSource(const std::string&
if (!urlOrTileset) {
return nullopt;
}
-
- return { std::make_unique<VectorSource>(id, std::move(*urlOrTileset)) };
+ auto maxzoomValue = objectMember(value, "maxzoom");
+ optional<float> maxzoom;
+ if (maxzoomValue) {
+ maxzoom = toNumber(*maxzoomValue);
+ if (!maxzoom || *maxzoom < 0 || *maxzoom > std::numeric_limits<uint8_t>::max()) {
+ error.message = "invalid maxzoom";
+ return nullopt;
+ }
+ }
+ auto minzoomValue = objectMember(value, "minzoom");
+ optional<float> minzoom;
+ if (minzoomValue) {
+ minzoom = toNumber(*minzoomValue);
+ if (!minzoom || *minzoom < 0 || *minzoom > std::numeric_limits<uint8_t>::max()) {
+ error.message = "invalid minzoom";
+ return nullopt;
+ }
+ }
+ return {std::make_unique<VectorSource>(id, std::move(*urlOrTileset), std::move(maxzoom), std::move(minzoom))};
}
static optional<std::unique_ptr<Source>> convertGeoJSONSource(const std::string& id,
diff --git a/src/mbgl/style/expression/compound_expression.cpp b/src/mbgl/style/expression/compound_expression.cpp
index c637856ad9..c2bc511e41 100644
--- a/src/mbgl/style/expression/compound_expression.cpp
+++ b/src/mbgl/style/expression/compound_expression.cpp
@@ -675,6 +675,21 @@ const auto& errorCompoundExpression() {
return signature;
}
+const auto& featureStateCompoundExpression() {
+ static auto signature = detail::makeSignature(
+ "feature-state", [](const EvaluationContext& params, const std::string& key) -> Result<Value> {
+ mbgl::Value state;
+ if (params.featureState != nullptr) {
+ auto it = params.featureState->find(key);
+ if (it != params.featureState->end()) {
+ state = mbgl::Value(it->second);
+ }
+ }
+ return toExpressionValue(state);
+ });
+ return signature;
+}
+
// Legacy Filters
const auto& filterEqualsCompoundExpression() {
static auto signature = detail::makeSignature("filter-==", [](const EvaluationContext& params, const std::string& key, const Value &lhs) -> Result<bool> {
@@ -872,81 +887,83 @@ const auto& filterInCompoundExpression() {
}
using ParseCompoundFunction = const std::unique_ptr<detail::SignatureBase>& (*)();
-MAPBOX_ETERNAL_CONSTEXPR const auto compoundExpressionRegistry = mapbox::eternal::hash_map<mapbox::eternal::string, ParseCompoundFunction>({
- { "e", eCompoundExpression },
- { "pi", piCompoundExpression },
- { "ln2", ln2CompoundExpression },
- { "typeof", typeofCompoundExpression },
- { "to-rgba", toRgbaCompoundExpression },
- { "rgba", rgbaCompoundExpression },
- { "rgb", rgbCompoundExpression },
- { "zoom", zoomCompoundExpression },
- { "heatmap-density", heatmapDensityCompoundExpression },
- { "line-progress", lineProgressCompoundExpression },
- { "accumulated", accumulatedCompoundExpression },
- { "has", hasContextCompoundExpression },
- { "has", hasObjectCompoundExpression },
- { "get", getContextCompoundExpression },
- { "get", getObjectCompoundExpression },
- { "properties", propertiesCompoundExpression },
- { "geometry-type", geometryTypeCompoundExpression },
- { "id", idCompoundExpression },
- { "+", plusCompoundExpression },
- { "-", minusCompoundExpression },
- { "-", negateCompoundExpression },
- { "*", multiplyCompoundExpression },
- { "/", divideCompoundExpression },
- { "%", modCompoundExpression },
- { "^", powCompoundExpression },
- { "sqrt", sqrtCompoundExpression },
- { "log10", log10CompoundExpression },
- { "ln", lnCompoundExpression },
- { "log2", log2CompoundExpression },
- { "sin", sinCompoundExpression },
- { "cos", cosCompoundExpression },
- { "tan", tanCompoundExpression },
- { "asin", asinCompoundExpression },
- { "acos", acosCompoundExpression },
- { "atan", atanCompoundExpression },
- { "min", minCompoundExpression },
- { "max", maxCompoundExpression },
- { "round", roundCompoundExpression },
- { "floor", floorCompoundExpression },
- { "ceil", ceilCompoundExpression },
- { "abs", absCompoundExpression },
- { "!", notCompoundExpression },
- { "is-supported-script", isSupportedScriptCompoundExpression },
- { "upcase", upcaseCompoundExpression },
- { "downcase", downcaseCompoundExpression },
- { "concat", concatCompoundExpression },
- { "resolved-locale", resolvedLocaleCompoundExpression },
- { "error", errorCompoundExpression },
- // Legacy Filters
- { "filter-==", filterEqualsCompoundExpression },
- { "filter-id-==", filterIdEqualsCompoundExpression },
- { "filter-type-==", filterTypeEqualsCompoundExpression },
- { "filter-<", filterLessThanNumberCompoundExpression },
- { "filter-<", filterLessThanStringCompoundExpression },
- { "filter-id-<", filterIdLessThanNumberCompoundExpression },
- { "filter-id-<", filterIdLessThanStringCompoundExpression },
- { "filter->", filterMoreThanNumberCompoundExpression },
- { "filter->", filterMoreThanStringCompoundExpression },
- { "filter-id->", filterIdMoreThanNumberCompoundExpression },
- { "filter-id->", filterIdMoreThanStringCompoundExpression },
- { "filter-<=", filterLessOrEqualThanNumberCompoundExpression },
- { "filter-<=", filterLessOrEqualThanStringCompoundExpression },
- { "filter-id-<=", filterIdLessOrEqualThanNumberCompoundExpression },
- { "filter-id-<=", filterIdLessOrEqualThanStringCompoundExpression },
- { "filter->=", filterGreaterOrEqualThanNumberCompoundExpression },
- { "filter->=", filterGreaterOrEqualThanStringCompoundExpression },
- { "filter-id->=", filterIdGreaterOrEqualThanNumberCompoundExpression },
- { "filter-id->=", filterIdGreaterOrEqualThanStringCompoundExpression },
- { "filter-has", filterHasCompoundExpression },
- { "filter-has-id", filterHasIdCompoundExpression },
- { "filter-type-in", filterTypeInCompoundExpression },
- { "filter-id-in", filterIdInCompoundExpression },
- { "filter-in", filterInCompoundExpression },
-});
+MAPBOX_ETERNAL_CONSTEXPR const auto compoundExpressionRegistry =
+ mapbox::eternal::hash_map<mapbox::eternal::string, ParseCompoundFunction>({
+ {"e", eCompoundExpression},
+ {"pi", piCompoundExpression},
+ {"ln2", ln2CompoundExpression},
+ {"typeof", typeofCompoundExpression},
+ {"to-rgba", toRgbaCompoundExpression},
+ {"rgba", rgbaCompoundExpression},
+ {"rgb", rgbCompoundExpression},
+ {"zoom", zoomCompoundExpression},
+ {"heatmap-density", heatmapDensityCompoundExpression},
+ {"line-progress", lineProgressCompoundExpression},
+ {"accumulated", accumulatedCompoundExpression},
+ {"has", hasContextCompoundExpression},
+ {"has", hasObjectCompoundExpression},
+ {"get", getContextCompoundExpression},
+ {"get", getObjectCompoundExpression},
+ {"properties", propertiesCompoundExpression},
+ {"geometry-type", geometryTypeCompoundExpression},
+ {"id", idCompoundExpression},
+ {"+", plusCompoundExpression},
+ {"-", minusCompoundExpression},
+ {"-", negateCompoundExpression},
+ {"*", multiplyCompoundExpression},
+ {"/", divideCompoundExpression},
+ {"%", modCompoundExpression},
+ {"^", powCompoundExpression},
+ {"sqrt", sqrtCompoundExpression},
+ {"log10", log10CompoundExpression},
+ {"ln", lnCompoundExpression},
+ {"log2", log2CompoundExpression},
+ {"sin", sinCompoundExpression},
+ {"cos", cosCompoundExpression},
+ {"tan", tanCompoundExpression},
+ {"asin", asinCompoundExpression},
+ {"acos", acosCompoundExpression},
+ {"atan", atanCompoundExpression},
+ {"min", minCompoundExpression},
+ {"max", maxCompoundExpression},
+ {"round", roundCompoundExpression},
+ {"floor", floorCompoundExpression},
+ {"ceil", ceilCompoundExpression},
+ {"abs", absCompoundExpression},
+ {"!", notCompoundExpression},
+ {"is-supported-script", isSupportedScriptCompoundExpression},
+ {"upcase", upcaseCompoundExpression},
+ {"downcase", downcaseCompoundExpression},
+ {"concat", concatCompoundExpression},
+ {"resolved-locale", resolvedLocaleCompoundExpression},
+ {"error", errorCompoundExpression},
+ {"feature-state", featureStateCompoundExpression},
+ // Legacy Filters
+ {"filter-==", filterEqualsCompoundExpression},
+ {"filter-id-==", filterIdEqualsCompoundExpression},
+ {"filter-type-==", filterTypeEqualsCompoundExpression},
+ {"filter-<", filterLessThanNumberCompoundExpression},
+ {"filter-<", filterLessThanStringCompoundExpression},
+ {"filter-id-<", filterIdLessThanNumberCompoundExpression},
+ {"filter-id-<", filterIdLessThanStringCompoundExpression},
+ {"filter->", filterMoreThanNumberCompoundExpression},
+ {"filter->", filterMoreThanStringCompoundExpression},
+ {"filter-id->", filterIdMoreThanNumberCompoundExpression},
+ {"filter-id->", filterIdMoreThanStringCompoundExpression},
+ {"filter-<=", filterLessOrEqualThanNumberCompoundExpression},
+ {"filter-<=", filterLessOrEqualThanStringCompoundExpression},
+ {"filter-id-<=", filterIdLessOrEqualThanNumberCompoundExpression},
+ {"filter-id-<=", filterIdLessOrEqualThanStringCompoundExpression},
+ {"filter->=", filterGreaterOrEqualThanNumberCompoundExpression},
+ {"filter->=", filterGreaterOrEqualThanStringCompoundExpression},
+ {"filter-id->=", filterIdGreaterOrEqualThanNumberCompoundExpression},
+ {"filter-id->=", filterIdGreaterOrEqualThanStringCompoundExpression},
+ {"filter-has", filterHasCompoundExpression},
+ {"filter-has-id", filterHasIdCompoundExpression},
+ {"filter-type-in", filterTypeInCompoundExpression},
+ {"filter-id-in", filterIdInCompoundExpression},
+ {"filter-in", filterInCompoundExpression},
+ });
using namespace mbgl::style::conversion;
diff --git a/src/mbgl/style/expression/is_constant.cpp b/src/mbgl/style/expression/is_constant.cpp
index 9704168a41..4c4684c86a 100644
--- a/src/mbgl/style/expression/is_constant.cpp
+++ b/src/mbgl/style/expression/is_constant.cpp
@@ -17,11 +17,7 @@ bool isFeatureConstant(const Expression& expression) {
return false;
} else if (name == "has" && parameterCount && *parameterCount == 1) {
return false;
- } else if (
- name == "properties" ||
- name == "geometry-type" ||
- name == "id"
- ) {
+ } else if (name == "properties" || name == "geometry-type" || name == "id" || name == "feature-state") {
return false;
} else if (0u == name.rfind(filter, 0u)) {
// Legacy filters begin with "filter-" and are never constant.
diff --git a/src/mbgl/style/layer.cpp b/src/mbgl/style/layer.cpp
index 328cd47555..04a897022c 100644
--- a/src/mbgl/style/layer.cpp
+++ b/src/mbgl/style/layer.cpp
@@ -1,15 +1,23 @@
-#include <mbgl/style/layer.hpp>
-#include <mbgl/style/layer_impl.hpp>
-#include <mbgl/style/layer_observer.hpp>
#include <mbgl/style/conversion/constant.hpp>
#include <mbgl/style/conversion/filter.hpp>
#include <mbgl/style/conversion_impl.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/layer_impl.hpp>
+#include <mbgl/style/layer_observer.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/renderer/render_layer.hpp>
namespace mbgl {
namespace style {
+static_assert(mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(LayerTypeInfo::TileKind::Geometry),
+ "tile kind error");
+static_assert(mbgl::underlying_type(Tile::Kind::Raster) == mbgl::underlying_type(LayerTypeInfo::TileKind::Raster),
+ "tile kind error");
+static_assert(mbgl::underlying_type(Tile::Kind::RasterDEM) == mbgl::underlying_type(LayerTypeInfo::TileKind::RasterDEM),
+ "tile kind error");
+
static LayerObserver nullObserver;
Layer::Layer(Immutable<Impl> impl)
diff --git a/src/mbgl/style/layers/background_layer.cpp b/src/mbgl/style/layers/background_layer.cpp
index 1693c47204..2b33b0b3d0 100644
--- a/src/mbgl/style/layers/background_layer.cpp
+++ b/src/mbgl/style/layers/background_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* BackgroundLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"background",
- LayerTypeInfo::Source::NotRequired,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"background",
+ LayerTypeInfo::Source::NotRequired,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::NotRequired};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/circle_layer.cpp b/src/mbgl/style/layers/circle_layer.cpp
index 2293ed222e..baabe5c8bf 100644
--- a/src/mbgl/style/layers/circle_layer.cpp
+++ b/src/mbgl/style/layers/circle_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* CircleLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"circle",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"circle",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/custom_layer.cpp b/src/mbgl/style/layers/custom_layer.cpp
index e77d6590f7..8b9e17ea25 100644
--- a/src/mbgl/style/layers/custom_layer.cpp
+++ b/src/mbgl/style/layers/custom_layer.cpp
@@ -8,13 +8,13 @@ namespace mbgl {
namespace style {
namespace {
- const LayerTypeInfo typeInfoCustom
- { "",
- LayerTypeInfo::Source::NotRequired,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired };
+const LayerTypeInfo typeInfoCustom{"",
+ LayerTypeInfo::Source::NotRequired,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::NotRequired};
} // namespace
CustomLayer::CustomLayer(const std::string& layerID,
diff --git a/src/mbgl/style/layers/fill_extrusion_layer.cpp b/src/mbgl/style/layers/fill_extrusion_layer.cpp
index 50e32cf812..b22f0a3075 100644
--- a/src/mbgl/style/layers/fill_extrusion_layer.cpp
+++ b/src/mbgl/style/layers/fill_extrusion_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* FillExtrusionLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"fill-extrusion",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::Required,
- LayerTypeInfo::Layout::Required,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"fill-extrusion",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::Required,
+ LayerTypeInfo::Layout::Required,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/fill_layer.cpp b/src/mbgl/style/layers/fill_layer.cpp
index e08c8f3962..2c3ee42fae 100644
--- a/src/mbgl/style/layers/fill_layer.cpp
+++ b/src/mbgl/style/layers/fill_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* FillLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"fill",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::Required,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"fill",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::Required,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/heatmap_layer.cpp b/src/mbgl/style/layers/heatmap_layer.cpp
index cb99f76a51..a3cedd3747 100644
--- a/src/mbgl/style/layers/heatmap_layer.cpp
+++ b/src/mbgl/style/layers/heatmap_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* HeatmapLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"heatmap",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::Required,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"heatmap",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::Required,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/hillshade_layer.cpp b/src/mbgl/style/layers/hillshade_layer.cpp
index 95a395ef25..05dd009d25 100644
--- a/src/mbgl/style/layers/hillshade_layer.cpp
+++ b/src/mbgl/style/layers/hillshade_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* HillshadeLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"hillshade",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::Required,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"hillshade",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::Required,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::RasterDEM};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/layer.cpp.ejs b/src/mbgl/style/layers/layer.cpp.ejs
index da34565461..eee2d0583e 100644
--- a/src/mbgl/style/layers/layer.cpp.ejs
+++ b/src/mbgl/style/layers/layer.cpp.ejs
@@ -27,13 +27,20 @@ let defaults = { caps: { 'Source': 'NotRequired',
'Pass3D': 'NotRequired',
'Layout': 'NotRequired',
'FadingTiles': 'NotRequired',
- 'CrossTileIndex': 'NotRequired'
+ 'CrossTileIndex': 'NotRequired',
+ 'TileKind' : 'NotRequired'
},
require: function(cap) {
- let copy = Object.assign({}, this);
- copy.caps = Object.assign({}, this.caps);
- copy.caps[cap] = 'Required';
- return copy;
+ let copy = Object.assign({}, this);
+ copy.caps = Object.assign({}, this.caps);
+ copy.caps[cap] = 'Required';
+ return copy;
+ },
+ set: function(cap, value) {
+ let copy = Object.assign({}, this);
+ copy.caps = Object.assign({}, this.caps);
+ copy.caps[cap] = value;
+ return copy;
},
finalize: function() {
return Object.keys(this.caps).reduce((acc, key) => {
@@ -46,30 +53,35 @@ let defaults = { caps: { 'Source': 'NotRequired',
layerCapabilities['background'] = defaults.finalize();
layerCapabilities['fill'] = defaults.require('Source')
.require('Layout')
+ .set('TileKind', 'Geometry')
.finalize();
layerCapabilities['fill-extrusion'] = defaults.require('Source')
.require('Pass3D')
.require('Layout')
+ .set('TileKind', 'Geometry')
.finalize();
layerCapabilities['hillshade'] = defaults.require('Source')
.require('Pass3D')
+ .set('TileKind', 'RasterDEM')
.finalize();
layerCapabilities['symbol'] = defaults.require('Source')
.require('Layout')
.require('FadingTiles')
.require('CrossTileIndex')
+ .set('TileKind', 'Geometry')
.finalize();
-layerCapabilities['circle'] = defaults.require('Source').finalize();
+layerCapabilities['circle'] = defaults.require('Source').set('TileKind', 'Geometry').finalize();
layerCapabilities['line'] = layerCapabilities['fill'];
-layerCapabilities['heatmap'] = layerCapabilities['hillshade'];
-layerCapabilities['raster'] = layerCapabilities['circle'];
+layerCapabilities['heatmap'] = defaults.require('Source')
+ .require('Pass3D')
+ .set('TileKind', 'Geometry')
+ .finalize();
+layerCapabilities['raster'] = defaults.require('Source').set('TileKind', 'Raster').finalize();
%>
// static
const LayerTypeInfo* <%- camelize(type) %>Layer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"<%- type %>",
- <%-`${layerCapabilities[type].map(cap => `LayerTypeInfo::${cap}`).join(',\n ')}` %>
- };
+ const static LayerTypeInfo typeInfo{"<%- type %>",
+ <%-`${layerCapabilities[type].map(cap => `LayerTypeInfo::${cap}`).join(',\n ')}` %>};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/line_layer.cpp b/src/mbgl/style/layers/line_layer.cpp
index deb85cad66..c148a66407 100644
--- a/src/mbgl/style/layers/line_layer.cpp
+++ b/src/mbgl/style/layers/line_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* LineLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"line",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::Required,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"line",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::Required,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/raster_layer.cpp b/src/mbgl/style/layers/raster_layer.cpp
index ead2223ea6..b85d031938 100644
--- a/src/mbgl/style/layers/raster_layer.cpp
+++ b/src/mbgl/style/layers/raster_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* RasterLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"raster",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::NotRequired,
- LayerTypeInfo::FadingTiles::NotRequired,
- LayerTypeInfo::CrossTileIndex::NotRequired
- };
+ const static LayerTypeInfo typeInfo{"raster",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::NotRequired,
+ LayerTypeInfo::FadingTiles::NotRequired,
+ LayerTypeInfo::CrossTileIndex::NotRequired,
+ LayerTypeInfo::TileKind::Raster};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/symbol_layer.cpp b/src/mbgl/style/layers/symbol_layer.cpp
index 157d8c745f..35d75686af 100644
--- a/src/mbgl/style/layers/symbol_layer.cpp
+++ b/src/mbgl/style/layers/symbol_layer.cpp
@@ -19,14 +19,13 @@ namespace style {
// static
const LayerTypeInfo* SymbolLayer::Impl::staticTypeInfo() noexcept {
- const static LayerTypeInfo typeInfo
- {"symbol",
- LayerTypeInfo::Source::Required,
- LayerTypeInfo::Pass3D::NotRequired,
- LayerTypeInfo::Layout::Required,
- LayerTypeInfo::FadingTiles::Required,
- LayerTypeInfo::CrossTileIndex::Required
- };
+ const static LayerTypeInfo typeInfo{"symbol",
+ LayerTypeInfo::Source::Required,
+ LayerTypeInfo::Pass3D::NotRequired,
+ LayerTypeInfo::Layout::Required,
+ LayerTypeInfo::FadingTiles::Required,
+ LayerTypeInfo::CrossTileIndex::Required,
+ LayerTypeInfo::TileKind::Geometry};
return &typeInfo;
}
diff --git a/src/mbgl/style/layers/symbol_layer_impl.hpp b/src/mbgl/style/layers/symbol_layer_impl.hpp
index 9b63e0e8d6..ca9505a5f3 100644
--- a/src/mbgl/style/layers/symbol_layer_impl.hpp
+++ b/src/mbgl/style/layers/symbol_layer_impl.hpp
@@ -74,7 +74,7 @@ struct FormatSectionOverrides<TypeList<PaintProperty...>> {
},
[&checkLiteral] (const PropertyExpression<TextField::Type>& property) {
bool expressionHasOverrides = false;
- const auto checkExpression = [&](const expression::Expression& e) {
+ const std::function<void(const expression::Expression&)> checkExpression = [&](const expression::Expression& e) {
if (expressionHasOverrides) {
return;
}
@@ -87,9 +87,7 @@ struct FormatSectionOverrides<TypeList<PaintProperty...>> {
expressionHasOverrides = true;
}
return;
- }
-
- if (e.getKind() == expression::Kind::FormatExpression) {
+ } else if (e.getKind() == expression::Kind::FormatExpression) {
const auto* formatExpr = static_cast<const expression::FormatExpression*>(&e);
for (const auto& section : formatExpr->getSections()) {
if (Property::hasOverride(section)) {
@@ -97,17 +95,12 @@ struct FormatSectionOverrides<TypeList<PaintProperty...>> {
break;
}
}
+ } else {
+ e.eachChild(checkExpression);
}
};
- // Check root property expression and return early.
checkExpression(property.getExpression());
- if (expressionHasOverrides) {
- return true;
- }
-
- // Traverse thru children and check whether any of them have overrides.
- property.getExpression().eachChild(checkExpression);
return expressionHasOverrides;
},
[] (const auto&) {
diff --git a/src/mbgl/style/properties.hpp b/src/mbgl/style/properties.hpp
index 9d66f850de..db0e54330c 100644
--- a/src/mbgl/style/properties.hpp
+++ b/src/mbgl/style/properties.hpp
@@ -180,11 +180,23 @@ public:
});
}
+ template <class T>
+ static T evaluate(float z, const GeometryTileFeature& feature, const FeatureState& state,
+ const PossiblyEvaluatedPropertyValue<T>& v, const T& defaultValue) {
+ return v.match([&](const T& t) { return t; },
+ [&](const PropertyExpression<T>& t) { return t.evaluate(z, feature, state, defaultValue); });
+ }
+
template <class P>
auto evaluate(float z, const GeometryTileFeature& feature) const {
return evaluate(z, feature, this->template get<P>(), P::defaultValue());
}
+ template <class P>
+ auto evaluate(float z, const GeometryTileFeature& feature, const FeatureState& state) const {
+ return evaluate(z, feature, state, this->template get<P>(), P::defaultValue());
+ }
+
Evaluated evaluate(float z, const GeometryTileFeature& feature) const {
return Evaluated {
evaluate<Ps>(z, feature)...
diff --git a/src/mbgl/style/sources/custom_geometry_source.cpp b/src/mbgl/style/sources/custom_geometry_source.cpp
index 73675c056f..1076cbf417 100644
--- a/src/mbgl/style/sources/custom_geometry_source.cpp
+++ b/src/mbgl/style/sources/custom_geometry_source.cpp
@@ -1,12 +1,15 @@
-#include <mbgl/style/sources/custom_geometry_source.hpp>
-#include <mbgl/style/custom_tile_loader.hpp>
-#include <mbgl/style/sources/custom_geometry_source_impl.hpp>
-#include <mbgl/style/source_observer.hpp>
+#include <cstring>
+#include <map>
#include <mbgl/actor/actor.hpp>
#include <mbgl/actor/scheduler.hpp>
+#include <mbgl/style/custom_tile_loader.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
+#include <mbgl/style/sources/custom_geometry_source.hpp>
+#include <mbgl/style/sources/custom_geometry_source_impl.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/tile/tile_id.hpp>
#include <tuple>
-#include <map>
namespace mbgl {
namespace style {
@@ -29,6 +32,10 @@ void CustomGeometrySource::loadDescription(FileSource&) {
observer->onSourceLoaded(*this);
}
+bool CustomGeometrySource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(info->tileKind);
+}
+
void CustomGeometrySource::setTileData(const CanonicalTileID& tileID,
const GeoJSON& data) {
loader->self().invoke(&CustomTileLoader::setTileData, tileID, data);
diff --git a/src/mbgl/style/sources/geojson_source.cpp b/src/mbgl/style/sources/geojson_source.cpp
index 72a51e212f..baf76d8224 100644
--- a/src/mbgl/style/sources/geojson_source.cpp
+++ b/src/mbgl/style/sources/geojson_source.cpp
@@ -1,9 +1,11 @@
+#include <mbgl/storage/file_source.hpp>
+#include <mbgl/style/conversion/geojson.hpp>
+#include <mbgl/style/conversion/json.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
#include <mbgl/style/sources/geojson_source.hpp>
#include <mbgl/style/sources/geojson_source_impl.hpp>
-#include <mbgl/style/source_observer.hpp>
-#include <mbgl/style/conversion/json.hpp>
-#include <mbgl/style/conversion/geojson.hpp>
-#include <mbgl/storage/file_source.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/util/logging.hpp>
namespace mbgl {
@@ -78,5 +80,9 @@ void GeoJSONSource::loadDescription(FileSource& fileSource) {
});
}
+bool GeoJSONSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(info->tileKind);
+}
+
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/sources/image_source.cpp b/src/mbgl/style/sources/image_source.cpp
index fa268da0ef..baadc86e7c 100644
--- a/src/mbgl/style/sources/image_source.cpp
+++ b/src/mbgl/style/sources/image_source.cpp
@@ -1,9 +1,11 @@
+#include <mbgl/storage/file_source.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
#include <mbgl/style/sources/image_source.hpp>
#include <mbgl/style/sources/image_source_impl.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/util/geo.hpp>
-#include <mbgl/style/source_observer.hpp>
#include <mbgl/util/premultiply.hpp>
-#include <mbgl/storage/file_source.hpp>
namespace mbgl {
namespace style {
@@ -80,5 +82,9 @@ void ImageSource::loadDescription(FileSource& fileSource) {
});
}
+bool ImageSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::Raster) == mbgl::underlying_type(info->tileKind);
+}
+
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/sources/raster_dem_source.cpp b/src/mbgl/style/sources/raster_dem_source.cpp
index bb745561b1..dd859cc6d1 100644
--- a/src/mbgl/style/sources/raster_dem_source.cpp
+++ b/src/mbgl/style/sources/raster_dem_source.cpp
@@ -1,8 +1,10 @@
-#include <mbgl/style/sources/raster_dem_source.hpp>
-#include <mbgl/style/sources/raster_source_impl.hpp>
-#include <mbgl/style/source_observer.hpp>
#include <mbgl/style/conversion/json.hpp>
#include <mbgl/style/conversion/tileset.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
+#include <mbgl/style/sources/raster_dem_source.hpp>
+#include <mbgl/style/sources/raster_source_impl.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/util/mapbox.hpp>
namespace mbgl {
@@ -12,5 +14,9 @@ RasterDEMSource::RasterDEMSource(std::string id, variant<std::string, Tileset> u
: RasterSource(std::move(id), urlOrTileset_, tileSize, SourceType::RasterDEM){
}
+bool RasterDEMSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::RasterDEM) == mbgl::underlying_type(info->tileKind);
+}
+
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/sources/raster_source.cpp b/src/mbgl/style/sources/raster_source.cpp
index 115887d004..851f32573e 100644
--- a/src/mbgl/style/sources/raster_source.cpp
+++ b/src/mbgl/style/sources/raster_source.cpp
@@ -1,11 +1,13 @@
-#include <mbgl/style/sources/raster_source.hpp>
-#include <mbgl/style/sources/raster_source_impl.hpp>
-#include <mbgl/style/source_observer.hpp>
+#include <mbgl/storage/file_source.hpp>
#include <mbgl/style/conversion/json.hpp>
#include <mbgl/style/conversion/tileset.hpp>
-#include <mbgl/storage/file_source.hpp>
-#include <mbgl/util/mapbox.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
+#include <mbgl/style/sources/raster_source.hpp>
+#include <mbgl/style/sources/raster_source_impl.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/util/exception.hpp>
+#include <mbgl/util/mapbox.hpp>
namespace mbgl {
namespace style {
@@ -80,5 +82,9 @@ void RasterSource::loadDescription(FileSource& fileSource) {
});
}
+bool RasterSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::Raster) == mbgl::underlying_type(info->tileKind);
+}
+
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/sources/vector_source.cpp b/src/mbgl/style/sources/vector_source.cpp
index f103a7768f..dc1a45fdff 100644
--- a/src/mbgl/style/sources/vector_source.cpp
+++ b/src/mbgl/style/sources/vector_source.cpp
@@ -1,20 +1,24 @@
-#include <mbgl/style/sources/vector_source.hpp>
-#include <mbgl/style/sources/vector_source_impl.hpp>
-#include <mbgl/style/source_observer.hpp>
+#include <mbgl/storage/file_source.hpp>
#include <mbgl/style/conversion/json.hpp>
#include <mbgl/style/conversion/tileset.hpp>
-#include <mbgl/storage/file_source.hpp>
-#include <mbgl/util/mapbox.hpp>
+#include <mbgl/style/layer.hpp>
+#include <mbgl/style/source_observer.hpp>
+#include <mbgl/style/sources/vector_source.hpp>
+#include <mbgl/style/sources/vector_source_impl.hpp>
+#include <mbgl/tile/tile.hpp>
#include <mbgl/util/constants.hpp>
#include <mbgl/util/exception.hpp>
+#include <mbgl/util/mapbox.hpp>
namespace mbgl {
namespace style {
-VectorSource::VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset_)
+VectorSource::VectorSource(std::string id, variant<std::string, Tileset> urlOrTileset_, optional<float> maxZoom_,
+ optional<float> minZoom_)
: Source(makeMutable<Impl>(std::move(id))),
- urlOrTileset(std::move(urlOrTileset_)) {
-}
+ urlOrTileset(std::move(urlOrTileset_)),
+ maxZoom(std::move(maxZoom_)),
+ minZoom(std::move(minZoom_)) {}
VectorSource::~VectorSource() = default;
@@ -61,7 +65,12 @@ void VectorSource::loadDescription(FileSource& fileSource) {
observer->onSourceError(*this, std::make_exception_ptr(util::StyleParseException(error.message)));
return;
}
-
+ if (maxZoom) {
+ tileset->zoomRange.max = *maxZoom;
+ }
+ if (minZoom) {
+ tileset->zoomRange.min = *minZoom;
+ }
util::mapbox::canonicalizeTileset(*tileset, url, getType(), util::tileSize);
bool changed = impl().tileset != *tileset;
@@ -77,5 +86,9 @@ void VectorSource::loadDescription(FileSource& fileSource) {
});
}
+bool VectorSource::supportsLayerType(const mbgl::style::LayerTypeInfo* info) const {
+ return mbgl::underlying_type(Tile::Kind::Geometry) == mbgl::underlying_type(info->tileKind);
+}
+
} // namespace style
} // namespace mbgl
diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp
index d3298c5cac..95a39819fc 100644
--- a/src/mbgl/style/style_impl.cpp
+++ b/src/mbgl/style/style_impl.cpp
@@ -1,26 +1,27 @@
-#include <mbgl/style/style_impl.hpp>
-#include <mbgl/style/observer.hpp>
-#include <mbgl/style/source_impl.hpp>
-#include <mbgl/style/layers/symbol_layer.hpp>
-#include <mbgl/style/layers/custom_layer.hpp>
+#include <mbgl/sprite/sprite_loader.hpp>
+#include <mbgl/storage/file_source.hpp>
+#include <mbgl/storage/resource.hpp>
+#include <mbgl/storage/response.hpp>
+#include <mbgl/style/layer_impl.hpp>
#include <mbgl/style/layers/background_layer.hpp>
-#include <mbgl/style/layers/fill_layer.hpp>
+#include <mbgl/style/layers/circle_layer.hpp>
+#include <mbgl/style/layers/custom_layer.hpp>
#include <mbgl/style/layers/fill_extrusion_layer.hpp>
+#include <mbgl/style/layers/fill_layer.hpp>
#include <mbgl/style/layers/heatmap_layer.hpp>
+#include <mbgl/style/layers/hillshade_layer.hpp>
#include <mbgl/style/layers/line_layer.hpp>
-#include <mbgl/style/layers/circle_layer.hpp>
#include <mbgl/style/layers/raster_layer.hpp>
-#include <mbgl/style/layers/hillshade_layer.hpp>
-#include <mbgl/style/layer_impl.hpp>
+#include <mbgl/style/layers/symbol_layer.hpp>
+#include <mbgl/style/observer.hpp>
#include <mbgl/style/parser.hpp>
+#include <mbgl/style/source_impl.hpp>
+#include <mbgl/style/style_impl.hpp>
#include <mbgl/style/transition_options.hpp>
-#include <mbgl/sprite/sprite_loader.hpp>
#include <mbgl/util/exception.hpp>
-#include <mbgl/util/string.hpp>
#include <mbgl/util/logging.hpp>
-#include <mbgl/storage/file_source.hpp>
-#include <mbgl/storage/resource.hpp>
-#include <mbgl/storage/response.hpp>
+#include <mbgl/util/string.hpp>
+#include <sstream>
namespace mbgl {
namespace style {
@@ -177,6 +178,15 @@ Layer* Style::Impl::getLayer(const std::string& id) const {
Layer* Style::Impl::addLayer(std::unique_ptr<Layer> layer, optional<std::string> before) {
// TODO: verify source
+ if (Source* source = sources.get(layer->getSourceID())) {
+ if (!source->supportsLayerType(layer->baseImpl->getTypeInfo())) {
+ std::ostringstream message;
+ message << "Layer '" << layer->getID() << "' is not compatible with source '" << layer->getSourceID()
+ << "'";
+
+ throw std::runtime_error(message.str());
+ }
+ }
if (layers.get(layer->getID())) {
throw std::runtime_error(std::string{"Layer "} + layer->getID() + " already exists");
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 3087b4fc6a..9f9c41d229 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -302,14 +302,11 @@ float GeometryTile::getQueryPadding(const std::unordered_map<std::string, const
return queryPadding;
}
-void GeometryTile::queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState& transformState,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) {
-
+void GeometryTile::queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState& transformState,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState) {
if (!getData()) return;
const float queryPadding = getQueryPadding(layers);
@@ -318,16 +315,10 @@ void GeometryTile::queryRenderedFeatures(
transformState.matrixFor(posMatrix, id.toUnwrapped());
matrix::multiply(posMatrix, projMatrix, posMatrix);
- layoutResult->featureIndex->query(result,
- queryGeometry,
- transformState,
- posMatrix,
- util::tileSize * id.overscaleFactor(),
- std::pow(2, transformState.getZoom() - id.overscaledZ),
- options,
- id.toUnwrapped(),
- layers,
- queryPadding * transformState.maxPitchScaleFactor());
+ layoutResult->featureIndex->query(result, queryGeometry, transformState, posMatrix,
+ util::tileSize * id.overscaleFactor(),
+ std::pow(2, transformState.getZoom() - id.overscaledZ), options, id.toUnwrapped(),
+ layers, queryPadding * transformState.maxPitchScaleFactor(), featureState);
}
void GeometryTile::querySourceFeatures(
@@ -387,4 +378,33 @@ void GeometryTile::performedFadePlacement() {
}
}
+void GeometryTile::setFeatureState(const LayerFeatureStates& states) {
+ auto layers = getData();
+ if ((layers == nullptr) || states.empty() || !layoutResult) {
+ return;
+ }
+
+ auto& layerIdToLayerRenderData = layoutResult->layerRenderData;
+ for (auto& layer : layerIdToLayerRenderData) {
+ const auto& layerID = layer.first;
+ const auto sourceLayer = layers->getLayer(layerID);
+ if (sourceLayer) {
+ const auto& sourceLayerID = sourceLayer->getName();
+ auto entry = states.find(sourceLayerID);
+ if (entry == states.end()) {
+ continue;
+ }
+ const auto& featureStates = entry->second;
+ if (featureStates.empty()) {
+ continue;
+ }
+
+ auto bucket = layer.second.bucket;
+ if (bucket && bucket->hasData()) {
+ bucket->update(featureStates, *sourceLayer, layerID, layoutResult->iconAtlas.patternPositions);
+ }
+ }
+ }
+}
+
} // namespace mbgl
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index 8682c8c76b..566b359547 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -48,13 +48,11 @@ public:
bool layerPropertiesUpdated(const Immutable<style::LayerProperties>&) override;
- void queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>& layers,
- const RenderedQueryOptions& options,
- const mat4& projMatrix) override;
+ void queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState&,
+ const std::unordered_map<std::string, const RenderLayer*>& layers,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState) override;
void querySourceFeatures(
std::vector<Feature>& result,
@@ -93,7 +91,9 @@ public:
const std::shared_ptr<FeatureIndex> getFeatureIndex() const;
const std::string sourceID;
-
+
+ void setFeatureState(const LayerFeatureStates&) override;
+
protected:
const GeometryTileData* getData() const;
LayerRenderData* getLayerRenderData(const style::Layer::Impl&);
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp
index 428a5b0d5e..f6af61eb3c 100644
--- a/src/mbgl/tile/geometry_tile_worker.cpp
+++ b/src/mbgl/tile/geometry_tile_worker.cpp
@@ -384,7 +384,7 @@ void GeometryTileWorker::parse() {
continue;
const GeometryCollection& geometries = feature->getGeometries();
- bucket->addFeature(*feature, geometries, {}, PatternLayerMap ());
+ bucket->addFeature(*feature, geometries, {}, PatternLayerMap(), i);
featureIndex->insert(geometries, i, sourceLayerID, leaderImpl.id);
}
diff --git a/src/mbgl/tile/tile.cpp b/src/mbgl/tile/tile.cpp
index 2f342c092d..2ebbf76c2a 100644
--- a/src/mbgl/tile/tile.cpp
+++ b/src/mbgl/tile/tile.cpp
@@ -39,13 +39,9 @@ void Tile::dumpDebugLogs() const {
Log::Info(Event::General, "Tile::complete: %s", isComplete() ? "yes" : "no");
}
-void Tile::queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>&,
- const GeometryCoordinates&,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const RenderedQueryOptions&,
- const mat4&) {}
+void Tile::queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>&, const GeometryCoordinates&,
+ const TransformState&, const std::unordered_map<std::string, const RenderLayer*>&,
+ const RenderedQueryOptions&, const mat4&, const SourceFeatureState&) {}
float Tile::getQueryPadding(const std::unordered_map<std::string, const RenderLayer*>&) {
return 0;
diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp
index 7a7d246aa6..b73383f989 100644
--- a/src/mbgl/tile/tile.hpp
+++ b/src/mbgl/tile/tile.hpp
@@ -28,6 +28,7 @@ class TileRenderData;
class RenderedQueryOptions;
class SourceQueryOptions;
class CollisionIndex;
+class SourceFeatureState;
namespace gfx {
class UploadPass;
@@ -67,13 +68,11 @@ public:
virtual void setLayers(const std::vector<Immutable<style::LayerProperties>>&) {}
virtual void setMask(TileMask&&) {}
- virtual void queryRenderedFeatures(
- std::unordered_map<std::string, std::vector<Feature>>& result,
- const GeometryCoordinates& queryGeometry,
- const TransformState&,
- const std::unordered_map<std::string, const RenderLayer*>&,
- const RenderedQueryOptions& options,
- const mat4& projMatrix);
+ virtual void queryRenderedFeatures(std::unordered_map<std::string, std::vector<Feature>>& result,
+ const GeometryCoordinates& queryGeometry, const TransformState&,
+ const std::unordered_map<std::string, const RenderLayer*>&,
+ const RenderedQueryOptions& options, const mat4& projMatrix,
+ const SourceFeatureState& featureState);
virtual void querySourceFeatures(
std::vector<Feature>& result,
@@ -125,7 +124,9 @@ public:
// We hold onto a tile for two placements: fading starts with the first placement
// and will have time to finish by the second placement.
virtual void performedFadePlacement() {}
-
+
+ virtual void setFeatureState(const LayerFeatureStates&) {}
+
void dumpDebugLogs() const;
const Kind kind;
diff --git a/test/api/query.test.cpp b/test/api/query.test.cpp
index bf3f64a0c8..83aeec81ec 100644
--- a/test/api/query.test.cpp
+++ b/test/api/query.test.cpp
@@ -126,6 +126,22 @@ TEST(Query, QuerySourceFeatures) {
EXPECT_EQ(features1.size(), 1u);
}
+TEST(Query, QuerySourceFeatureStates) {
+ QueryTest test;
+
+ FeatureState newState;
+ newState["hover"] = true;
+ newState["radius"].set<uint64_t>(20);
+ test.frontend.getRenderer()->setFeatureState("source1", {}, "feature1", newState);
+
+ FeatureState states;
+ test.frontend.getRenderer()->getFeatureState(states, "source1", {}, "feature1");
+ ASSERT_EQ(states.size(), 2u);
+ ASSERT_EQ(states["hover"], true);
+ ASSERT_EQ(states["radius"].get<uint64_t>(), 20u);
+ ASSERT_EQ(newState, states);
+}
+
TEST(Query, QuerySourceFeaturesOptionValidation) {
QueryTest test;
diff --git a/test/gl/bucket.test.cpp b/test/gl/bucket.test.cpp
index a3dbdb8f99..13b30eb75d 100644
--- a/test/gl/bucket.test.cpp
+++ b/test/gl/bucket.test.cpp
@@ -52,7 +52,8 @@ TEST(Buckets, CircleBucket) {
ASSERT_FALSE(bucket.needsUpload());
GeometryCollection point { { { 0, 0 } } };
- bucket.addFeature(StubGeometryTileFeature { {}, FeatureType::Point, point, properties }, point, {}, PatternLayerMap());
+ bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, point, properties}, point, {}, PatternLayerMap(),
+ 0);
ASSERT_TRUE(bucket.hasData());
ASSERT_TRUE(bucket.needsUpload());
@@ -74,7 +75,8 @@ TEST(Buckets, FillBucket) {
ASSERT_FALSE(bucket.needsUpload());
GeometryCollection polygon { { { 0, 0 }, { 0, 1 }, { 1, 1 } } };
- bucket.addFeature(StubGeometryTileFeature { {}, FeatureType::Polygon, polygon, properties }, polygon, {}, PatternLayerMap());
+ bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Polygon, polygon, properties}, polygon, {},
+ PatternLayerMap(), 0);
ASSERT_TRUE(bucket.hasData());
ASSERT_TRUE(bucket.needsUpload());
@@ -96,11 +98,13 @@ TEST(Buckets, LineBucket) {
// Ignore invalid feature type.
GeometryCollection point { { { 0, 0 } } };
- bucket.addFeature(StubGeometryTileFeature { {}, FeatureType::Point, point, properties }, point, {}, PatternLayerMap());
+ bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, point, properties}, point, {}, PatternLayerMap(),
+ 0);
ASSERT_FALSE(bucket.hasData());
GeometryCollection line { { { 0, 0 }, { 1, 1 } } };
- bucket.addFeature(StubGeometryTileFeature { {}, FeatureType::LineString, line, properties }, line, {}, PatternLayerMap());
+ bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::LineString, line, properties}, line, {},
+ PatternLayerMap(), 1);
ASSERT_TRUE(bucket.hasData());
ASSERT_TRUE(bucket.needsUpload());
@@ -134,7 +138,8 @@ TEST(Buckets, SymbolBucket) {
// SymbolBucket::addFeature() is a no-op.
GeometryCollection point { { { 0, 0 } } };
- bucket.addFeature(StubGeometryTileFeature { {}, FeatureType::Point, std::move(point), properties }, point, {}, PatternLayerMap());
+ bucket.addFeature(StubGeometryTileFeature{{}, FeatureType::Point, std::move(point), properties}, point, {},
+ PatternLayerMap(), 0);
ASSERT_FALSE(bucket.hasData());
ASSERT_FALSE(bucket.needsUpload());
diff --git a/test/include/mbgl/test.hpp b/test/include/mbgl/test.hpp
index ad5b868f30..db47ebb8d8 100644
--- a/test/include/mbgl/test.hpp
+++ b/test/include/mbgl/test.hpp
@@ -1,7 +1,9 @@
#pragma once
+#include <mbgl/util/util.hpp>
+
namespace mbgl {
-int runTests(int argc, char* argv[]);
+MBGL_EXPORT int runTests(int argc, char* argv[]);
} // namespace mbgl
diff --git a/test/src/mbgl/test/util.hpp b/test/include/mbgl/test/util.hpp
index 9f56841dcc..9f56841dcc 100644
--- a/test/src/mbgl/test/util.hpp
+++ b/test/include/mbgl/test/util.hpp
diff --git a/test/style/expression/expression.test.cpp b/test/style/expression/expression.test.cpp
index dd986c98f5..ef9f7b7930 100644
--- a/test/style/expression/expression.test.cpp
+++ b/test/style/expression/expression.test.cpp
@@ -33,10 +33,9 @@ TEST(Expression, IsExpression) {
document.Parse<0>(R"([")" + name + R"("])");
const JSValue* expression = &document;
- // TODO: "feature-state": https://github.com/mapbox/mapbox-gl-native/issues/12613
// TODO: "interpolate-hcl": https://github.com/mapbox/mapbox-gl-native/issues/8720
// TODO: "interpolate-lab": https://github.com/mapbox/mapbox-gl-native/issues/8720
- if (name == "feature-state" || name == "interpolate-hcl" || name == "interpolate-lab") {
+ if (name == "interpolate-hcl" || name == "interpolate-lab") {
if (expression::isExpression(conversion::Convertible(expression))) {
ASSERT_TRUE(false) << "Expression name" << name << "is implemented - please update Expression.IsExpression test.";
}
diff --git a/test/style/style_layer.test.cpp b/test/style/style_layer.test.cpp
index d6a926c631..dfced634b7 100644
--- a/test/style/style_layer.test.cpp
+++ b/test/style/style_layer.test.cpp
@@ -299,6 +299,24 @@ TEST(Layer, DuplicateLayer) {
}
}
+TEST(Layer, IncompatibleLayer) {
+ util::RunLoop loop;
+
+ // Setup style
+ StubFileSource fileSource;
+ Style::Impl style{fileSource, 1.0};
+ style.loadJSON(util::read_file("test/fixtures/resources/style-unused-sources.json"));
+
+ // Try to add duplicate
+ try {
+ style.addLayer(std::make_unique<RasterLayer>("raster", "unusedsource"));
+ FAIL() << "Should not have been allowed to add an incompatible layer to the source";
+ } catch (const std::runtime_error& e) {
+ // Expected
+ ASSERT_STREQ("Layer 'raster' is not compatible with source 'unusedsource'", e.what());
+ }
+}
+
namespace {
template<template<typename> class PropertyValueType, typename LayoutType>
diff --git a/test/test-files.json b/test/test-files.json
index b239ac5ad8..a98e896e7e 100644
--- a/test/test-files.json
+++ b/test/test-files.json
@@ -107,7 +107,8 @@
"test/util/url.test.cpp"
],
"public_headers": {
- "mbgl/test.hpp": "test/include/mbgl/test.hpp"
+ "mbgl/test.hpp": "test/include/mbgl/test.hpp",
+ "mbgl/test/util.hpp": "test/include/mbgl/test/util.hpp"
},
"private_headers": {
"mbgl/test/fake_file_source.hpp": "test/src/mbgl/test/fake_file_source.hpp",
@@ -122,7 +123,6 @@
"mbgl/test/stub_map_observer.hpp": "test/src/mbgl/test/stub_map_observer.hpp",
"mbgl/test/stub_render_source_observer.hpp": "test/src/mbgl/test/stub_render_source_observer.hpp",
"mbgl/test/stub_style_observer.hpp": "test/src/mbgl/test/stub_style_observer.hpp",
- "mbgl/test/stub_tile_observer.hpp": "test/src/mbgl/test/stub_tile_observer.hpp",
- "mbgl/test/util.hpp": "test/src/mbgl/test/util.hpp"
+ "mbgl/test/stub_tile_observer.hpp": "test/src/mbgl/test/stub_tile_observer.hpp"
}
}
diff --git a/vendor/benchmark.cmake b/vendor/benchmark.cmake
index 516e3cd333..44c0672971 100644
--- a/vendor/benchmark.cmake
+++ b/vendor/benchmark.cmake
@@ -1,25 +1,31 @@
-add_library(benchmark STATIC
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/commandlineflags.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/console_reporter.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/complexity.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/csv_reporter.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/colorprint.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/sleep.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/benchmark.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/counter.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/benchmark_register.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/statistics.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/json_reporter.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/reporter.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/string_util.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/sysinfo.cc
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/src/timers.cc
+if(TARGET mbgl-vendor-benchmark)
+ return()
+endif()
+
+add_library(mbgl-vendor-benchmark STATIC EXCLUDE_FROM_ALL
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/commandlineflags.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/console_reporter.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/complexity.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/csv_reporter.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/colorprint.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/sleep.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/benchmark.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/counter.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/benchmark_register.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/statistics.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/json_reporter.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/reporter.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/string_util.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/sysinfo.cc
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/src/timers.cc
)
-target_compile_definitions(benchmark PRIVATE
+target_compile_definitions(mbgl-vendor-benchmark PRIVATE
HAVE_STEADY_CLOCK
)
-target_include_directories(benchmark SYSTEM PUBLIC
- ${CMAKE_SOURCE_DIR}/vendor/benchmark/include
+target_include_directories(mbgl-vendor-benchmark SYSTEM PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/benchmark/include
)
+
+set_property(TARGET mbgl-vendor-benchmark PROPERTY FOLDER Core)
diff --git a/vendor/boost.cmake b/vendor/boost.cmake
index 7c30a8d90e..33b203368e 100644
--- a/vendor/boost.cmake
+++ b/vendor/boost.cmake
@@ -1,5 +1,9 @@
-add_library(boost INTERFACE)
+if(TARGET mbgl-vendor-boost)
+ return()
+endif()
-target_include_directories(boost SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/boost/include
+add_library(mbgl-vendor-boost INTERFACE)
+
+target_include_directories(mbgl-vendor-boost SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/boost/include
)
diff --git a/vendor/cheap-ruler-cpp.cmake b/vendor/cheap-ruler-cpp.cmake
index 8d98cde63c..741a7b2ec2 100644
--- a/vendor/cheap-ruler-cpp.cmake
+++ b/vendor/cheap-ruler-cpp.cmake
@@ -1,6 +1,10 @@
-add_library(cheap-ruler-cpp INTERFACE)
+if(TARGET mbgl-vendor-cheap-ruler-cpp)
+ return()
+endif()
-target_include_directories(cheap-ruler-cpp SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/cheap-ruler-cpp/include
+add_library(mbgl-vendor-cheap-ruler-cpp INTERFACE)
+
+target_include_directories(mbgl-vendor-cheap-ruler-cpp SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/cheap-ruler-cpp/include
)
diff --git a/vendor/earcut.hpp b/vendor/earcut.hpp
-Subproject a3807695eb92d208643e15e112982b482ce36c9
+Subproject 0d0897a9dc462edf6396aedb335ddeb4aa302b7
diff --git a/vendor/earcut.hpp.cmake b/vendor/earcut.hpp.cmake
index d7992cda50..e5459f16ce 100644
--- a/vendor/earcut.hpp.cmake
+++ b/vendor/earcut.hpp.cmake
@@ -1,5 +1,9 @@
-add_library(earcut.hpp INTERFACE)
+if(TARGET mbgl-vendor-earcut.hpp)
+ return()
+endif()
-target_include_directories(earcut.hpp SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/earcut.hpp/include
+add_library(mbgl-vendor-earcut.hpp INTERFACE)
+
+target_include_directories(mbgl-vendor-earcut.hpp SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/earcut.hpp/include
)
diff --git a/vendor/eternal.cmake b/vendor/eternal.cmake
index 1239a8a43d..5a429db4fa 100644
--- a/vendor/eternal.cmake
+++ b/vendor/eternal.cmake
@@ -1,5 +1,9 @@
-add_library(eternal INTERFACE)
+if(TARGET mbgl-vendor-eternal)
+ return()
+endif()
-target_include_directories(eternal SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/eternal/include
+add_library(mbgl-vendor-eternal INTERFACE)
+
+target_include_directories(mbgl-vendor-eternal SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/eternal/include
)
diff --git a/vendor/expected.cmake b/vendor/expected.cmake
index ebe63e1a10..f87f057386 100644
--- a/vendor/expected.cmake
+++ b/vendor/expected.cmake
@@ -1,5 +1,9 @@
-add_library(expected INTERFACE)
+if(TARGET mbgl-vendor-expected)
+ return()
+endif()
-target_include_directories(expected SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/expected/include
+add_library(mbgl-vendor-expected INTERFACE)
+
+target_include_directories(mbgl-vendor-expected SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/expected/include
)
diff --git a/vendor/geojson-vt-cpp.cmake b/vendor/geojson-vt-cpp.cmake
index c8d955f64b..f2646336b3 100644
--- a/vendor/geojson-vt-cpp.cmake
+++ b/vendor/geojson-vt-cpp.cmake
@@ -1,5 +1,9 @@
-add_library(geojson-vt-cpp INTERFACE)
+if(TARGET mbgl-vendor-geojson-vt-cpp)
+ return()
+endif()
-target_include_directories(geojson-vt-cpp SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/geojson-vt-cpp/include
+add_library(mbgl-vendor-geojson-vt-cpp INTERFACE)
+
+target_include_directories(mbgl-vendor-geojson-vt-cpp SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/geojson-vt-cpp/include
)
diff --git a/vendor/googletest.cmake b/vendor/googletest.cmake
index edf8ebd82e..4ae0afddb5 100644
--- a/vendor/googletest.cmake
+++ b/vendor/googletest.cmake
@@ -1,16 +1,22 @@
-add_library(googletest STATIC
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googletest/src/gtest-all.cc
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googlemock/src/gmock-all.cc
+if(TARGET mbgl-vendor-googletest)
+ return()
+endif()
+
+add_library(mbgl-vendor-googletest STATIC EXCLUDE_FROM_ALL
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/src/gtest-all.cc
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/src/gmock-all.cc
)
-target_include_directories(googletest PRIVATE
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googletest
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googletest/include
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googlemock
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googlemock/include
+target_include_directories(mbgl-vendor-googletest PRIVATE
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/include
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/include
)
-target_include_directories(googletest SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googletest/include
- ${CMAKE_SOURCE_DIR}/vendor/googletest/googlemock/include
+target_include_directories(mbgl-vendor-googletest SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googletest/include
+ ${CMAKE_CURRENT_LIST_DIR}/googletest/googlemock/include
)
+
+set_property(TARGET mbgl-vendor-googletest PROPERTY FOLDER Core)
diff --git a/vendor/icu.cmake b/vendor/icu.cmake
index 419b78333a..c3a05fe44b 100644
--- a/vendor/icu.cmake
+++ b/vendor/icu.cmake
@@ -1,22 +1,26 @@
-add_library(icu STATIC
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/cmemory.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/cstring.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ubidi.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ubidi_props.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ubidiln.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ubidiwrt.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/uchar.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/udataswp.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/uinvchar.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/umath.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ushape.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/ustring.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/utf_impl.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/utrie2.cpp
- ${CMAKE_SOURCE_DIR}/vendor/icu/src/utypes.cpp
+if(TARGET mbgl-vendor-icu)
+ return()
+endif()
+
+add_library(mbgl-vendor-icu STATIC
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/cmemory.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/cstring.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ubidi.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ubidi_props.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ubidiln.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ubidiwrt.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/uchar.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/udataswp.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/uinvchar.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/umath.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ushape.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/ustring.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/utf_impl.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/utrie2.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/icu/src/utypes.cpp
)
-target_compile_definitions(icu PRIVATE
+target_compile_definitions(mbgl-vendor-icu PRIVATE
UCONFIG_NO_BREAK_ITERATION=1
UCONFIG_NO_LEGACY_CONVERSION=1
U_CHARSET_IS_UTF8=1
@@ -26,11 +30,13 @@ target_compile_definitions(icu PRIVATE
_REENTRANT
)
-target_compile_options(icu PRIVATE
+target_compile_options(mbgl-vendor-icu PRIVATE
-Wno-error
-Wno-shorten-64-to-32
)
-target_include_directories(icu SYSTEM PUBLIC
- ${CMAKE_SOURCE_DIR}/vendor/icu/include
+target_include_directories(mbgl-vendor-icu SYSTEM PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/icu/include
)
+
+set_property(TARGET mbgl-vendor-icu PROPERTY FOLDER Core)
diff --git a/vendor/mapbox-base b/vendor/mapbox-base
-Subproject 8ca46e8f8ebd212d7e55bd2b076b7ee42eaca5b
+Subproject 89997045511baf975dce1a3153d32b1fdd8bc69
diff --git a/vendor/nunicode.cmake b/vendor/nunicode.cmake
index d318b8a265..0a310a7bea 100644
--- a/vendor/nunicode.cmake
+++ b/vendor/nunicode.cmake
@@ -1,21 +1,25 @@
-add_library(nunicode STATIC
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/ducet.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/strcoll.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/strings.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/tolower.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/tounaccent.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/toupper.c
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/src/libnu/utf8.c
+if(TARGET mbgl-vendor-nunicode)
+ return()
+endif()
+
+add_library(mbgl-vendor-nunicode STATIC
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/ducet.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/strcoll.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/strings.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/tolower.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/tounaccent.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/toupper.c
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/src/libnu/utf8.c
)
-target_compile_definitions(nunicode PRIVATE
+target_compile_definitions(mbgl-vendor-nunicode PRIVATE
NU_BUILD_STATIC
)
-target_compile_options(nunicode PRIVATE
+target_compile_options(mbgl-vendor-nunicode PRIVATE
-Wno-error
)
-target_include_directories(nunicode SYSTEM PUBLIC
- ${CMAKE_SOURCE_DIR}/vendor/nunicode/include
+target_include_directories(mbgl-vendor-nunicode SYSTEM PUBLIC
+ ${CMAKE_CURRENT_LIST_DIR}/nunicode/include
)
diff --git a/vendor/polylabel.cmake b/vendor/polylabel.cmake
index d732723a89..5a930c9f6d 100644
--- a/vendor/polylabel.cmake
+++ b/vendor/polylabel.cmake
@@ -1,5 +1,9 @@
-add_library(polylabel INTERFACE)
+if(TARGET mbgl-vendor-polylabel)
+ return()
+endif()
-target_include_directories(polylabel SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/polylabel/include
+add_library(mbgl-vendor-polylabel INTERFACE)
+
+target_include_directories(mbgl-vendor-polylabel SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/polylabel/include
)
diff --git a/vendor/protozero.cmake b/vendor/protozero.cmake
index e4f32f1ace..41af37f188 100644
--- a/vendor/protozero.cmake
+++ b/vendor/protozero.cmake
@@ -1,5 +1,9 @@
-add_library(protozero INTERFACE)
+if(TARGET mbgl-vendor-protozero)
+ return()
+endif()
-target_include_directories(protozero SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/protozero/include
+add_library(mbgl-vendor-protozero INTERFACE)
+
+target_include_directories(mbgl-vendor-protozero SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/protozero/include
)
diff --git a/vendor/shelf-pack-cpp.cmake b/vendor/shelf-pack-cpp.cmake
index 0d8e850723..bf2e07c22f 100644
--- a/vendor/shelf-pack-cpp.cmake
+++ b/vendor/shelf-pack-cpp.cmake
@@ -1,5 +1,9 @@
-add_library(shelf-pack-cpp INTERFACE)
+if(TARGET mbgl-vendor-shelf-pack-cpp)
+ return()
+endif()
-target_include_directories(shelf-pack-cpp SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/shelf-pack-cpp/include
+add_library(mbgl-vendor-shelf-pack-cpp INTERFACE)
+
+target_include_directories(mbgl-vendor-shelf-pack-cpp SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/shelf-pack-cpp/include
)
diff --git a/vendor/sqlite.cmake b/vendor/sqlite.cmake
new file mode 100644
index 0000000000..d01ac0dd4e
--- /dev/null
+++ b/vendor/sqlite.cmake
@@ -0,0 +1,26 @@
+if(TARGET mbgl-vendor-sqlite)
+ return()
+endif()
+
+add_library(mbgl-vendor-sqlite STATIC
+ ${CMAKE_CURRENT_LIST_DIR}/sqlite/src/sqlite3.c
+)
+
+include(CheckSymbolExists)
+check_symbol_exists("strerror_r" "string.h" MBGL_SQLITE3_HAVE_STRERROR_R)
+
+if(MBGL_SQLITE3_HAVE_STRERROR_R)
+ target_compile_definitions(mbgl-vendor-sqlite PRIVATE
+ HAVE_STRERROR_R
+ )
+endif()
+
+# So we don't need to link with -ldl
+target_compile_definitions(mbgl-vendor-sqlite PRIVATE
+ SQLITE_OMIT_LOAD_EXTENSION
+ SQLITE_THREADSAFE
+)
+
+target_include_directories(mbgl-vendor-sqlite SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/sqlite/include
+)
diff --git a/vendor/unique_resource.cmake b/vendor/unique_resource.cmake
index ad450066eb..02fed9cbc1 100644
--- a/vendor/unique_resource.cmake
+++ b/vendor/unique_resource.cmake
@@ -1,5 +1,9 @@
-add_library(unique_resource INTERFACE)
+if(TARGET mbgl-vendor-unique_resource)
+ return()
+endif()
-target_include_directories(unique_resource SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/unique_resource
+add_library(mbgl-vendor-unique_resource INTERFACE)
+
+target_include_directories(mbgl-vendor-unique_resource SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/unique_resource
)
diff --git a/vendor/vector-tile.cmake b/vendor/vector-tile.cmake
index ec4552afcc..5f31fae94c 100644
--- a/vendor/vector-tile.cmake
+++ b/vendor/vector-tile.cmake
@@ -1,5 +1,9 @@
-add_library(vector-tile INTERFACE)
+if(TARGET mbgl-vendor-vector-tile)
+ return()
+endif()
-target_include_directories(vector-tile SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/vector-tile/include
+add_library(mbgl-vendor-vector-tile INTERFACE)
+
+target_include_directories(mbgl-vendor-vector-tile SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/vector-tile/include
)
diff --git a/vendor/wagyu.cmake b/vendor/wagyu.cmake
index 7cf3397b89..15f0758fb8 100644
--- a/vendor/wagyu.cmake
+++ b/vendor/wagyu.cmake
@@ -1,5 +1,9 @@
-add_library(wagyu INTERFACE)
+if(TARGET mbgl-vendor-wagyu)
+ return()
+endif()
-target_include_directories(wagyu SYSTEM INTERFACE
- ${CMAKE_SOURCE_DIR}/vendor/wagyu/include
+add_library(mbgl-vendor-wagyu INTERFACE)
+
+target_include_directories(mbgl-vendor-wagyu SYSTEM INTERFACE
+ ${CMAKE_CURRENT_LIST_DIR}/wagyu/include
)