std::unique_ptr<SymbolLayout> SymbolLayer::Impl::createLayout(BucketParameters& parameters) const {
    SymbolLayoutProperties layoutProperties = layout;

    CalculationParameters p(parameters.tileID.overscaledZ);
    layoutProperties.recalculate(p);

    if (layoutProperties.iconRotationAlignment.value == AlignmentType::Auto) {
        if (layoutProperties.symbolPlacement.value == SymbolPlacementType::Line) {
            layoutProperties.iconRotationAlignment.value = AlignmentType::Map;
        } else {
            layoutProperties.iconRotationAlignment.value = AlignmentType::Viewport;
        }
    }

    if (layoutProperties.textRotationAlignment.value == AlignmentType::Auto) {
        if (layoutProperties.symbolPlacement.value == SymbolPlacementType::Line) {
            layoutProperties.textRotationAlignment.value = AlignmentType::Map;
        } else {
            layoutProperties.textRotationAlignment.value = AlignmentType::Viewport;
        }
    }

    // If unspecified `text-pitch-alignment` inherits `text-rotation-alignment`
    if (layoutProperties.textPitchAlignment.value == AlignmentType::Auto) {
        layoutProperties.textPitchAlignment.value = layoutProperties.textRotationAlignment.value;
    }

    layoutProperties.textSize.calculate(CalculationParameters(18));
    float textMaxSize = layoutProperties.textSize;

    layoutProperties.iconSize.calculate(CalculationParameters(p.z + 1));
    layoutProperties.textSize.calculate(CalculationParameters(p.z + 1));

    return std::make_unique<SymbolLayout>(id,
                                          parameters.layer.getName(),
                                          parameters.tileID.overscaleFactor(),
                                          parameters.tileID.overscaledZ,
                                          parameters.mode,
                                          parameters.layer,
                                          filter,
                                          layoutProperties,
                                          textMaxSize,
                                          *spriteAtlas);
}
Пример #2
0
std::unique_ptr<Bucket> LineLayer::Impl::createBucket(BucketParameters& parameters) const {
    auto bucket = std::make_unique<LineBucket>(parameters.tileID.overscaleFactor());

    bucket->layout = layout;
    bucket->layout.recalculate(CalculationParameters(parameters.tileID.overscaledZ));

    auto& name = bucketName();
    parameters.eachFilteredFeature(filter, [&] (const auto& feature, std::size_t index, const std::string& layerName) {
        auto geometries = feature.getGeometries();
        bucket->addGeometry(geometries);
        parameters.featureIndex.insert(geometries, index, layerName, name);
    });

    return std::move(bucket);
}