diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-11-14 16:58:25 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-12-02 17:11:49 +0200 |
commit | 26bf566f535e55c6d82830e3b0f5a2702a0fec42 (patch) | |
tree | fde3beaa430e06151b68f6c346bc7b103debd28b /src/mbgl/renderer/layers | |
parent | 2c49c4374cb9e3654c1d347b1071542918ce5fd2 (diff) | |
download | qtlocation-mapboxgl-26bf566f535e55c6d82830e3b0f5a2702a0fec42.tar.gz |
[core] Use new 'SymbolTextAndIcon' program to draw icons in text
Diffstat (limited to 'src/mbgl/renderer/layers')
-rw-r--r-- | src/mbgl/renderer/layers/render_symbol_layer.cpp | 118 |
1 files changed, 89 insertions, 29 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index a4a73d3fe5..77a5813455 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -188,43 +188,103 @@ void drawText(const DrawFn& draw, const auto& evaluated = getEvaluated<SymbolLayerProperties>(renderData.layerProperties); const auto& layout = *bucket.layout; - const gfx::TextureBinding textureBinding{ tile.getGlyphAtlasTexture().getResource(), - gfx::TextureFilterType::Linear }; - auto values = textPropertyValues(evaluated, layout); const auto& paintPropertyValues = RenderSymbolLayer::textPaintProperties(evaluated); const bool alongLine = layout.get<SymbolPlacement>() != SymbolPlacementType::Point && layout.get<TextRotationAlignment>() == AlignmentType::Map; - const Size& texsize = tile.getGlyphAtlasTexture().size; + const Size& glyphTexSize = tile.getGlyphAtlasTexture().size; + const gfx::TextureBinding glyphTextureBinding{tile.getGlyphAtlasTexture().getResource(), + gfx::TextureFilterType::Linear}; + + const bool transformed = values.rotationAlignment == AlignmentType::Map || parameters.state.getPitch() != 0; + const Size& iconTexSize = tile.getIconAtlasTexture().size; + const gfx::TextureBinding iconTextureBinding{tile.getIconAtlasTexture().getResource(), + parameters.state.isChanging() || transformed + ? gfx::TextureFilterType::Linear + : gfx::TextureFilterType::Nearest}; + + const auto drawGlyphs = [&](auto& program, const auto& uniforms, const auto& textures, SymbolSDFPart part) { + draw(program, + uniforms, + bucket.text, + textSegments, + bucket.textSizeBinder, + bucketPaintProperties.textBinders, + paintPropertyValues, + textures, + (part == SymbolSDFPart::Halo) ? "halo" : "fill"); + }; - if (values.hasHalo) { - draw(parameters.programs.getSymbolLayerPrograms().symbolGlyph, - SymbolSDFTextProgram::layoutUniformValues(true, bucket.hasVariablePlacement, values, texsize, parameters.pixelsToGLUnits, parameters.pixelRatio, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Halo), - bucket.text, - textSegments, - bucket.textSizeBinder, - bucketPaintProperties.textBinders, - paintPropertyValues, - SymbolSDFTextProgram::TextureBindings{ - textureBinding - }, - "halo"); - } + if (bucket.iconsInText) { + if (values.hasHalo) { + drawGlyphs(parameters.programs.getSymbolLayerPrograms().symbolTextAndIcon, + SymbolTextAndIconProgram::layoutUniformValues(bucket.hasVariablePlacement, + values, + glyphTexSize, + iconTexSize, + parameters.pixelsToGLUnits, + parameters.pixelRatio, + alongLine, + tile, + parameters.state, + parameters.symbolFadeChange, + SymbolSDFPart::Halo), + SymbolTextAndIconProgram::TextureBindings{glyphTextureBinding, iconTextureBinding}, + SymbolSDFPart::Halo); + } - if (values.hasFill) { - draw(parameters.programs.getSymbolLayerPrograms().symbolGlyph, - SymbolSDFTextProgram::layoutUniformValues(true, bucket.hasVariablePlacement, values, texsize, parameters.pixelsToGLUnits, parameters.pixelRatio, alongLine, tile, parameters.state, parameters.symbolFadeChange, SymbolSDFPart::Fill), - bucket.text, - textSegments, - bucket.textSizeBinder, - bucketPaintProperties.textBinders, - paintPropertyValues, - SymbolSDFTextProgram::TextureBindings{ - textureBinding - }, - "fill"); + if (values.hasFill) { + drawGlyphs(parameters.programs.getSymbolLayerPrograms().symbolTextAndIcon, + SymbolTextAndIconProgram::layoutUniformValues(bucket.hasVariablePlacement, + values, + glyphTexSize, + iconTexSize, + parameters.pixelsToGLUnits, + parameters.pixelRatio, + alongLine, + tile, + parameters.state, + parameters.symbolFadeChange, + SymbolSDFPart::Fill), + SymbolTextAndIconProgram::TextureBindings{glyphTextureBinding, iconTextureBinding}, + SymbolSDFPart::Fill); + } + } else { + if (values.hasHalo) { + drawGlyphs(parameters.programs.getSymbolLayerPrograms().symbolGlyph, + SymbolSDFTextProgram::layoutUniformValues(true, + bucket.hasVariablePlacement, + values, + glyphTexSize, + parameters.pixelsToGLUnits, + parameters.pixelRatio, + alongLine, + tile, + parameters.state, + parameters.symbolFadeChange, + SymbolSDFPart::Halo), + SymbolSDFTextProgram::TextureBindings{glyphTextureBinding}, + SymbolSDFPart::Halo); + } + + if (values.hasFill) { + drawGlyphs(parameters.programs.getSymbolLayerPrograms().symbolGlyph, + SymbolSDFTextProgram::layoutUniformValues(true, + bucket.hasVariablePlacement, + values, + glyphTexSize, + parameters.pixelsToGLUnits, + parameters.pixelRatio, + alongLine, + tile, + parameters.state, + parameters.symbolFadeChange, + SymbolSDFPart::Fill), + SymbolSDFTextProgram::TextureBindings{glyphTextureBinding}, + SymbolSDFPart::Fill); + } } } |