diff --git a/mapbox-gl-js b/mapbox-gl-js index 7ea73ed381a..2dbbf634906 160000 --- a/mapbox-gl-js +++ b/mapbox-gl-js @@ -1 +1 @@ -Subproject commit 7ea73ed381a81c3ff7e48b523b25d50793baf1f5 +Subproject commit 2dbbf634906dc1b02b48cb740dadb6de16348475 diff --git a/platform/node/test/ignores.json b/platform/node/test/ignores.json index 289f38be388..51decb351c0 100644 --- a/platform/node/test/ignores.json +++ b/platform/node/test/ignores.json @@ -76,6 +76,9 @@ "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", "render-tests/regressions/mapbox-gl-js#8817": "skip - https://github.com/mapbox/mapbox-gl-native/issues/15737", + "render-tests/text-max-width/zero-width-point-placement": "https://github.com/mapbox/mapbox-gl-native/issues/15648", + "render-tests/icon-image/image-expression": "https://github.com/mapbox/mapbox-gl-native/issues/15800", + "render-tests/icon-text-fit/text-variable-anchor-overlap": "https://github.com/mapbox/mapbox-gl-native/issues/15809", "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/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp index 81d1d9a5b67..d0227c36c56 100644 --- a/src/mbgl/layout/symbol_layout.cpp +++ b/src/mbgl/layout/symbol_layout.cpp @@ -121,7 +121,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters, allowVerticalPlacement = allowVerticalPlacement || placementMode == style::TextWritingModeType::Vertical; return !seen.insert(placementMode).second; }); - modes.erase(end, modes.end()); + modes.erase(end, modes.end()); placementModes = std::move(modes); } @@ -525,21 +525,22 @@ void SymbolLayout::addFeature(const std::size_t layoutFeatureIndex, const float textRepeatDistance = symbolSpacing / 2; const auto evaluatedLayoutProperties = layout->evaluate(zoom, feature); IndexedSubfeature indexedFeature(feature.index, sourceLayer->getName(), bucketLeaderID, symbolInstances.size()); - const bool hasIconTextFit = evaluatedLayoutProperties.get() != IconTextFitType::None; + const auto iconTextFit = evaluatedLayoutProperties.get(); // Adjust shaped icon size when icon-text-fit is used. optional verticallyShapedIcon; - if (shapedIcon && hasIconTextFit) { + if (shapedIcon && iconTextFit != IconTextFitType::None) { // Create vertically shaped icon for vertical writing mode if needed. if (allowVerticalPlacement && shapedTextOrientations.vertical) { verticallyShapedIcon = shapedIcon; - verticallyShapedIcon->fitIconToText(evaluatedLayoutProperties, - shapedTextOrientations.vertical, - layoutTextSize); + verticallyShapedIcon->fitIconToText( + shapedTextOrientations.vertical, iconTextFit, layout->get(), iconOffset, fontScale); + } + const auto shapedText = getDefaultHorizontalShaping(shapedTextOrientations); + if (shapedText) { + shapedIcon->fitIconToText( + shapedText, iconTextFit, layout->get(), iconOffset, fontScale); } - shapedIcon->fitIconToText(evaluatedLayoutProperties, - getDefaultHorizontalShaping(shapedTextOrientations), - layoutTextSize); } auto addSymbolInstance = [&] (Anchor& anchor, std::shared_ptr sharedData) { diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp index 281c5d99de8..a94bfee336c 100644 --- a/src/mbgl/text/quads.cpp +++ b/src/mbgl/text/quads.cpp @@ -20,12 +20,28 @@ SymbolQuad getIconQuad(const PositionedIcon& shapedIcon, // If you have a 10px icon that isn't perfectly aligned to the pixel grid it will cover 11 actual // pixels. The quad needs to be padded to account for this, otherwise they'll look slightly clipped // on one edge in some cases. - const float border = 1.0; - - float top = shapedIcon.top() - border / image.pixelRatio; - float left = shapedIcon.left() - border / image.pixelRatio; - float bottom = shapedIcon.bottom() + border / image.pixelRatio; - float right = shapedIcon.right() + border / image.pixelRatio; + constexpr const float border = 1.0f; + + // Expand the box to respect the 1 pixel border in the atlas image. We're using `image.paddedRect - border` + // instead of image.displaySize because we only pad with one pixel for retina images as well, and the + // displaySize uses the logical dimensions, not the physical pixel dimensions. + // Unlike the JavaScript version, we're _not_ including the padding in the texture rect, so the + // logic "dimension * padded / non-padded - dimension" is swapped. + const float iconWidth = shapedIcon.right() - shapedIcon.left(); + const float expandX = (iconWidth * (static_cast(image.textureRect.w) + 2.0f * border) / + static_cast(image.textureRect.w) - + iconWidth) / + 2.0f; + const float left = shapedIcon.left() - expandX; + const float right = shapedIcon.right() + expandX; + + const float iconHeight = shapedIcon.bottom() - shapedIcon.top(); + const float expandY = (iconHeight * (static_cast(image.textureRect.h) + 2.0f * border) / + static_cast(image.textureRect.h) - + iconHeight) / + 2.0f; + const float top = shapedIcon.top() - expandY; + const float bottom = shapedIcon.bottom() + expandY; Point tl{left, top}; Point tr{right, top}; diff --git a/src/mbgl/text/shaping.cpp b/src/mbgl/text/shaping.cpp index 4ae9d0cf205..8eb885af5d5 100644 --- a/src/mbgl/text/shaping.cpp +++ b/src/mbgl/text/shaping.cpp @@ -83,33 +83,41 @@ PositionedIcon PositionedIcon::shapeIcon(const ImagePosition& image, return PositionedIcon { image, top, bottom, left, right, iconRotation }; } -void PositionedIcon::fitIconToText(const style::SymbolLayoutProperties::Evaluated& layout, - const Shaping& shapedText, - float layoutTextSize) { - using namespace style; - assert(layout.get() != IconTextFitType::None); - if (shapedText) { - auto iconWidth = _right - _left; - auto iconHeight = _bottom - _top; - auto size = layoutTextSize / 24.0f; - auto textLeft = shapedText.left * size; - auto textRight = shapedText.right * size; - auto textTop = shapedText.top * size; - auto textBottom = shapedText.bottom * size; - auto textWidth = textRight - textLeft; - auto textHeight = textBottom - textTop; - auto padT = layout.get()[0]; - auto padR = layout.get()[1]; - auto padB = layout.get()[2]; - auto padL = layout.get()[3]; - auto offsetY = layout.get() == IconTextFitType::Width ? (textHeight - iconHeight) * 0.5 : 0; - auto offsetX = layout.get() == IconTextFitType::Height ? (textWidth - iconWidth) * 0.5 : 0; - auto width = layout.get() == IconTextFitType::Width || layout.get() == IconTextFitType::Both ? textWidth : iconWidth; - auto height = layout.get() == IconTextFitType::Height || layout.get() == IconTextFitType::Both ? textHeight : iconHeight; - _left = textLeft + offsetX - padL; - _top = textTop + offsetY - padT; - _right = textLeft + offsetX + padR + width; - _bottom = textTop + offsetY + padB + height; +void PositionedIcon::fitIconToText(const Shaping& shapedText, + const style::IconTextFitType textFit, + const std::array& padding, + const std::array& iconOffset, + const float fontScale) { + assert(textFit != style::IconTextFitType::None); + assert(shapedText); + + // We don't respect the icon-anchor, because icon-text-fit is set. Instead, + // the icon will be centered on the text, then stretched in the given + // dimensions. + + const float textLeft = shapedText.left * fontScale; + const float textRight = shapedText.right * fontScale; + + if (textFit == style::IconTextFitType::Width || textFit == style::IconTextFitType::Both) { + // Stretched horizontally to the text width + _left = iconOffset[0] + textLeft - padding[3]; + _right = iconOffset[0] + textRight + padding[1]; + } else { + // Centered on the text + _left = iconOffset[0] + (textLeft + textRight - image().displaySize()[0]) / 2.0f; + _right = _left + image().displaySize()[0]; + } + + const float textTop = shapedText.top * fontScale; + const float textBottom = shapedText.bottom * fontScale; + if (textFit == style::IconTextFitType::Height || textFit == style::IconTextFitType::Both) { + // Stretched vertically to the text height + _top = iconOffset[1] + textTop - padding[0]; + _bottom = iconOffset[1] + textBottom + padding[2]; + } else { + // Centered on the text + _top = iconOffset[1] + (textTop + textBottom - image().displaySize()[1]) / 2.0f; + _bottom = _top + image().displaySize()[1]; } } diff --git a/src/mbgl/text/shaping.hpp b/src/mbgl/text/shaping.hpp index 28730e9db9b..6ed1b5cb0e6 100644 --- a/src/mbgl/text/shaping.hpp +++ b/src/mbgl/text/shaping.hpp @@ -45,9 +45,11 @@ class PositionedIcon { // Updates shaped icon's bounds based on shaped text's bounds and provided // layout properties. - void fitIconToText(const style::SymbolLayoutProperties::Evaluated& layout, - const Shaping& shapedText, - float layoutTextSize); + void fitIconToText(const Shaping& shapedText, + const style::IconTextFitType textFit, + const std::array& padding, + const std::array& iconOffset, + const float fontScale); const ImagePosition& image() const { return _image; } float top() const { return _top; } diff --git a/test/text/quads.test.cpp b/test/text/quads.test.cpp index 7aaeb4870df..b04617a40b5 100644 --- a/test/text/quads.test.cpp +++ b/test/text/quads.test.cpp @@ -36,10 +36,8 @@ TEST(getIconQuads, normal) { TEST(getIconQuads, style) { Anchor anchor(0.0, 0.0, 0.0, 0.5f, 0); - ImagePosition image = { - mapbox::Bin(-1, 20, 20, 0, 0, 0, 0), - style::Image::Impl("test", PremultipliedImage({1,1}), 1.0) - }; + const ImagePosition image = {mapbox::Bin(-1, 20, 20, 0, 0, 0, 0), + style::Image::Impl("test", PremultipliedImage({1, 1}), 1.0)}; GeometryCoordinates line; Shaping shapedText; @@ -51,235 +49,186 @@ 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, 0); + + EXPECT_FLOAT_EQ(-18.5f, shapedIcon.top()); + EXPECT_FLOAT_EQ(-0.5f, shapedIcon.right()); + EXPECT_FLOAT_EQ(-0.5f, shapedIcon.bottom()); + EXPECT_FLOAT_EQ(-18.5f, shapedIcon.left()); + SymbolLayoutProperties::Evaluated layout; - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -19.5); - EXPECT_EQ(quad.tl.y, -19.5); - EXPECT_EQ(quad.tr.x, 0.5); - EXPECT_EQ(quad.tr.y, -19.5); - EXPECT_EQ(quad.bl.x, -19.5); - EXPECT_EQ(quad.bl.y, 0.5); - EXPECT_EQ(quad.br.x, 0.5); - EXPECT_EQ(quad.br.y, 0.5); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -19.5); + EXPECT_FLOAT_EQ(quad.tl.y, -19.5); + EXPECT_FLOAT_EQ(quad.tr.x, 0.5); + EXPECT_FLOAT_EQ(quad.tr.y, -19.5); + EXPECT_FLOAT_EQ(quad.bl.x, -19.5); + EXPECT_FLOAT_EQ(quad.bl.y, 0.5); + EXPECT_FLOAT_EQ(quad.br.x, 0.5); + EXPECT_FLOAT_EQ(quad.br.y, 0.5); } // width { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 24.0f; - layout.get() = IconTextFitType::Width; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 24.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -61); - EXPECT_EQ(quad.tl.y, 0); - EXPECT_EQ(quad.tr.x, 21); - EXPECT_EQ(quad.tr.y, 0); - EXPECT_EQ(quad.bl.x, -61); - EXPECT_EQ(quad.bl.y, 20); - EXPECT_EQ(quad.br.x, 21); - EXPECT_EQ(quad.br.y, 20); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -64.4444427); + EXPECT_FLOAT_EQ(quad.tl.y, 0); + EXPECT_FLOAT_EQ(quad.tr.x, 24.4444427); + EXPECT_FLOAT_EQ(quad.tr.y, 0); + EXPECT_FLOAT_EQ(quad.bl.x, -64.4444427); + EXPECT_FLOAT_EQ(quad.bl.y, 20); + EXPECT_FLOAT_EQ(quad.br.x, 24.4444427); + EXPECT_FLOAT_EQ(quad.br.y, 20); } // width x textSize { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Width; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -31); - EXPECT_EQ(quad.tl.y, -5); - EXPECT_EQ(quad.tr.x, 11); - EXPECT_EQ(quad.tr.y, -5); - EXPECT_EQ(quad.bl.x, -31); - EXPECT_EQ(quad.bl.y, 15); - EXPECT_EQ(quad.br.x, 11); - EXPECT_EQ(quad.br.y, 15); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -32.2222214); + EXPECT_FLOAT_EQ(quad.tl.y, -5); + EXPECT_FLOAT_EQ(quad.tr.x, 12.2222214); + EXPECT_FLOAT_EQ(quad.tr.y, -5); + EXPECT_FLOAT_EQ(quad.bl.x, -32.2222214); + EXPECT_FLOAT_EQ(quad.bl.y, 15); + EXPECT_FLOAT_EQ(quad.br.x, 12.2222214); + EXPECT_FLOAT_EQ(quad.br.y, 15); } // width x textSize + padding { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Width; - layout.get()[0] = 5.0f; - layout.get()[1] = 10.0f; - layout.get()[2] = 5.0f; - layout.get()[3] = 10.0f; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -41); - EXPECT_EQ(quad.tl.y, -10); - EXPECT_EQ(quad.tr.x, 21); - EXPECT_EQ(quad.tr.y, -10); - EXPECT_EQ(quad.bl.x, -41); - EXPECT_EQ(quad.bl.y, 20); - EXPECT_EQ(quad.br.x, 21); - EXPECT_EQ(quad.br.y, 20); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Width, {{5, 10, 5, 10}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -43.3333321); + EXPECT_FLOAT_EQ(quad.tl.y, -5); + EXPECT_FLOAT_EQ(quad.tr.x, 23.3333321); + EXPECT_FLOAT_EQ(quad.tr.y, -5); + EXPECT_FLOAT_EQ(quad.bl.x, -43.3333321); + EXPECT_FLOAT_EQ(quad.bl.y, 15); + EXPECT_FLOAT_EQ(quad.br.x, 23.3333321); + EXPECT_FLOAT_EQ(quad.br.y, 15); } // height { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 24.0f; - layout.get() = IconTextFitType::Height; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 24.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -30); - EXPECT_EQ(quad.tl.y, -11); - EXPECT_EQ(quad.tr.x, -10); - EXPECT_EQ(quad.tr.y, -11); - EXPECT_EQ(quad.bl.x, -30); - EXPECT_EQ(quad.bl.y, 31); - EXPECT_EQ(quad.br.x, -10); - EXPECT_EQ(quad.br.y, 31); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -30); + EXPECT_FLOAT_EQ(quad.tl.y, -12.2222214); + EXPECT_FLOAT_EQ(quad.tr.x, -10); + EXPECT_FLOAT_EQ(quad.tr.y, -12.2222214); + EXPECT_FLOAT_EQ(quad.bl.x, -30); + EXPECT_FLOAT_EQ(quad.bl.y, 32.2222214); + EXPECT_FLOAT_EQ(quad.br.x, -10); + EXPECT_FLOAT_EQ(quad.br.y, 32.2222214); } // height x textSize { SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Height; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -20); - EXPECT_EQ(quad.tl.y, -6); - EXPECT_EQ(quad.tr.x, 0); - EXPECT_EQ(quad.tr.y, -6); - EXPECT_EQ(quad.bl.x, -20); - EXPECT_EQ(quad.bl.y, 16); - EXPECT_EQ(quad.br.x, 0); - EXPECT_EQ(quad.br.y, 16); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -20); + EXPECT_FLOAT_EQ(quad.tl.y, -6.11111069); + EXPECT_FLOAT_EQ(quad.tr.x, 0); + EXPECT_FLOAT_EQ(quad.tr.y, -6.11111069); + EXPECT_FLOAT_EQ(quad.bl.x, -20); + EXPECT_FLOAT_EQ(quad.bl.y, 16.1111107); + EXPECT_FLOAT_EQ(quad.br.x, 0); + EXPECT_FLOAT_EQ(quad.br.y, 16.1111107); } // height x textSize + padding { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Height; - layout.get()[0] = 5.0f; - layout.get()[1] = 10.0f; - layout.get()[2] = 5.0f; - layout.get()[3] = 10.0f; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -30); - EXPECT_EQ(quad.tl.y, -11); - EXPECT_EQ(quad.tr.x, 10); - EXPECT_EQ(quad.tr.y, -11); - EXPECT_EQ(quad.bl.x, -30); - EXPECT_EQ(quad.bl.y, 21); - EXPECT_EQ(quad.br.x, 10); - EXPECT_EQ(quad.br.y, 21); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Height, {{5, 10, 5, 20}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -20); + EXPECT_FLOAT_EQ(quad.tl.y, -11.666666); + EXPECT_FLOAT_EQ(quad.tr.x, 0); + EXPECT_FLOAT_EQ(quad.tr.y, -11.666666); + EXPECT_FLOAT_EQ(quad.bl.x, -20); + EXPECT_FLOAT_EQ(quad.bl.y, 21.666666); + EXPECT_FLOAT_EQ(quad.br.x, 0); + EXPECT_FLOAT_EQ(quad.br.y, 21.666666); } // both { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 24.0f; - layout.get() = IconTextFitType::Both; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 24.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -61); - EXPECT_EQ(quad.tl.y, -11); - EXPECT_EQ(quad.tr.x, 21); - EXPECT_EQ(quad.tr.y, -11); - EXPECT_EQ(quad.bl.x, -61); - EXPECT_EQ(quad.bl.y, 31); - EXPECT_EQ(quad.br.x, 21); - EXPECT_EQ(quad.br.y, 31); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 0, 0, 0}}, {{0, 0}}, 24.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -64.4444427); + EXPECT_FLOAT_EQ(quad.tl.y, -12.2222214); + EXPECT_FLOAT_EQ(quad.tr.x, 24.4444427); + EXPECT_FLOAT_EQ(quad.tr.y, -12.2222214); + EXPECT_FLOAT_EQ(quad.bl.x, -64.4444427); + EXPECT_FLOAT_EQ(quad.bl.y, 32.2222214); + EXPECT_FLOAT_EQ(quad.br.x, 24.4444427); + EXPECT_FLOAT_EQ(quad.br.y, 32.2222214); } // both x textSize { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Both; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -31); - EXPECT_EQ(quad.tl.y, -6); - EXPECT_EQ(quad.tr.x, 11); - EXPECT_EQ(quad.tr.y, -6); - EXPECT_EQ(quad.bl.x, -31); - EXPECT_EQ(quad.bl.y, 16); - EXPECT_EQ(quad.br.x, 11); - EXPECT_EQ(quad.br.y, 16); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 0, 0, 0}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -32.2222214); + EXPECT_FLOAT_EQ(quad.tl.y, -6.11111069); + EXPECT_FLOAT_EQ(quad.tr.x, 12.2222214); + EXPECT_FLOAT_EQ(quad.tr.y, -6.11111069); + EXPECT_FLOAT_EQ(quad.bl.x, -32.2222214); + EXPECT_FLOAT_EQ(quad.bl.y, 16.1111107); + EXPECT_FLOAT_EQ(quad.br.x, 12.2222214); + EXPECT_FLOAT_EQ(quad.br.y, 16.1111107); } // both x textSize + padding { - SymbolLayoutProperties::Evaluated layout; - layout.get() = 12.0f; - layout.get() = IconTextFitType::Both; - layout.get()[0] = 5.0f; - layout.get()[1] = 10.0f; - layout.get()[2] = 5.0f; - layout.get()[3] = 10.0f; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -41); - EXPECT_EQ(quad.tl.y, -11); - EXPECT_EQ(quad.tr.x, 21); - EXPECT_EQ(quad.tr.y, -11); - EXPECT_EQ(quad.bl.x, -41); - EXPECT_EQ(quad.bl.y, 21); - EXPECT_EQ(quad.br.x, 21); - EXPECT_EQ(quad.br.y, 21); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{5, 10, 5, 10}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -43.3333321); + EXPECT_FLOAT_EQ(quad.tl.y, -11.666666); + EXPECT_FLOAT_EQ(quad.tr.x, 23.3333321); + EXPECT_FLOAT_EQ(quad.tr.y, -11.666666); + EXPECT_FLOAT_EQ(quad.bl.x, -43.3333321); + EXPECT_FLOAT_EQ(quad.bl.y, 21.666666); + EXPECT_FLOAT_EQ(quad.br.x, 23.3333321); + EXPECT_FLOAT_EQ(quad.br.y, 21.666666); } // both x textSize + padding t/r/b/l { SymbolLayoutProperties::Evaluated layout; layout.get() = 12.0f; - layout.get() = IconTextFitType::Both; - layout.get()[0] = 0.0f; - layout.get()[1] = 5.0f; - layout.get()[2] = 10.0f; - layout.get()[3] = 15.0f; - auto shapedIcon = PositionedIcon::shapeIcon(image, {{ -9.5f, -9.5f }}, SymbolAnchorType::Center, 0); - shapedIcon.fitIconToText(layout, shapedText, 12.0f); - SymbolQuad quad = - getIconQuad(shapedIcon, WritingModeType::Horizontal); - - EXPECT_EQ(quad.tl.x, -46); - EXPECT_EQ(quad.tl.y, -6); - EXPECT_EQ(quad.tr.x, 16); - EXPECT_EQ(quad.tr.y, -6); - EXPECT_EQ(quad.bl.x, -46); - EXPECT_EQ(quad.bl.y, 26); - EXPECT_EQ(quad.br.x, 16); - EXPECT_EQ(quad.br.y, 26); + auto shapedIcon = PositionedIcon::shapeIcon(image, {{-9.5f, -9.5f}}, SymbolAnchorType::Center, 0); + shapedIcon.fitIconToText(shapedText, IconTextFitType::Both, {{0, 5, 10, 15}}, {{0, 0}}, 12.0f / 24.0f); + SymbolQuad quad = getIconQuad(shapedIcon, WritingModeType::Horizontal); + + EXPECT_FLOAT_EQ(quad.tl.x, -48.3333321); + EXPECT_FLOAT_EQ(quad.tl.y, -6.66666603); + EXPECT_FLOAT_EQ(quad.tr.x, 18.3333321); + EXPECT_FLOAT_EQ(quad.tr.y, -6.66666603); + EXPECT_FLOAT_EQ(quad.bl.x, -48.3333321); + EXPECT_FLOAT_EQ(quad.bl.y, 26.666666); + EXPECT_FLOAT_EQ(quad.br.x, 18.3333321); + EXPECT_FLOAT_EQ(quad.br.y, 26.666666); } } -