diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2019-12-10 13:38:36 +0100 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2020-01-15 15:02:11 +0200 |
commit | 027e803b722301a03e9ef53b584c2795ff47e7bd (patch) | |
tree | d40e718688a00980ad5c40dc5db7200fb732410a | |
parent | 1342cb44b3f8bb0cd5c019174b62886b84d62cf8 (diff) |
[core] move icon rotation from shaping to quad generation to mirror JS
-rw-r--r-- | src/mbgl/layout/symbol_instance.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_instance.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/layout/symbol_layout.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/text/quads.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/text/quads.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/text/shaping.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/text/shaping.hpp | 9 | ||||
-rw-r--r-- | test/text/cross_tile_symbol_index.test.cpp | 1 | ||||
-rw-r--r-- | test/text/quads.test.cpp | 48 |
9 files changed, 39 insertions, 40 deletions
diff --git a/src/mbgl/layout/symbol_instance.cpp b/src/mbgl/layout/symbol_instance.cpp index 3a16d25de..01ba3e26a 100644 --- a/src/mbgl/layout/symbol_instance.cpp +++ b/src/mbgl/layout/symbol_instance.cpp @@ -26,14 +26,15 @@ SymbolInstanceSharedData::SymbolInstanceSharedData(GeometryCoordinates line_, const style::SymbolPlacementType textPlacement, const std::array<float, 2>& textOffset, const ImageMap& imageMap, + float iconRotation, SymbolContent iconType, bool allowVerticalPlacement) : line(std::move(line_)) { // Create the quads used for rendering the icon and glyphs. if (shapedIcon) { - iconQuads = getIconQuads(*shapedIcon, iconType); + iconQuads = getIconQuads(*shapedIcon, iconRotation, iconType); if (verticallyShapedIcon) { - verticalIconQuads = getIconQuads(*verticallyShapedIcon, iconType); + verticalIconQuads = getIconQuads(*verticallyShapedIcon, iconRotation, iconType); } } diff --git a/src/mbgl/layout/symbol_instance.hpp b/src/mbgl/layout/symbol_instance.hpp index 74124d336..56dd82240 100644 --- a/src/mbgl/layout/symbol_instance.hpp +++ b/src/mbgl/layout/symbol_instance.hpp @@ -32,6 +32,7 @@ struct SymbolInstanceSharedData { const style::SymbolPlacementType textPlacement, const std::array<float, 2>& textOffset, const ImageMap& imageMap, + float iconRotation, SymbolContent iconType, bool allowVerticalPlacement); bool empty() const; diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 98274136e..1772d1ef9 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -474,8 +474,7 @@ void SymbolLayout::prepareSymbols(const GlyphMap& glyphMap, iconType = SymbolContent::IconRGBA; shapedIcon = PositionedIcon::shapeIcon(imagePositions.at(feature.icon->id()), layout->evaluate<IconOffset>(zoom, feature), - layout->evaluate<IconAnchor>(zoom, feature), - layout->evaluate<IconRotate>(zoom, feature) * util::DEG2RAD); + layout->evaluate<IconAnchor>(zoom, feature)); if (image->second->sdf) { iconType = SymbolContent::IconSDF; } @@ -601,6 +600,7 @@ void SymbolLayout::addFeature(const std::size_t layoutFeatureIndex, textPlacement, textOffset, imageMap, + iconRotation, iconType, allowVerticalPlacement); }; diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp index fe683f7d9..b6427d0d0 100644 --- a/src/mbgl/text/quads.cpp +++ b/src/mbgl/text/quads.cpp @@ -14,7 +14,7 @@ namespace mbgl { using namespace style; -SymbolQuads getIconQuads(const PositionedIcon& shapedIcon, SymbolContent iconType) { +SymbolQuads getIconQuads(const PositionedIcon& shapedIcon, const float iconRotate, const SymbolContent iconType) { const ImagePosition& image = shapedIcon.image(); // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual @@ -42,7 +42,7 @@ SymbolQuads getIconQuads(const PositionedIcon& shapedIcon, SymbolContent iconTyp Point<float> br{right, bottom}; Point<float> bl{left, bottom}; - const float angle = shapedIcon.angle(); + const float angle = iconRotate * util::DEG2RAD; if (angle) { // Compute the transformation matrix. diff --git a/src/mbgl/text/quads.hpp b/src/mbgl/text/quads.hpp index aa1913204..ef058989a 100644 --- a/src/mbgl/text/quads.hpp +++ b/src/mbgl/text/quads.hpp @@ -57,7 +57,7 @@ public: using SymbolQuads = std::vector<SymbolQuad>; -SymbolQuads getIconQuads(const PositionedIcon& shapedIcon, SymbolContent iconType); +SymbolQuads getIconQuads(const PositionedIcon& shapedIcon, float iconRotate, SymbolContent iconType); SymbolQuads getGlyphQuads(const Shaping& shapedText, const std::array<float, 2> textOffset, diff --git a/src/mbgl/text/shaping.cpp b/src/mbgl/text/shaping.cpp index 2b23deade..033cbdf4e 100644 --- a/src/mbgl/text/shaping.cpp +++ b/src/mbgl/text/shaping.cpp @@ -70,8 +70,7 @@ style::TextJustifyType getAnchorJustification(style::SymbolAnchorType anchor) { PositionedIcon PositionedIcon::shapeIcon(const ImagePosition& image, const std::array<float, 2>& iconOffset, - style::SymbolAnchorType iconAnchor, - const float iconRotation) { + style::SymbolAnchorType iconAnchor) { AnchorAlignment anchorAlign = AnchorAlignment::getAnchorAlignment(iconAnchor); float dx = iconOffset[0]; float dy = iconOffset[1]; @@ -80,7 +79,7 @@ PositionedIcon PositionedIcon::shapeIcon(const ImagePosition& image, float top = dy - image.displaySize()[1] * anchorAlign.verticalAlign; float bottom = top + image.displaySize()[1]; - return PositionedIcon { image, top, bottom, left, right, iconRotation }; + return PositionedIcon{image, top, bottom, left, right}; } void PositionedIcon::fitIconToText(const Shaping& shapedText, diff --git a/src/mbgl/text/shaping.hpp b/src/mbgl/text/shaping.hpp index 1f62f3852..0c238d36b 100644 --- a/src/mbgl/text/shaping.hpp +++ b/src/mbgl/text/shaping.hpp @@ -28,21 +28,19 @@ class BiDi; class PositionedIcon { private: - PositionedIcon(ImagePosition image_, float top_, float bottom_, float left_, float right_, float angle_) - : _image(image_), _top(top_), _bottom(bottom_), _left(left_), _right(right_), _angle(angle_) {} + PositionedIcon(ImagePosition image_, float top_, float bottom_, float left_, float right_) + : _image(image_), _top(top_), _bottom(bottom_), _left(left_), _right(right_) {} ImagePosition _image; float _top; float _bottom; float _left; float _right; - float _angle; public: static PositionedIcon shapeIcon(const ImagePosition&, const std::array<float, 2>& iconOffset, - style::SymbolAnchorType iconAnchor, - const float iconRotation); + style::SymbolAnchorType iconAnchor); // Updates shaped icon's bounds based on shaped text's bounds and provided // layout properties. @@ -57,7 +55,6 @@ public: float bottom() const { return _bottom; } float left() const { return _left; } float right() const { return _right; } - float angle() const { return _angle; } }; const Shaping getShaping(const TaggedString& string, diff --git a/test/text/cross_tile_symbol_index.test.cpp b/test/text/cross_tile_symbol_index.test.cpp index 422102d38..3b02a9042 100644 --- a/test/text/cross_tile_symbol_index.test.cpp +++ b/test/text/cross_tile_symbol_index.test.cpp @@ -24,6 +24,7 @@ SymbolInstance makeSymbolInstance(float x, float y, std::u16string key) { placementType, textOffset, imageMap, + 0, SymbolContent::IconSDF, false); return SymbolInstance(anchor, std::move(sharedData), shaping, nullopt, nullopt, 0, 0, placementType, textOffset, 0, 0, iconOffset, subfeature, 0, 0, key, 0.0f, 0.0f, 0.0f, variableTextOffset, false); diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp index 46019da3c..4068fe643 100644 --- a/test/text/quads.test.cpp +++ b/test/text/quads.test.cpp @@ -18,11 +18,11 @@ TEST(getIconQuads, normal) { style::Image::Impl("test", PremultipliedImage({1,1}), 1.0) }; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -6.5f, -4.5f }}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-6.5f, -4.5f}}, SymbolAnchorType::Center); GeometryCoordinates line; - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -54,7 +54,7 @@ TEST(getIconQuads, style) { // none { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); EXPECT_FLOAT_EQ(-18.5f, shapedIcon.top()); EXPECT_FLOAT_EQ(-0.5f, shapedIcon.right()); @@ -62,7 +62,7 @@ TEST(getIconQuads, style) { EXPECT_FLOAT_EQ(-18.5f, shapedIcon.left()); SymbolLayoutProperties::Evaluated layout; - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -79,9 +79,9 @@ TEST(getIconQuads, style) { // width { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -98,9 +98,9 @@ TEST(getIconQuads, style) { // width x textSize { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -117,9 +117,9 @@ TEST(getIconQuads, style) { // width x textSize + padding { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{5, 10, 5, 10}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -136,9 +136,9 @@ TEST(getIconQuads, style) { // height { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -156,9 +156,9 @@ TEST(getIconQuads, style) { // height x textSize { SymbolLayoutProperties::Evaluated layout; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -175,9 +175,9 @@ TEST(getIconQuads, style) { // height x textSize + padding { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{5, 10, 5, 20}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -194,9 +194,9 @@ TEST(getIconQuads, style) { // both { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -213,9 +213,9 @@ TEST(getIconQuads, style) { // both x textSize { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -232,9 +232,9 @@ TEST(getIconQuads, style) { // both x textSize + padding { - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{5, 10, 5, 10}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; @@ -253,9 +253,9 @@ TEST(getIconQuads, style) { { SymbolLayoutProperties::Evaluated layout; layout.get<TextSize>() = 12.0f; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center); shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 5, 10, 15}}, {{0, 0}}, 12.0f / 24.0f); - SymbolQuads quads = getIconQuads(shapedIcon, SymbolContent::IconRGBA); + SymbolQuads quads = getIconQuads(shapedIcon, 0, SymbolContent::IconRGBA); ASSERT_EQ(quads.size(), 1); const auto& quad = quads[0]; |