#pragma once #include #include #include #include #include namespace mbgl { class Anchor; class IndexedSubfeature; struct ShapedTextOrientations { Shaping horizontal; Shaping vertical; // The following are used with variable text placement on. Shaping& right = horizontal; Shaping center; Shaping left; bool singleLine = false; }; enum class SymbolContent : uint8_t { None = 0, Text = 1 << 0, IconRGBA = 1 << 1, IconSDF = 1 << 2 }; struct SymbolInstanceSharedData { SymbolInstanceSharedData(GeometryCoordinates line, const ShapedTextOrientations& shapedTextOrientations, const optional& shapedIcon, const optional& verticallyShapedIcon, const style::SymbolLayoutProperties::Evaluated& layout, style::SymbolPlacementType textPlacement, const std::array& textOffset, const ImageMap& imageMap, float iconRotation, SymbolContent iconType, bool hasIconTextFit, bool allowVerticalPlacement); bool empty() const; GeometryCoordinates line; // Note: When singleLine == true, only `rightJustifiedGlyphQuads` is populated. SymbolQuads rightJustifiedGlyphQuads; SymbolQuads centerJustifiedGlyphQuads; SymbolQuads leftJustifiedGlyphQuads; SymbolQuads verticalGlyphQuads; optional iconQuads; optional verticalIconQuads; }; class SymbolInstance { public: SymbolInstance(Anchor& anchor_, std::shared_ptr sharedData, const ShapedTextOrientations& shapedTextOrientations, const optional& shapedIcon, const optional& verticallyShapedIcon, float textBoxScale, float textPadding, style::SymbolPlacementType textPlacement, const std::array& textOffset, float iconBoxScale, float iconPadding, const std::array& iconOffset, const IndexedSubfeature& indexedFeature, std::size_t layoutFeatureIndex, std::size_t dataFeatureIndex, std::u16string key, float overscaling, float iconRotation, float textRotation, const std::array& variableTextOffset, bool allowVerticalPlacement, SymbolContent iconType = SymbolContent::None); optional getDefaultHorizontalPlacedTextIndex() const; const GeometryCoordinates& line() const; const SymbolQuads& rightJustifiedGlyphQuads() const; const SymbolQuads& leftJustifiedGlyphQuads() const; const SymbolQuads& centerJustifiedGlyphQuads() const; const SymbolQuads& verticalGlyphQuads() const; bool hasText() const; bool hasIcon() const; bool hasSdfIcon() const; const optional& iconQuads() const; const optional& verticalIconQuads() const; void releaseSharedData(); private: std::shared_ptr sharedData; public: Anchor anchor; SymbolContent symbolContent; std::size_t rightJustifiedGlyphQuadsSize; std::size_t centerJustifiedGlyphQuadsSize; std::size_t leftJustifiedGlyphQuadsSize; std::size_t verticalGlyphQuadsSize; std::size_t iconQuadsSize; CollisionFeature textCollisionFeature; CollisionFeature iconCollisionFeature; optional verticalTextCollisionFeature = nullopt; optional verticalIconCollisionFeature = nullopt; WritingModeType writingModes; std::size_t layoutFeatureIndex; // Index into the set of features included at layout time std::size_t dataFeatureIndex; // Index into the underlying tile data feature set std::array textOffset; std::array iconOffset; std::u16string key; bool isDuplicate; optional placedRightTextIndex; optional placedCenterTextIndex; optional placedLeftTextIndex; optional placedVerticalTextIndex; optional placedIconIndex; optional placedVerticalIconIndex; float textBoxScale; std::array variableTextOffset; bool singleLine; uint32_t crossTileID = 0; static constexpr uint32_t invalidCrossTileID() { return std::numeric_limits::max(); } }; using SymbolInstanceReferences = std::vector>; } // namespace mbgl