summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-05-26 00:12:32 +0300
committerThiago Marcos P. Santos <thiago@mapbox.com>2020-05-26 20:37:08 +0300
commit49d7f198f649f2ad1647857edb67a0a2e0535271 (patch)
tree06388d3b47e06ef370fd834481a6fc806da54c19
parentf5befeb2a4cd737562f27b6d7bb918cfd97d8bd8 (diff)
downloadqtlocation-mapboxgl-49d7f198f649f2ad1647857edb67a0a2e0535271.tar.gz
[core] Export placement types
-rw-r--r--CMakeLists.txt2
-rw-r--r--include/mbgl/renderer/renderer.hpp23
-rw-r--r--include/mbgl/text/placement_types.hpp77
-rw-r--r--src/mbgl/text/placement.cpp38
-rw-r--r--src/mbgl/text/placement.hpp46
-rw-r--r--src/mbgl/text/placement_types.cpp30
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