Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit ecd4aa1

Browse files
authored
text-pitch-alignment (#5288)
* First pass at port of mapbox/mapbox-gl-js#2668 * RotationAlignmentType => AlignmentType * Handle undefined default value for text-pitch-alignment and implement inheritance for this value from text-rotation-alignment * Update dependencies * Move handling fo undefined default value out of camelize functions
1 parent a8df0fe commit ecd4aa1

22 files changed

+107
-65
lines changed

include/mbgl/style/layers/symbol_layer.hpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ class SymbolLayer : public Layer {
4747
PropertyValue<bool> getIconOptional() const;
4848
void setIconOptional(PropertyValue<bool>);
4949

50-
PropertyValue<RotationAlignmentType> getIconRotationAlignment() const;
51-
void setIconRotationAlignment(PropertyValue<RotationAlignmentType>);
50+
PropertyValue<AlignmentType> getIconRotationAlignment() const;
51+
void setIconRotationAlignment(PropertyValue<AlignmentType>);
5252

5353
PropertyValue<float> getIconSize() const;
5454
void setIconSize(PropertyValue<float>);
@@ -68,8 +68,11 @@ class SymbolLayer : public Layer {
6868
PropertyValue<std::array<float, 2>> getIconOffset() const;
6969
void setIconOffset(PropertyValue<std::array<float, 2>>);
7070

71-
PropertyValue<RotationAlignmentType> getTextRotationAlignment() const;
72-
void setTextRotationAlignment(PropertyValue<RotationAlignmentType>);
71+
PropertyValue<AlignmentType> getTextPitchAlignment() const;
72+
void setTextPitchAlignment(PropertyValue<AlignmentType>);
73+
74+
PropertyValue<AlignmentType> getTextRotationAlignment() const;
75+
void setTextRotationAlignment(PropertyValue<AlignmentType>);
7376

7477
PropertyValue<std::string> getTextField() const;
7578
void setTextField(PropertyValue<std::string>);

include/mbgl/style/types.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,10 @@ enum class SymbolPlacementType : bool {
5858
Line,
5959
};
6060

61-
enum class RotationAlignmentType : bool {
61+
enum class AlignmentType : uint8_t {
6262
Map,
6363
Viewport,
64+
Undefined,
6465
};
6566

6667
enum class TextJustifyType : uint8_t {

package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
"csscolorparser": "^1.0.2",
2222
"ejs": "^2.4.1",
2323
"express": "^4.11.1",
24-
"mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#f0b94dcc5f782958e9aade61d592a207d8a46e0f",
25-
"mapbox-gl-style-spec": "^8.5.1",
26-
"mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#3e27bc27ea050952481ef1f9a655538590eccb26",
24+
"mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#30caf388dbddd02cfc4f967ffc94c1338c30fbf8",
25+
"mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#2461efc3d883f2f2e56a6c6b2bfd7d54bbfe9f86",
26+
"mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#5587d796c99145991ea2a7b749a8782b7a0cb483",
2727
"node-gyp": "^3.3.1",
2828
"request": "^2.72.0",
2929
"tape": "^4.5.1"

scripts/generate-style-code.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ global.propertyType = function (property) {
2121
if (/-translate-anchor$/.test(property.name)) {
2222
return 'TranslateAnchorType';
2323
}
24-
if (/-rotation-alignment$/.test(property.name)) {
25-
return 'RotationAlignmentType';
24+
if (/-(rotation|pitch)-alignment$/.test(property.name)) {
25+
return 'AlignmentType';
2626
}
2727
switch (property.type) {
2828
case 'boolean':
@@ -57,7 +57,11 @@ global.defaultValue = function (property) {
5757
case 'string':
5858
return JSON.stringify(property.default || "");
5959
case 'enum':
60-
return `${propertyType(property)}::${camelize(property.default)}`;
60+
if (property.default === undefined) {
61+
return `${propertyType(property)}::Undefined`;
62+
} else {
63+
return `${propertyType(property)}::${camelize(property.default)}`;
64+
}
6165
case 'color':
6266
return `{{ ${parseCSSColor(property.default).join(', ')} }}`
6367
case 'array':

src/mbgl/geometry/icon_buffer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace mbgl {
88

9-
size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom) {
9+
size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle) {
1010
const size_t idx = index();
1111
void *data = addElement();
1212

@@ -21,6 +21,7 @@ size_t IconVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, int16_t t
2121
ubytes[8] /* tex */ = tx / 4;
2222
ubytes[9] /* tex */ = ty / 4;
2323
ubytes[10] /* labelminzoom */ = labelminzoom * 10;
24+
ubytes[11] /* labelangle */ = labelangle;
2425

2526
// a_data2
2627
ubytes[12] /* minzoom */ = minzoom * 10; // 1/10 zoom levels: z16 == 160.

src/mbgl/geometry/icon_buffer.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace mbgl {
1010
16
1111
> {
1212
public:
13-
size_t add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom);
13+
size_t add(int16_t x, int16_t y, float ox, float oy, int16_t tx, int16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle);
1414

1515
};
1616

src/mbgl/geometry/text_buffer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace mbgl {
88

9-
size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom) {
9+
size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle) {
1010
const size_t idx = index();
1111
void *data = addElement();
1212

@@ -21,6 +21,7 @@ size_t TextVertexBuffer::add(int16_t x, int16_t y, float ox, float oy, uint16_t
2121
ubytes[8] /* tex */ = tx / 4;
2222
ubytes[9] /* tex */ = ty / 4;
2323
ubytes[10] /* labelminzoom */ = labelminzoom * 10;
24+
ubytes[11] /* labelangle */ = labelangle;
2425

2526
// a_data2
2627
ubytes[12] /* minzoom */ = minzoom * 10; // 1/10 zoom levels: z16 == 160.

src/mbgl/geometry/text_buffer.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class TextVertexBuffer : public Buffer <
1313
public:
1414
typedef int16_t vertex_type;
1515

16-
size_t add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom);
16+
size_t add(int16_t x, int16_t y, float ox, float oy, uint16_t tx, uint16_t ty, float minzoom, float maxzoom, float labelminzoom, uint8_t labelangle);
1717
};
1818

1919

src/mbgl/renderer/painter.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ class Painter : private util::noncopyable {
140140
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&),
141141

142142
// Layout
143-
style::RotationAlignmentType rotationAlignment,
143+
style::AlignmentType rotationAlignment,
144+
style::AlignmentType pitchAlignment,
144145
float layoutSize,
145146

146147
// Paint

src/mbgl/renderer/painter_symbol.cpp

+20-10
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ void Painter::renderSDF(SymbolBucket &bucket,
2424
void (SymbolBucket::*drawSDF)(SDFShader&, gl::ObjectStore&),
2525

2626
// Layout
27-
RotationAlignmentType rotationAlignment,
27+
AlignmentType rotationAlignment,
28+
AlignmentType pitchAlignment,
2829
float layoutSize,
2930

3031
// Paint
@@ -45,10 +46,11 @@ void Painter::renderSDF(SymbolBucket &bucket,
4546

4647
float scale = fontScale;
4748
std::array<float, 2> exScale = extrudeScale;
48-
bool alignedWithMap = rotationAlignment == RotationAlignmentType::Map;
49+
bool rotateWithMap = rotationAlignment == AlignmentType::Map;
50+
bool pitchWithMap = pitchAlignment == AlignmentType::Map;
4951
float gammaScale = 1.0f;
5052

51-
if (alignedWithMap) {
53+
if (pitchWithMap) {
5254
scale *= tileID.pixelsToTileUnits(1, state.getZoom());
5355
exScale.fill(scale);
5456
gammaScale /= std::cos(state.getPitch());
@@ -60,8 +62,12 @@ void Painter::renderSDF(SymbolBucket &bucket,
6062
sdfShader.u_matrix = vtxMatrix;
6163
sdfShader.u_extrude_scale = exScale;
6264
sdfShader.u_texsize = texsize;
63-
sdfShader.u_skewed = alignedWithMap;
65+
sdfShader.u_rotate_with_map = rotateWithMap;
66+
sdfShader.u_pitch_with_map = pitchWithMap;
6467
sdfShader.u_texture = 0;
68+
sdfShader.u_pitch = state.getPitch() * util::DEG2RAD;
69+
sdfShader.u_bearing = -1.0f * state.getAngle();
70+
sdfShader.u_aspect_ratio = (state.getWidth() * 1.0f) / (state.getHeight() * 1.0f);
6571

6672
// adjust min/max zooms for variable font sies
6773
float zoomAdjust = std::log(fontSize / layoutSize) / std::log(2);
@@ -135,7 +141,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
135141
}
136142

137143
if (bucket.hasIconData()) {
138-
if (layout.iconRotationAlignment == RotationAlignmentType::Map) {
144+
if (layout.iconRotationAlignment == AlignmentType::Map) {
139145
config.depthFunc.reset();
140146
config.depthTest = GL_TRUE;
141147
} else {
@@ -145,7 +151,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
145151
bool sdf = bucket.sdfIcons;
146152

147153
const float angleOffset =
148-
layout.iconRotationAlignment == RotationAlignmentType::Map
154+
layout.iconRotationAlignment == AlignmentType::Map
149155
? state.getAngle()
150156
: 0;
151157

@@ -154,7 +160,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
154160

155161
SpriteAtlas* activeSpriteAtlas = layer.impl->spriteAtlas;
156162
const bool iconScaled = fontScale != 1 || frame.pixelRatio != activeSpriteAtlas->getPixelRatio() || bucket.iconsNeedLinear;
157-
const bool iconTransformed = layout.iconRotationAlignment == RotationAlignmentType::Map || angleOffset != 0 || state.getPitch() != 0;
163+
const bool iconTransformed = layout.iconRotationAlignment == AlignmentType::Map || angleOffset != 0 || state.getPitch() != 0;
158164
config.activeTexture = GL_TEXTURE0;
159165
activeSpriteAtlas->bind(sdf || state.isChanging() || iconScaled || iconTransformed, store);
160166

@@ -167,6 +173,9 @@ void Painter::renderSymbol(SymbolBucket& bucket,
167173
*sdfIconShader,
168174
&SymbolBucket::drawIcons,
169175
layout.iconRotationAlignment,
176+
// icon-pitch-alignment is not yet implemented
177+
// and we simply inherit the rotation alignment
178+
layout.iconRotationAlignment,
170179
layout.iconSize,
171180
paint.iconOpacity,
172181
paint.iconColor,
@@ -182,7 +191,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
182191

183192
float scale = fontScale;
184193
std::array<float, 2> exScale = extrudeScale;
185-
const bool alignedWithMap = layout.iconRotationAlignment == RotationAlignmentType::Map;
194+
const bool alignedWithMap = layout.iconRotationAlignment == AlignmentType::Map;
186195
if (alignedWithMap) {
187196
scale *= tileID.pixelsToTileUnits(1, state.getZoom());
188197
exScale.fill(scale);
@@ -194,7 +203,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
194203
iconShader->u_matrix = vtxMatrix;
195204
iconShader->u_extrude_scale = exScale;
196205
iconShader->u_texsize = {{ float(activeSpriteAtlas->getWidth()) / 4.0f, float(activeSpriteAtlas->getHeight()) / 4.0f }};
197-
iconShader->u_skewed = alignedWithMap;
206+
iconShader->u_rotate_with_map = alignedWithMap;
198207
iconShader->u_texture = 0;
199208

200209
// adjust min/max zooms for variable font sies
@@ -212,7 +221,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
212221
}
213222

214223
if (bucket.hasTextData()) {
215-
if (layout.textRotationAlignment == RotationAlignmentType::Map) {
224+
if (layout.textRotationAlignment == AlignmentType::Map) {
216225
config.depthFunc.reset();
217226
config.depthTest = GL_TRUE;
218227
} else {
@@ -230,6 +239,7 @@ void Painter::renderSymbol(SymbolBucket& bucket,
230239
*sdfGlyphShader,
231240
&SymbolBucket::drawGlyphs,
232241
layout.textRotationAlignment,
242+
layout.textPitchAlignment,
233243
layout.textSize,
234244
paint.textOpacity,
235245
paint.textColor,

src/mbgl/renderer/symbol_bucket.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -314,10 +314,10 @@ void SymbolBucket::addFeature(const GeometryCollection &lines,
314314
const float iconPadding = layout.iconPadding * tilePixelRatio;
315315
const float textMaxAngle = layout.textMaxAngle * util::DEG2RAD;
316316
const bool textAlongLine =
317-
layout.textRotationAlignment == RotationAlignmentType::Map &&
317+
layout.textRotationAlignment == AlignmentType::Map &&
318318
layout.symbolPlacement == SymbolPlacementType::Line;
319319
const bool iconAlongLine =
320-
layout.iconRotationAlignment == RotationAlignmentType::Map &&
320+
layout.iconRotationAlignment == AlignmentType::Map &&
321321
layout.symbolPlacement == SymbolPlacementType::Line;
322322
const bool mayOverlap = layout.textAllowOverlap || layout.iconAllowOverlap ||
323323
layout.textIgnorePlacement || layout.iconIgnorePlacement;
@@ -394,10 +394,10 @@ void SymbolBucket::placeFeatures(CollisionTile& collisionTile) {
394394
// create the bufers used for rendering.
395395

396396
const bool textAlongLine =
397-
layout.textRotationAlignment == RotationAlignmentType::Map &&
397+
layout.textRotationAlignment == AlignmentType::Map &&
398398
layout.symbolPlacement == SymbolPlacementType::Line;
399399
const bool iconAlongLine =
400-
layout.iconRotationAlignment == RotationAlignmentType::Map &&
400+
layout.iconRotationAlignment == AlignmentType::Map &&
401401
layout.symbolPlacement == SymbolPlacementType::Line;
402402

403403
const bool mayOverlap = layout.textAllowOverlap || layout.iconAllowOverlap ||
@@ -495,7 +495,7 @@ void SymbolBucket::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float
495495
const auto &anchorPoint = symbol.anchorPoint;
496496

497497
// drop upside down versions of glyphs
498-
const float a = std::fmod(symbol.angle + placementAngle + M_PI, M_PI * 2);
498+
const float a = std::fmod(symbol.anchorAngle + placementAngle + M_PI, M_PI * 2);
499499
if (keepUpright && alongLine && (a <= M_PI / 2 || a > M_PI * 3 / 2)) continue;
500500

501501

@@ -521,15 +521,18 @@ void SymbolBucket::addSymbols(Buffer &buffer, const SymbolQuads &symbols, float
521521
auto &triangleGroup = *buffer.groups.back();
522522
GLsizei triangleIndex = triangleGroup.vertex_length;
523523

524+
// Encode angle of glyph
525+
uint8_t glyphAngle = std::round((symbol.glyphAngle / (M_PI * 2)) * 256);
526+
524527
// coordinates (2 triangles)
525528
buffer.vertices.add(anchorPoint.x, anchorPoint.y, tl.x, tl.y, tex.x, tex.y, minZoom,
526-
maxZoom, placementZoom);
529+
maxZoom, placementZoom, glyphAngle);
527530
buffer.vertices.add(anchorPoint.x, anchorPoint.y, tr.x, tr.y, tex.x + tex.w, tex.y,
528-
minZoom, maxZoom, placementZoom);
531+
minZoom, maxZoom, placementZoom, glyphAngle);
529532
buffer.vertices.add(anchorPoint.x, anchorPoint.y, bl.x, bl.y, tex.x, tex.y + tex.h,
530-
minZoom, maxZoom, placementZoom);
533+
minZoom, maxZoom, placementZoom, glyphAngle);
531534
buffer.vertices.add(anchorPoint.x, anchorPoint.y, br.x, br.y, tex.x + tex.w, tex.y + tex.h,
532-
minZoom, maxZoom, placementZoom);
535+
minZoom, maxZoom, placementZoom, glyphAngle);
533536

534537
// add the two triangles, referencing the four coordinates we just inserted.
535538
buffer.triangles.add(triangleIndex + 0, triangleIndex + 1, triangleIndex + 2);

src/mbgl/shader/icon_shader.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class IconShader : public Shader {
1616
Uniform<GLfloat> u_zoom = {"u_zoom", *this};
1717
Uniform<GLfloat> u_opacity = {"u_opacity", *this};
1818
Uniform<std::array<GLfloat, 2>> u_texsize = {"u_texsize", *this};
19-
Uniform<GLint> u_skewed = {"u_skewed", *this};
19+
Uniform<GLint> u_rotate_with_map = {"u_rotate_with_map", *this};
2020
Uniform<GLint> u_texture = {"u_texture", *this};
2121
Uniform<GLint> u_fadetexture = {"u_fadetexture", *this};
2222

src/mbgl/shader/sdf_shader.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ class SDFShader : public Shader {
1717
Uniform<GLfloat> u_buffer = {"u_buffer", *this};
1818
Uniform<GLfloat> u_gamma = {"u_gamma", *this};
1919
Uniform<GLfloat> u_zoom = {"u_zoom", *this};
20-
Uniform<GLint> u_skewed = {"u_skewed", *this};
20+
Uniform<GLfloat> u_pitch = {"u_pitch", *this};
21+
Uniform<GLfloat> u_bearing = {"u_bearing", *this};
22+
Uniform<GLfloat> u_aspect_ratio = {"u_aspect_ratio", *this};
23+
Uniform<GLint> u_rotate_with_map = {"u_rotate_with_map",*this};
24+
Uniform<GLint> u_pitch_with_map = {"u_pitch_with_map",*this};
2125
Uniform<GLint> u_texture = {"u_texture", *this};
2226
Uniform<GLint> u_fadetexture = {"u_fadetexture", *this};
2327

src/mbgl/style/layers/symbol_layer.cpp

+11-4
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,11 @@ PropertyValue<bool> SymbolLayer::getIconOptional() const {
9292
void SymbolLayer::setIconOptional(PropertyValue<bool> value) {
9393
impl->layout.iconOptional.set(value);
9494
}
95-
PropertyValue<RotationAlignmentType> SymbolLayer::getIconRotationAlignment() const {
95+
PropertyValue<AlignmentType> SymbolLayer::getIconRotationAlignment() const {
9696
return impl->layout.iconRotationAlignment.get();
9797
}
9898

99-
void SymbolLayer::setIconRotationAlignment(PropertyValue<RotationAlignmentType> value) {
99+
void SymbolLayer::setIconRotationAlignment(PropertyValue<AlignmentType> value) {
100100
impl->layout.iconRotationAlignment.set(value);
101101
}
102102
PropertyValue<float> SymbolLayer::getIconSize() const {
@@ -141,11 +141,18 @@ PropertyValue<std::array<float, 2>> SymbolLayer::getIconOffset() const {
141141
void SymbolLayer::setIconOffset(PropertyValue<std::array<float, 2>> value) {
142142
impl->layout.iconOffset.set(value);
143143
}
144-
PropertyValue<RotationAlignmentType> SymbolLayer::getTextRotationAlignment() const {
144+
PropertyValue<AlignmentType> SymbolLayer::getTextPitchAlignment() const {
145+
return impl->layout.textPitchAlignment.get();
146+
}
147+
148+
void SymbolLayer::setTextPitchAlignment(PropertyValue<AlignmentType> value) {
149+
impl->layout.textPitchAlignment.set(value);
150+
}
151+
PropertyValue<AlignmentType> SymbolLayer::getTextRotationAlignment() const {
145152
return impl->layout.textRotationAlignment.get();
146153
}
147154

148-
void SymbolLayer::setTextRotationAlignment(PropertyValue<RotationAlignmentType> value) {
155+
void SymbolLayer::setTextRotationAlignment(PropertyValue<AlignmentType> value) {
149156
impl->layout.textRotationAlignment.set(value);
150157
}
151158
PropertyValue<std::string> SymbolLayer::getTextField() const {

src/mbgl/style/layers/symbol_layer_impl.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,13 @@ std::unique_ptr<Bucket> SymbolLayer::Impl::createBucket(BucketParameters& parame
4545
CalculationParameters p(parameters.tileID.overscaledZ);
4646
bucket->layout.symbolPlacement.calculate(p);
4747
if (bucket->layout.symbolPlacement.value == SymbolPlacementType::Line) {
48-
bucket->layout.iconRotationAlignment.value = RotationAlignmentType::Map;
49-
bucket->layout.textRotationAlignment.value = RotationAlignmentType::Map;
48+
bucket->layout.iconRotationAlignment.value = AlignmentType::Map;
49+
bucket->layout.textRotationAlignment.value = AlignmentType::Map;
50+
};
51+
52+
// If unspecified `text-pitch-alignment` inherits `text-rotation-alignment`
53+
if (bucket->layout.textPitchAlignment.value == AlignmentType::Undefined) {
54+
bucket->layout.textPitchAlignment.value = bucket->layout.textRotationAlignment.value;
5055
};
5156

5257
bucket->layout.recalculate(p);

src/mbgl/style/layers/symbol_layer_properties.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ void SymbolLayoutProperties::parse(const JSValue& value) {
1919
iconPadding.parse("icon-padding", value);
2020
iconKeepUpright.parse("icon-keep-upright", value);
2121
iconOffset.parse("icon-offset", value);
22+
textPitchAlignment.parse("text-pitch-alignment", value);
2223
textRotationAlignment.parse("text-rotation-alignment", value);
2324
textField.parse("text-field", value);
2425
textFont.parse("text-font", value);
@@ -53,6 +54,7 @@ void SymbolLayoutProperties::recalculate(const CalculationParameters& parameters
5354
iconPadding.calculate(parameters);
5455
iconKeepUpright.calculate(parameters);
5556
iconOffset.calculate(parameters);
57+
textPitchAlignment.calculate(parameters);
5658
textRotationAlignment.calculate(parameters);
5759
textField.calculate(parameters);
5860
textFont.calculate(parameters);

0 commit comments

Comments
 (0)