summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2017-03-30 15:56:35 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2017-03-31 13:26:27 -0700
commitd7a55a4be1300d79da0c63aefdf5d48d0c45a404 (patch)
treee50f42cdf87fa59c0f71d15892652c0e3424703a
parent939526bac4aff734be4e6382b64c43214eb0bc9b (diff)
downloadqtlocation-mapboxgl-d7a55a4be1300d79da0c63aefdf5d48d0c45a404.tar.gz
[core] Introduce a fully-evaluated tuple type for layout properties
-rw-r--r--src/mbgl/layout/symbol_instance.cpp2
-rw-r--r--src/mbgl/layout/symbol_instance.hpp2
-rw-r--r--src/mbgl/layout/symbol_layout.hpp2
-rw-r--r--src/mbgl/renderer/line_bucket.hpp2
-rw-r--r--src/mbgl/renderer/symbol_bucket.cpp2
-rw-r--r--src/mbgl/renderer/symbol_bucket.hpp4
-rw-r--r--src/mbgl/style/layers/symbol_layer_impl.cpp4
-rw-r--r--src/mbgl/style/layers/symbol_layer_impl.hpp4
-rw-r--r--src/mbgl/style/layout_property.hpp66
-rw-r--r--src/mbgl/text/quads.cpp4
-rw-r--r--src/mbgl/text/quads.hpp4
-rw-r--r--test/gl/bucket.test.cpp2
-rw-r--r--test/text/quads.test.cpp24
-rw-r--r--test/tile/vector_tile.test.cpp4
14 files changed, 84 insertions, 42 deletions
diff --git a/src/mbgl/layout/symbol_instance.cpp b/src/mbgl/layout/symbol_instance.cpp
index 8bdc528bbb..2264bfdc92 100644
--- a/src/mbgl/layout/symbol_instance.cpp
+++ b/src/mbgl/layout/symbol_instance.cpp
@@ -9,7 +9,7 @@ SymbolInstance::SymbolInstance(Anchor& anchor,
const GeometryCoordinates& line,
const std::pair<Shaping, Shaping>& shapedTextOrientations,
const PositionedIcon& shapedIcon,
- const SymbolLayoutProperties::Evaluated& layout,
+ const SymbolLayoutProperties::PossiblyEvaluated& layout,
const bool addToBuffers,
const uint32_t index_,
const float textBoxScale,
diff --git a/src/mbgl/layout/symbol_instance.hpp b/src/mbgl/layout/symbol_instance.hpp
index 70ebfeefa2..0980eb492b 100644
--- a/src/mbgl/layout/symbol_instance.hpp
+++ b/src/mbgl/layout/symbol_instance.hpp
@@ -16,7 +16,7 @@ public:
const GeometryCoordinates& line,
const std::pair<Shaping, Shaping>& shapedTextOrientations,
const PositionedIcon& shapedIcon,
- const style::SymbolLayoutProperties::Evaluated&,
+ const style::SymbolLayoutProperties::PossiblyEvaluated&,
const bool inside,
const uint32_t index,
const float textBoxScale,
diff --git a/src/mbgl/layout/symbol_layout.hpp b/src/mbgl/layout/symbol_layout.hpp
index 5b14090d97..bd72d3cd3f 100644
--- a/src/mbgl/layout/symbol_layout.hpp
+++ b/src/mbgl/layout/symbol_layout.hpp
@@ -78,7 +78,7 @@ private:
const float zoom;
const MapMode mode;
- style::SymbolLayoutProperties::Evaluated layout;
+ style::SymbolLayoutProperties::PossiblyEvaluated layout;
float textMaxSize;
SpriteAtlas& spriteAtlas;
diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp
index 8d1ff2a3f2..5a126ba18e 100644
--- a/src/mbgl/renderer/line_bucket.hpp
+++ b/src/mbgl/renderer/line_bucket.hpp
@@ -29,7 +29,7 @@ public:
void upload(gl::Context&) override;
void render(Painter&, PaintParameters&, const style::Layer&, const RenderTile&) override;
- style::LineLayoutProperties::Evaluated layout;
+ style::LineLayoutProperties::PossiblyEvaluated layout;
gl::VertexVector<LineLayoutVertex> vertices;
gl::IndexVector<gl::Triangles> triangles;
diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp
index 1f2c81bc1c..b046571740 100644
--- a/src/mbgl/renderer/symbol_bucket.cpp
+++ b/src/mbgl/renderer/symbol_bucket.cpp
@@ -8,7 +8,7 @@ namespace mbgl {
using namespace style;
-SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::Evaluated layout_,
+SymbolBucket::SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated layout_,
const std::map<std::string, std::pair<
style::IconPaintProperties::Evaluated, style::TextPaintProperties::Evaluated>>& layerPaintProperties,
float zoom,
diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp
index d5141d2d96..7a498ab17d 100644
--- a/src/mbgl/renderer/symbol_bucket.hpp
+++ b/src/mbgl/renderer/symbol_bucket.hpp
@@ -16,7 +16,7 @@ namespace mbgl {
class SymbolBucket : public Bucket {
public:
- SymbolBucket(style::SymbolLayoutProperties::Evaluated,
+ SymbolBucket(style::SymbolLayoutProperties::PossiblyEvaluated,
const std::map<std::string, std::pair<style::IconPaintProperties::Evaluated, style::TextPaintProperties::Evaluated>>&,
float zoom,
bool sdfIcons,
@@ -29,7 +29,7 @@ public:
bool hasIconData() const;
bool hasCollisionBoxData() const;
- const style::SymbolLayoutProperties::Evaluated layout;
+ const style::SymbolLayoutProperties::PossiblyEvaluated layout;
const bool sdfIcons;
const bool iconsNeedLinear;
diff --git a/src/mbgl/style/layers/symbol_layer_impl.cpp b/src/mbgl/style/layers/symbol_layer_impl.cpp
index ff59b14d65..e4557c953f 100644
--- a/src/mbgl/style/layers/symbol_layer_impl.cpp
+++ b/src/mbgl/style/layers/symbol_layer_impl.cpp
@@ -68,7 +68,7 @@ TextPaintProperties::Evaluated SymbolLayer::Impl::textPaintProperties() const {
}
-SymbolPropertyValues SymbolLayer::Impl::iconPropertyValues(const SymbolLayoutProperties::Evaluated& layout_) const {
+SymbolPropertyValues SymbolLayer::Impl::iconPropertyValues(const SymbolLayoutProperties::PossiblyEvaluated& layout_) const {
return SymbolPropertyValues {
layout_.get<IconRotationAlignment>(), // icon-pitch-alignment is not yet implemented; inherit the rotation alignment
layout_.get<IconRotationAlignment>(),
@@ -83,7 +83,7 @@ SymbolPropertyValues SymbolLayer::Impl::iconPropertyValues(const SymbolLayoutPro
};
}
-SymbolPropertyValues SymbolLayer::Impl::textPropertyValues(const SymbolLayoutProperties::Evaluated& layout_) const {
+SymbolPropertyValues SymbolLayer::Impl::textPropertyValues(const SymbolLayoutProperties::PossiblyEvaluated& layout_) const {
return SymbolPropertyValues {
layout_.get<TextPitchAlignment>(),
layout_.get<TextRotationAlignment>(),
diff --git a/src/mbgl/style/layers/symbol_layer_impl.hpp b/src/mbgl/style/layers/symbol_layer_impl.hpp
index 1e9f05e4c7..0c4b74e833 100644
--- a/src/mbgl/style/layers/symbol_layer_impl.hpp
+++ b/src/mbgl/style/layers/symbol_layer_impl.hpp
@@ -72,8 +72,8 @@ public:
IconPaintProperties::Evaluated iconPaintProperties() const;
TextPaintProperties::Evaluated textPaintProperties() const;
- SymbolPropertyValues iconPropertyValues(const SymbolLayoutProperties::Evaluated&) const;
- SymbolPropertyValues textPropertyValues(const SymbolLayoutProperties::Evaluated&) const;
+ SymbolPropertyValues iconPropertyValues(const SymbolLayoutProperties::PossiblyEvaluated&) const;
+ SymbolPropertyValues textPropertyValues(const SymbolLayoutProperties::PossiblyEvaluated&) const;
SymbolLayoutProperties layout;
SymbolPaintProperties paint;
diff --git a/src/mbgl/style/layout_property.hpp b/src/mbgl/style/layout_property.hpp
index 25cff4b92d..624ff2bdc5 100644
--- a/src/mbgl/style/layout_property.hpp
+++ b/src/mbgl/style/layout_property.hpp
@@ -16,7 +16,7 @@ class LayoutProperty {
public:
using UnevaluatedType = PropertyValue<T>;
using EvaluatorType = PropertyEvaluator<T>;
- using EvaluatedType = T;
+ using PossiblyEvaluatedType = T;
using Type = T;
};
@@ -25,7 +25,7 @@ class DataDrivenLayoutProperty {
public:
using UnevaluatedType = DataDrivenPropertyValue<T>;
using EvaluatorType = DataDrivenPropertyEvaluator<T>;
- using EvaluatedType = PossiblyEvaluatedPropertyValue<T>;
+ using PossiblyEvaluatedType = PossiblyEvaluatedPropertyValue<T>;
using Type = T;
};
@@ -33,23 +33,65 @@ template <class... Ps>
class LayoutProperties {
public:
using Properties = TypeList<Ps...>;
- using EvaluatedTypes = TypeList<typename Ps::EvaluatedType...>;
- using UnevaluatedTypes = TypeList<typename Ps::UnevaluatedType...>;
template <class TypeList>
using Tuple = IndexedTuple<Properties, TypeList>;
+ /*
+ For layout properties we implement a two step evaluation process: if you have a zoom level,
+ you can evaluate a set of unevaluated property values, producing a set of possibly evaluated
+ values, where non-data-driven property values have been fully evaluated, and data-driven values
+ have not.
+
+ Once you also have a particular feature, you can evaluate that set of possibly evaluated values
+ fully, producing a set of fully evaluated values.
+
+ This is in theory maximally efficient in terms of avoiding repeated evaluation of camera
+ functions, though it's more of a historical accident that a purposeful optimization.
+ */
+
+ using UnevaluatedTypes = TypeList<typename Ps::UnevaluatedType...>;
+ using PossiblyEvaluatedTypes = TypeList<typename Ps::PossiblyEvaluatedType...>;
+ using EvaluatedTypes = TypeList<typename Ps::Type...>;
+
class Evaluated : public Tuple<EvaluatedTypes> {
public:
using Tuple<EvaluatedTypes>::Tuple;
+ };
+
+ class PossiblyEvaluated : public Tuple<PossiblyEvaluatedTypes> {
+ public:
+ using Tuple<PossiblyEvaluatedTypes>::Tuple;
+
+ template <class T>
+ static T evaluate(float, const GeometryTileFeature&, const T& t, const T&) {
+ return t;
+ }
+
+ template <class T>
+ static T evaluate(float z, const GeometryTileFeature& feature,
+ const PossiblyEvaluatedPropertyValue<T>& v, const T& defaultValue) {
+ return v.match(
+ [&] (const T& t) {
+ return t;
+ },
+ [&] (const SourceFunction<T>& t) {
+ return t.evaluate(feature, defaultValue);
+ },
+ [&] (const CompositeFunction<T>& t) {
+ return t.evaluate(z, feature, defaultValue);
+ });
+ }
template <class P>
- typename P::Type evaluate(float z, const GeometryTileFeature& feature) const {
- using T = typename P::Type;
- return this->template get<P>().match(
- [&] (const T& t) { return t; },
- [&] (const SourceFunction<T>& t) { return t.evaluate(feature, P::defaultValue()); },
- [&] (const CompositeFunction<T>& t) { return t.evaluate(z, feature, P::defaultValue()); });
+ auto evaluate(float z, const GeometryTileFeature& feature) const {
+ return evaluate(z, feature, this->template get<P>(), P::defaultValue());
+ }
+
+ Evaluated evaluate(float z, const GeometryTileFeature& feature) const {
+ return Evaluated {
+ evaluate<Ps>(z, feature)...
+ };
}
};
@@ -65,8 +107,8 @@ public:
.evaluate(Evaluator(parameters, P::defaultValue()));
}
- Evaluated evaluate(const PropertyEvaluationParameters& parameters) const {
- return Evaluated {
+ PossiblyEvaluated evaluate(const PropertyEvaluationParameters& parameters) const {
+ return PossiblyEvaluated {
evaluate<Ps>(parameters)...
};
}
diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp
index b13a6a71e5..d3edafa1a0 100644
--- a/src/mbgl/text/quads.cpp
+++ b/src/mbgl/text/quads.cpp
@@ -18,7 +18,7 @@ const float globalMinScale = 0.5f; // underscale by 1 zoom level
SymbolQuad getIconQuad(const Anchor& anchor,
const PositionedIcon& shapedIcon,
const GeometryCoordinates& line,
- const SymbolLayoutProperties::Evaluated& layout,
+ const SymbolLayoutProperties::PossiblyEvaluated& layout,
const style::SymbolPlacementType placement,
const Shaping& shapedText) {
auto image = *(shapedIcon.image);
@@ -292,7 +292,7 @@ SymbolQuads getGlyphQuads(Anchor& anchor,
const Shaping& shapedText,
const float boxScale,
const GeometryCoordinates& line,
- const SymbolLayoutProperties::Evaluated& layout,
+ const SymbolLayoutProperties::PossiblyEvaluated& layout,
const style::SymbolPlacementType placement,
const GlyphPositions& face) {
const float textRotate = layout.get<TextRotate>() * util::DEG2RAD;
diff --git a/src/mbgl/text/quads.hpp b/src/mbgl/text/quads.hpp
index f1529d8829..7e3b5ca405 100644
--- a/src/mbgl/text/quads.hpp
+++ b/src/mbgl/text/quads.hpp
@@ -54,7 +54,7 @@ typedef std::vector<SymbolQuad> SymbolQuads;
SymbolQuad getIconQuad(const Anchor& anchor,
const PositionedIcon& shapedIcon,
const GeometryCoordinates& line,
- const style::SymbolLayoutProperties::Evaluated&,
+ const style::SymbolLayoutProperties::PossiblyEvaluated&,
style::SymbolPlacementType placement,
const Shaping& shapedText);
@@ -62,7 +62,7 @@ SymbolQuads getGlyphQuads(Anchor& anchor,
const Shaping& shapedText,
const float boxScale,
const GeometryCoordinates& line,
- const style::SymbolLayoutProperties::Evaluated&,
+ const style::SymbolLayoutProperties::PossiblyEvaluated&,
style::SymbolPlacementType placement,
const GlyphPositions& face);
diff --git a/test/gl/bucket.test.cpp b/test/gl/bucket.test.cpp
index feda234af2..1ab6623122 100644
--- a/test/gl/bucket.test.cpp
+++ b/test/gl/bucket.test.cpp
@@ -27,7 +27,7 @@ TEST(Buckets, LineBucket) {
}
TEST(Buckets, SymbolBucket) {
- style::SymbolLayoutProperties::Evaluated layout;
+ style::SymbolLayoutProperties::PossiblyEvaluated layout;
bool sdfIcons = false;
bool iconsNeedLinear = false;
diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp
index 42bc0f2048..dc81a34312 100644
--- a/test/text/quads.test.cpp
+++ b/test/text/quads.test.cpp
@@ -10,7 +10,7 @@ using namespace mbgl;
using namespace mbgl::style;
TEST(getIconQuads, normal) {
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
Anchor anchor(2.0, 3.0, 0.0, 0.5f, 0);
SpriteAtlasElement image = {
Rect<uint16_t>( 0, 0, 15, 11 ),
@@ -59,7 +59,7 @@ TEST(getIconQuads, style) {
// none
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
SymbolQuad quad =
getIconQuad(anchor, shapedIcon, line, layout, SymbolPlacementType::Point, shapedText);
@@ -80,7 +80,7 @@ TEST(getIconQuads, style) {
// width
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 24.0f;
layout.get<IconTextFit>() = IconTextFitType::Width;
SymbolQuad quad =
@@ -98,7 +98,7 @@ TEST(getIconQuads, style) {
// width x textSize
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Width;
SymbolQuad quad =
@@ -116,7 +116,7 @@ TEST(getIconQuads, style) {
// width x textSize + padding
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Width;
layout.get<IconTextFitPadding>()[0] = 5.0f;
@@ -138,7 +138,7 @@ TEST(getIconQuads, style) {
// height
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 24.0f;
layout.get<IconTextFit>() = IconTextFitType::Height;
SymbolQuad quad =
@@ -156,7 +156,7 @@ TEST(getIconQuads, style) {
// height x textSize
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Height;
SymbolQuad quad =
@@ -174,7 +174,7 @@ TEST(getIconQuads, style) {
// height x textSize + padding
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Height;
layout.get<IconTextFitPadding>()[0] = 5.0f;
@@ -196,7 +196,7 @@ TEST(getIconQuads, style) {
// both
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 24.0f;
layout.get<IconTextFit>() = IconTextFitType::Both;
SymbolQuad quad =
@@ -214,7 +214,7 @@ TEST(getIconQuads, style) {
// both x textSize
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Both;
SymbolQuad quad =
@@ -232,7 +232,7 @@ TEST(getIconQuads, style) {
// both x textSize + padding
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Both;
layout.get<IconTextFitPadding>()[0] = 5.0f;
@@ -254,7 +254,7 @@ TEST(getIconQuads, style) {
// both x textSize + padding t/r/b/l
{
- SymbolLayoutProperties::Evaluated layout;
+ SymbolLayoutProperties::PossiblyEvaluated layout;
layout.get<TextSize>() = 12.0f;
layout.get<IconTextFit>() = IconTextFitType::Both;
layout.get<IconTextFitPadding>()[0] = 0.0f;
diff --git a/test/tile/vector_tile.test.cpp b/test/tile/vector_tile.test.cpp
index aa39824787..eb2b89d346 100644
--- a/test/tile/vector_tile.test.cpp
+++ b/test/tile/vector_tile.test.cpp
@@ -60,7 +60,7 @@ TEST(VectorTile, Issue7615) {
style::SymbolLayer symbolLayer("symbol", "source");
auto symbolBucket = std::make_shared<SymbolBucket>(
- style::SymbolLayoutProperties::Evaluated(),
+ style::SymbolLayoutProperties::PossiblyEvaluated(),
std::map<
std::string,
std::pair<style::IconPaintProperties::Evaluated, style::TextPaintProperties::Evaluated>>(),
@@ -94,4 +94,4 @@ TEST(VectorTile, Issue8542) {
// Query before data is set
std::vector<Feature> result;
tile.querySourceFeatures(result, { { {"layer"} }, {} });
-} \ No newline at end of file
+}