summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r--src/mbgl/renderer/painter.cpp19
-rw-r--r--src/mbgl/renderer/painter_fill.cpp24
-rw-r--r--src/mbgl/renderer/painter_line.cpp19
-rw-r--r--src/mbgl/renderer/symbol_bucket.cpp8
4 files changed, 37 insertions, 33 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index 70d2c75c0d..49b4526f58 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -276,19 +276,20 @@ void Painter::renderBackground(const BackgroundLayer& layer) {
const BackgroundPaintProperties& properties = layer.paint;
if (!properties.pattern.value.to.empty()) {
- if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque))
+ mapbox::util::optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true);
+ mapbox::util::optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true);
+
+ if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque) || !imagePosA || !imagePosB)
return;
- SpriteAtlasPosition imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true);
- SpriteAtlasPosition imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true);
float zoomFraction = state.getZoomFraction();
config.program = patternShader->program;
patternShader->u_matrix = identityMatrix;
- patternShader->u_pattern_tl_a = imagePosA.tl;
- patternShader->u_pattern_br_a = imagePosA.br;
- patternShader->u_pattern_tl_b = imagePosB.tl;
- patternShader->u_pattern_br_b = imagePosB.br;
+ patternShader->u_pattern_tl_a = (*imagePosA).tl;
+ patternShader->u_pattern_br_a = (*imagePosA).br;
+ patternShader->u_pattern_tl_b = (*imagePosB).tl;
+ patternShader->u_pattern_br_b = (*imagePosB).br;
patternShader->u_mix = properties.pattern.value.t;
patternShader->u_opacity = properties.opacity;
@@ -296,7 +297,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) {
PrecisionPoint center = state.latLngToPoint(latLng);
float scale = 1 / std::pow(2, zoomFraction);
- std::array<float, 2> sizeA = imagePosA.size;
+ std::array<float, 2> sizeA = (*imagePosA).size;
mat3 matrixA;
matrix::identity(matrixA);
matrix::scale(matrixA, matrixA,
@@ -310,7 +311,7 @@ void Painter::renderBackground(const BackgroundLayer& layer) {
scale * state.getWidth() / 2,
-scale * state.getHeight() / 2);
- std::array<float, 2> sizeB = imagePosB.size;
+ std::array<float, 2> sizeB = (*imagePosB).size;
mat3 matrixB;
matrix::identity(matrixB);
matrix::scale(matrixB, matrixB,
diff --git a/src/mbgl/renderer/painter_fill.cpp b/src/mbgl/renderer/painter_fill.cpp
index 4bee5b6d1e..beebdfcf83 100644
--- a/src/mbgl/renderer/painter_fill.cpp
+++ b/src/mbgl/renderer/painter_fill.cpp
@@ -59,30 +59,30 @@ void Painter::renderFill(FillBucket& bucket, const FillLayer& layer, const TileI
}
if (pattern) {
- // Image fill.
- if (pass == RenderPass::Translucent) {
+ mapbox::util::optional<SpriteAtlasPosition> posA = spriteAtlas->getPosition(properties.pattern.value.from, true);
+ mapbox::util::optional<SpriteAtlasPosition> posB = spriteAtlas->getPosition(properties.pattern.value.to, true);
- const SpriteAtlasPosition posA = spriteAtlas->getPosition(properties.pattern.value.from, true);
- const SpriteAtlasPosition posB = spriteAtlas->getPosition(properties.pattern.value.to, true);
+ // Image fill.
+ if (pass == RenderPass::Translucent && posA && posB) {
float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z) / id.overscaling;
mat3 patternMatrixA;
matrix::identity(patternMatrixA);
matrix::scale(patternMatrixA, patternMatrixA,
- 1.0f / (posA.size[0] * factor * properties.pattern.value.fromScale),
- 1.0f / (posA.size[1] * factor * properties.pattern.value.fromScale));
+ 1.0f / ((*posA).size[0] * factor * properties.pattern.value.fromScale),
+ 1.0f / ((*posA).size[1] * factor * properties.pattern.value.fromScale));
mat3 patternMatrixB;
matrix::identity(patternMatrixB);
matrix::scale(patternMatrixB, patternMatrixB,
- 1.0f / (posB.size[0] * factor * properties.pattern.value.toScale),
- 1.0f / (posB.size[1] * factor * properties.pattern.value.toScale));
+ 1.0f / ((*posB).size[0] * factor * properties.pattern.value.toScale),
+ 1.0f / ((*posB).size[1] * factor * properties.pattern.value.toScale));
config.program = patternShader->program;
patternShader->u_matrix = vtxMatrix;
- patternShader->u_pattern_tl_a = posA.tl;
- patternShader->u_pattern_br_a = posA.br;
- patternShader->u_pattern_tl_b = posB.tl;
- patternShader->u_pattern_br_b = posB.br;
+ patternShader->u_pattern_tl_a = (*posA).tl;
+ patternShader->u_pattern_br_a = (*posA).br;
+ patternShader->u_pattern_tl_b = (*posB).tl;
+ patternShader->u_pattern_br_b = (*posB).br;
patternShader->u_opacity = properties.opacity;
patternShader->u_image = 0;
patternShader->u_mix = properties.pattern.value.t;
diff --git a/src/mbgl/renderer/painter_line.cpp b/src/mbgl/renderer/painter_line.cpp
index e33864622e..30f03ff030 100644
--- a/src/mbgl/renderer/painter_line.cpp
+++ b/src/mbgl/renderer/painter_line.cpp
@@ -102,8 +102,11 @@ void Painter::renderLine(LineBucket& bucket, const LineLayer& layer, const TileI
bucket.drawLineSDF(*linesdfShader);
} else if (!properties.pattern.value.from.empty()) {
- SpriteAtlasPosition imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true);
- SpriteAtlasPosition imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true);
+ mapbox::util::optional<SpriteAtlasPosition> imagePosA = spriteAtlas->getPosition(properties.pattern.value.from, true);
+ mapbox::util::optional<SpriteAtlasPosition> imagePosB = spriteAtlas->getPosition(properties.pattern.value.to, true);
+
+ if (!imagePosA || !imagePosB)
+ return;
float factor = 8.0 / std::pow(2, state.getIntegerZoom() - id.z) * id.overscaling;
@@ -115,12 +118,12 @@ void Painter::renderLine(LineBucket& bucket, const LineLayer& layer, const TileI
linepatternShader->u_ratio = ratio;
linepatternShader->u_blur = blur;
- linepatternShader->u_pattern_size_a = {{imagePosA.size[0] * factor * properties.pattern.value.fromScale, imagePosA.size[1]}};
- linepatternShader->u_pattern_tl_a = imagePosA.tl;
- linepatternShader->u_pattern_br_a = imagePosA.br;
- linepatternShader->u_pattern_size_b = {{imagePosB.size[0] * factor * properties.pattern.value.toScale, imagePosB.size[1]}};
- linepatternShader->u_pattern_tl_b = imagePosB.tl;
- linepatternShader->u_pattern_br_b = imagePosB.br;
+ linepatternShader->u_pattern_size_a = {{(*imagePosA).size[0] * factor * properties.pattern.value.fromScale, (*imagePosA).size[1]}};
+ linepatternShader->u_pattern_tl_a = (*imagePosA).tl;
+ linepatternShader->u_pattern_br_a = (*imagePosA).br;
+ linepatternShader->u_pattern_size_b = {{(*imagePosB).size[0] * factor * properties.pattern.value.toScale, (*imagePosB).size[1]}};
+ linepatternShader->u_pattern_tl_b = (*imagePosB).tl;
+ linepatternShader->u_pattern_br_b = (*imagePosB).br;
linepatternShader->u_fade = properties.pattern.value.t;
linepatternShader->u_opacity = properties.opacity;
linepatternShader->u_extra = extra;
diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp
index 1f2ad96bf2..f5737d7430 100644
--- a/src/mbgl/renderer/symbol_bucket.cpp
+++ b/src/mbgl/renderer/symbol_bucket.cpp
@@ -247,10 +247,10 @@ void SymbolBucket::addFeatures(uintptr_t tileUID,
// if feature has icon, get sprite atlas position
if (feature.sprite.length()) {
auto image = spriteAtlas.getImage(feature.sprite, false);
- if (image.pos.hasArea() && image.texture) {
- shapedIcon = shapeIcon(image.pos, layout);
- assert(image.texture);
- if (image.texture->sdf) {
+ if (image) {
+ shapedIcon = shapeIcon((*image).pos, layout);
+ assert((*image).texture);
+ if ((*image).texture->sdf) {
sdfIcons = true;
}
}