summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2019-10-14 15:16:14 +0200
committerKonstantin Käfer <mail@kkaefer.com>2019-10-14 15:52:52 +0200
commitafedfcc79be6b340e4cc889c090f6bffda83d1dc (patch)
treeaf86f66a8c3aa45b0b5b967867431a50e9df264c
parentaa438026cf4eca0061ca5da67df3d4a05fd94581 (diff)
downloadqtlocation-mapboxgl-upstream/fix-icon-text-fit.tar.gz
[core] fix icon-text-fitupstream/fix-icon-text-fit
This fixes rendering by account for the 1px texture padding around icons that were stretched with icon-text-fit. We've added the 1px padding before, but didn't scale it accordingly when we are resizing the icon when it is stretched to fit the text. Adjusts the code to match the logic in GL JS.
m---------mapbox-gl-js0
-rw-r--r--platform/node/test/ignores.json3
-rw-r--r--src/mbgl/layout/symbol_layout.cpp19
-rw-r--r--src/mbgl/text/quads.cpp28
-rw-r--r--src/mbgl/text/shaping.cpp62
-rw-r--r--src/mbgl/text/shaping.hpp8
-rw-r--r--test/text/quads.test.cpp329
7 files changed, 214 insertions, 235 deletions
diff --git a/mapbox-gl-js b/mapbox-gl-js
-Subproject 7ea73ed381a81c3ff7e48b523b25d50793baf1f
+Subproject 2dbbf634906dc1b02b48cb740dadb6de1634847
diff --git a/platform/node/test/ignores.json b/platform/node/test/ignores.json
index 289f38be38..51decb351c 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 81d1d9a5b6..d0227c36c5 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<style::IconTextFit>() != IconTextFitType::None;
+ const auto iconTextFit = evaluatedLayoutProperties.get<style::IconTextFit>();
// Adjust shaped icon size when icon-text-fit is used.
optional<PositionedIcon> 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<IconTextFitPadding>(), iconOffset, fontScale);
+ }
+ const auto shapedText = getDefaultHorizontalShaping(shapedTextOrientations);
+ if (shapedText) {
+ shapedIcon->fitIconToText(
+ shapedText, iconTextFit, layout->get<IconTextFitPadding>(), iconOffset, fontScale);
}
- shapedIcon->fitIconToText(evaluatedLayoutProperties,
- getDefaultHorizontalShaping(shapedTextOrientations),
- layoutTextSize);
}
auto addSymbolInstance = [&] (Anchor& anchor, std::shared_ptr<SymbolInstanceSharedData> sharedData) {
diff --git a/src/mbgl/text/quads.cpp b/src/mbgl/text/quads.cpp
index 281c5d99de..a94bfee336 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<float>(image.textureRect.w) + 2.0f * border) /
+ static_cast<float>(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<float>(image.textureRect.h) + 2.0f * border) /
+ static_cast<float>(image.textureRect.h) -
+ iconHeight) /
+ 2.0f;
+ const float top = shapedIcon.top() - expandY;
+ const float bottom = shapedIcon.bottom() + expandY;
Point<float> tl{left, top};
Point<float> tr{right, top};
diff --git a/src/mbgl/text/shaping.cpp b/src/mbgl/text/shaping.cpp
index 4ae9d0cf20..8eb885af5d 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<IconTextFit>() != 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<IconTextFitPadding>()[0];
- auto padR = layout.get<IconTextFitPadding>()[1];
- auto padB = layout.get<IconTextFitPadding>()[2];
- auto padL = layout.get<IconTextFitPadding>()[3];
- auto offsetY = layout.get<IconTextFit>() == IconTextFitType::Width ? (textHeight - iconHeight) * 0.5 : 0;
- auto offsetX = layout.get<IconTextFit>() == IconTextFitType::Height ? (textWidth - iconWidth) * 0.5 : 0;
- auto width = layout.get<IconTextFit>() == IconTextFitType::Width || layout.get<IconTextFit>() == IconTextFitType::Both ? textWidth : iconWidth;
- auto height = layout.get<IconTextFit>() == IconTextFitType::Height || layout.get<IconTextFit>() == 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<float, 4>& padding,
+ const std::array<float, 2>& 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 28730e9db9..6ed1b5cb0e 100644
--- a/src/mbgl/text/shaping.hpp
+++ b/src/mbgl/text/shaping.hpp
@@ -45,9 +45,11 @@ public:
// 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<float, 4>& padding,
+ const std::array<float, 2>& 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 7aaeb4870d..b04617a40b 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<TextSize>() = 24.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = IconTextFitType::Width;
- layout.get<IconTextFitPadding>()[0] = 5.0f;
- layout.get<IconTextFitPadding>()[1] = 10.0f;
- layout.get<IconTextFitPadding>()[2] = 5.0f;
- layout.get<IconTextFitPadding>()[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<TextSize>() = 24.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = IconTextFitType::Height;
- layout.get<IconTextFitPadding>()[0] = 5.0f;
- layout.get<IconTextFitPadding>()[1] = 10.0f;
- layout.get<IconTextFitPadding>()[2] = 5.0f;
- layout.get<IconTextFitPadding>()[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<TextSize>() = 24.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = 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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = IconTextFitType::Both;
- layout.get<IconTextFitPadding>()[0] = 5.0f;
- layout.get<IconTextFitPadding>()[1] = 10.0f;
- layout.get<IconTextFitPadding>()[2] = 5.0f;
- layout.get<IconTextFitPadding>()[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<TextSize>() = 12.0f;
- layout.get<IconTextFit>() = IconTextFitType::Both;
- layout.get<IconTextFitPadding>()[0] = 0.0f;
- layout.get<IconTextFitPadding>()[1] = 5.0f;
- layout.get<IconTextFitPadding>()[2] = 10.0f;
- layout.get<IconTextFitPadding>()[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);
}
}
-