diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-05-26 00:12:32 +0300 |
---|---|---|
committer | Thiago Marcos P. Santos <thiago@mapbox.com> | 2020-05-26 20:37:08 +0300 |
commit | 49d7f198f649f2ad1647857edb67a0a2e0535271 (patch) | |
tree | 06388d3b47e06ef370fd834481a6fc806da54c19 | |
parent | f5befeb2a4cd737562f27b6d7bb918cfd97d8bd8 (diff) | |
download | qtlocation-mapboxgl-49d7f198f649f2ad1647857edb67a0a2e0535271.tar.gz |
[core] Export placement types
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | include/mbgl/renderer/renderer.hpp | 23 | ||||
-rw-r--r-- | include/mbgl/text/placement_types.hpp | 77 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 38 | ||||
-rw-r--r-- | src/mbgl/text/placement.hpp | 46 | ||||
-rw-r--r-- | src/mbgl/text/placement_types.cpp | 30 |
6 files changed, 122 insertions, 94 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 417336341b..3411afa17d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,6 +246,7 @@ add_library( ${PROJECT_SOURCE_DIR}/include/mbgl/sourcemanager/raster_dem_source_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/sourcemanager/raster_source_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/sourcemanager/vector_source_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/text/placement_types.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/sourcemanager/source_manager.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/sourcemanager/annotation_source_factory.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/sourcemanager/custom_geometry_source_factory.cpp @@ -751,6 +752,7 @@ add_library( ${PROJECT_SOURCE_DIR}/src/mbgl/text/local_glyph_rasterizer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/text/placement.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/text/placement.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/text/placement_types.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/text/quads.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/text/quads.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/text/shaping.cpp diff --git a/include/mbgl/renderer/renderer.hpp b/include/mbgl/renderer/renderer.hpp index b72cc847c9..87dd014412 100644 --- a/include/mbgl/renderer/renderer.hpp +++ b/include/mbgl/renderer/renderer.hpp @@ -1,7 +1,8 @@ #pragma once -#include <mbgl/renderer/query.hpp> #include <mbgl/annotation/annotation.hpp> +#include <mbgl/renderer/query.hpp> +#include <mbgl/text/placement_types.hpp> #include <mbgl/util/geo.hpp> #include <mbgl/util/geojson.hpp> @@ -21,26 +22,6 @@ namespace gfx { class RendererBackend; } // namespace gfx -struct PlacedSymbolData { - // Contents of the label - std::u16string key; - // If symbol contains text, text collision box in viewport coordinates - optional<mapbox::geometry::box<float>> textCollisionBox; - // If symbol contains icon, icon collision box in viewport coordinates - optional<mapbox::geometry::box<float>> iconCollisionBox; - // Symbol text was placed - bool textPlaced; - // Symbol icon was placed - bool iconPlaced; - // Symbol text or icon collision box intersects tile borders - // (initialized only in tile mode) - optional<bool> intersectsTileBorder; - // Viewport padding ({viewportPadding, viewportPadding} is a coordinate of the tile's top-left corner) - float viewportPadding; - // Layer id (leader of the symbol layout group) - std::string layer; -}; - class Renderer { public: Renderer(gfx::RendererBackend&, float pixelRatio_, const optional<std::string>& localFontFamily = {}); diff --git a/include/mbgl/text/placement_types.hpp b/include/mbgl/text/placement_types.hpp new file mode 100644 index 0000000000..54ea0251cb --- /dev/null +++ b/include/mbgl/text/placement_types.hpp @@ -0,0 +1,77 @@ +#pragma once + +#include <mapbox/geometry/box.hpp> +#include <mbgl/style/types.hpp> +#include <mbgl/util/optional.hpp> + +#include <array> + +namespace mbgl { + +class OpacityState { +public: + OpacityState(bool placed, bool skipFade); + OpacityState(const OpacityState& prevState, float increment, bool placed); + bool isHidden() const; + float opacity; + bool placed; +}; + +class JointOpacityState { +public: + JointOpacityState(bool placedText, bool placedIcon, bool skipFade); + JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedText, bool placedIcon); + bool isHidden() const; + OpacityState icon; + OpacityState text; +}; + +class VariableOffset { +public: + std::array<float, 2> offset; + float width; + float height; + style::TextVariableAnchorType anchor; + float textBoxScale; + optional<style::TextVariableAnchorType> prevAnchor; +}; + +class JointPlacement { +public: + JointPlacement(bool text_, bool icon_, bool skipFade_) : text(text_), icon(icon_), skipFade(skipFade_) {} + + bool placed() const { return text || icon; } + + const bool text; + const bool icon; + // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge + // Because these symbols aren't onscreen yet, we can skip the "fade in" animation, + // and if a subsequent viewport change brings them into view, they'll be fully + // visible right away. + const bool skipFade; +}; + +struct PlacedSymbolData { + // Contents of the label + std::u16string key; + // If symbol contains text, text collision box in viewport coordinates + optional<mapbox::geometry::box<float>> textCollisionBox; + // If symbol contains icon, icon collision box in viewport coordinates + optional<mapbox::geometry::box<float>> iconCollisionBox; + // Symbol text was placed + bool textPlaced; + // Symbol icon was placed + bool iconPlaced; + // Symbol text or icon collision box intersects tile borders + // (initialized only in tile mode) + optional<bool> intersectsTileBorder; + // Viewport padding ({viewportPadding, viewportPadding} is a coordinate of the tile's top-left corner) + float viewportPadding; + // Layer id (leader of the symbol layout group) + std::string layer; + // In Continous mode, contains the previous opacity of the symbol, + // in case it was already placed. + optional<JointOpacityState> prevOpacity; +}; + +} // namespace mbgl
\ No newline at end of file diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 1a2971e16e..a55d372c62 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -12,32 +12,6 @@ namespace mbgl { -OpacityState::OpacityState(bool placed_, bool skipFade) - : opacity((skipFade && placed_) ? 1 : 0) - , placed(placed_) -{ -} - -OpacityState::OpacityState(const OpacityState& prevState, float increment, bool placed_) : - opacity(::fmax(0, ::fmin(1, prevState.opacity + (prevState.placed ? increment : -increment)))), - placed(placed_) {} - -bool OpacityState::isHidden() const { - return opacity == 0 && !placed; -} - -JointOpacityState::JointOpacityState(bool placedText, bool placedIcon, bool skipFade) : - icon(OpacityState(placedIcon, skipFade)), - text(OpacityState(placedText, skipFade)) {} - -JointOpacityState::JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedText, bool placedIcon) : - icon(OpacityState(prevOpacityState.icon, increment, placedIcon)), - text(OpacityState(prevOpacityState.text, increment, placedText)) {} - -bool JointOpacityState::isHidden() const { - return icon.isHidden() && text.isHidden(); -} - const CollisionGroups::CollisionGroup& CollisionGroups::get(const std::string& sourceID) { // The predicate/groupID mechanism allows for arbitrary grouping, // but the current interface defines one source == one group when @@ -1224,6 +1198,13 @@ bool Placement::recordSymbolPlacement(const SymbolInstance& symbol, assert(box.isBox()); iconCollisionBox = box.box(); } + optional<JointOpacityState> prevOpacity; + if (getPrevPlacement()) { + auto it = getPrevPlacement()->opacities.find(symbol.crossTileID); + if (it != getPrevPlacement()->opacities.end()) { + prevOpacity = it->second; + } + } PlacedSymbolData symbolData{symbol.key, textCollisionBox, iconCollisionBox, @@ -1231,7 +1212,8 @@ bool Placement::recordSymbolPlacement(const SymbolInstance& symbol, placement.icon, nullopt, collisionIndex.getViewportPadding(), - ctx.getBucket().bucketLeaderID}; + ctx.getBucket().bucketLeaderID, + prevOpacity}; placedSymbolsData.emplace_back(std::move(symbolData)); return true; } @@ -1239,7 +1221,7 @@ bool Placement::recordSymbolPlacement(const SymbolInstance& symbol, const CollisionIndex& Placement::getCollisionIndex() const { return collisionIndex; } - + const RetainedQueryData& Placement::getQueryData(uint32_t bucketInstanceId) const { auto it = retainedQueryData.find(bucketInstanceId); if (it == retainedQueryData.end()) { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 864f195c80..28296115ee 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -4,6 +4,7 @@ #include <mbgl/renderer/renderer.hpp> #include <mbgl/style/transition_options.hpp> #include <mbgl/text/collision_index.hpp> +#include <mbgl/text/placement_types.hpp> #include <mbgl/util/chrono.hpp> #include <string> #include <unordered_map> @@ -17,51 +18,6 @@ using SymbolInstanceReferences = std::vector<std::reference_wrapper<const Symbol class UpdateParameters; enum class PlacedSymbolOrientation : bool; -class OpacityState { -public: - OpacityState(bool placed, bool skipFade); - OpacityState(const OpacityState& prevState, float increment, bool placed); - bool isHidden() const; - float opacity; - bool placed; -}; - -class JointOpacityState { -public: - JointOpacityState(bool placedText, bool placedIcon, bool skipFade); - JointOpacityState(const JointOpacityState& prevOpacityState, float increment, bool placedText, bool placedIcon); - bool isHidden() const; - OpacityState icon; - OpacityState text; -}; - -class VariableOffset { -public: - std::array<float, 2> offset; - float width; - float height; - style::TextVariableAnchorType anchor; - float textBoxScale; - optional<style::TextVariableAnchorType> prevAnchor; -}; - -class JointPlacement { -public: - JointPlacement(bool text_, bool icon_, bool skipFade_) - : text(text_), icon(icon_), skipFade(skipFade_) - {} - - bool placed() const { return text || icon; } - - const bool text; - const bool icon; - // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge - // Because these symbols aren't onscreen yet, we can skip the "fade in" animation, - // and if a subsequent viewport change brings them into view, they'll be fully - // visible right away. - const bool skipFade; -}; - struct RetainedQueryData { uint32_t bucketInstanceId; std::shared_ptr<FeatureIndex> featureIndex; diff --git a/src/mbgl/text/placement_types.cpp b/src/mbgl/text/placement_types.cpp new file mode 100644 index 0000000000..02cf90e11a --- /dev/null +++ b/src/mbgl/text/placement_types.cpp @@ -0,0 +1,30 @@ +#include <mbgl/text/placement_types.hpp> + +#include <cmath> + +namespace mbgl { + +OpacityState::OpacityState(bool placed_, bool skipFade) : opacity((skipFade && placed_) ? 1 : 0), placed(placed_) {} + +OpacityState::OpacityState(const OpacityState& prevState, float increment, bool placed_) + : opacity(::fmax(0, ::fmin(1, prevState.opacity + (prevState.placed ? increment : -increment)))), placed(placed_) {} + +bool OpacityState::isHidden() const { + return opacity == 0 && !placed; +} + +JointOpacityState::JointOpacityState(bool placedText, bool placedIcon, bool skipFade) + : icon(OpacityState(placedIcon, skipFade)), text(OpacityState(placedText, skipFade)) {} + +JointOpacityState::JointOpacityState(const JointOpacityState& prevOpacityState, + float increment, + bool placedText, + bool placedIcon) + : icon(OpacityState(prevOpacityState.icon, increment, placedIcon)), + text(OpacityState(prevOpacityState.text, increment, placedText)) {} + +bool JointOpacityState::isHidden() const { + return icon.isHidden() && text.isHidden(); +} + +} // namespace mbgl
\ No newline at end of file |