summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAnsis Brammanis <brammanis@gmail.com>2015-02-02 16:23:10 -0800
committerAnsis Brammanis <brammanis@gmail.com>2015-02-02 16:23:10 -0800
commitb3ca6fcca6e3a1c383a0235aea3110bc940c0656 (patch)
tree2cbc938d3fc626a5c4e3fb3950d619c52bf04f82 /src
parentd532824aec25e20efccb80860b990db0b85780ac (diff)
downloadqtlocation-mapboxgl-b3ca6fcca6e3a1c383a0235aea3110bc940c0656.tar.gz
implement functions for background-image
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/renderer/painter.cpp50
-rw-r--r--src/mbgl/style/style_parser.cpp2
-rw-r--r--src/mbgl/style/style_properties.hpp2
3 files changed, 36 insertions, 18 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index 448b380743..f8347123c0 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -376,39 +376,57 @@ void Painter::renderTileLayer(const Tile& tile, util::ptr<StyleLayer> layer_desc
void Painter::renderBackground(util::ptr<StyleLayer> layer_desc) {
const BackgroundProperties& properties = layer_desc->getProperties<BackgroundProperties>();
- if (properties.image.size()) {
+ if (properties.image.low.size()) {
if ((properties.opacity >= 1.0f) != (pass == RenderPass::Opaque))
return;
- SpriteAtlasPosition imagePos = spriteAtlas.getPosition(properties.image, true);
+ SpriteAtlasPosition imagePosA = spriteAtlas.getPosition(properties.image.low, true);
+ SpriteAtlasPosition imagePosB = spriteAtlas.getPosition(properties.image.high, true);
float zoomFraction = state.getZoomFraction();
useProgram(patternShader->program);
patternShader->u_matrix = identityMatrix;
- patternShader->u_pattern_tl_a = imagePos.tl;
- patternShader->u_pattern_br_a = imagePos.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 = zoomFraction;
patternShader->u_opacity = properties.opacity;
- std::array<float, 2> size = imagePos.size;
double lon, lat;
state.getLonLat(lon, lat);
std::array<float, 2> center = state.locationCoordinate(lon, lat);
float scale = 1 / std::pow(2, zoomFraction);
- mat3 matrix;
- matrix::identity(matrix);
- matrix::scale(matrix, matrix,
- 1.0f / size[0],
- 1.0f / size[1]);
- matrix::translate(matrix, matrix,
- std::fmod(center[0] * 512, size[0]),
- std::fmod(center[1] * 512, size[1]));
- matrix::rotate(matrix, matrix, -state.getAngle());
- matrix::scale(matrix, matrix,
+ std::array<float, 2> sizeA = imagePosA.size;
+ mat3 matrixA;
+ matrix::identity(matrixA);
+ matrix::scale(matrixA, matrixA,
+ 1.0f / (sizeA[0] * properties.image.lowScale),
+ 1.0f / (sizeA[1] * properties.image.lowScale));
+ matrix::translate(matrixA, matrixA,
+ std::fmod(center[0] * 512, sizeA[0] * properties.image.lowScale),
+ std::fmod(center[1] * 512, sizeA[1] * properties.image.lowScale));
+ matrix::rotate(matrixA, matrixA, -state.getAngle());
+ matrix::scale(matrixA, matrixA,
scale * state.getWidth() / 2,
-scale * state.getHeight() / 2);
- patternShader->u_patternmatrix_a = matrix;
+
+ std::array<float, 2> sizeB = imagePosB.size;
+ mat3 matrixB;
+ matrix::identity(matrixB);
+ matrix::scale(matrixB, matrixB,
+ 1.0f / (sizeB[0] * properties.image.highScale),
+ 1.0f / (sizeB[1] * properties.image.highScale));
+ matrix::translate(matrixB, matrixB,
+ std::fmod(center[0] * 512, sizeB[0] * properties.image.highScale),
+ std::fmod(center[1] * 512, sizeB[1] * properties.image.highScale));
+ matrix::rotate(matrixB, matrixB, -state.getAngle());
+ matrix::scale(matrixB, matrixB,
+ scale * state.getWidth() / 2,
+ -scale * state.getHeight() / 2);
+
+ patternShader->u_patternmatrix_a = matrixA;
backgroundBuffer.bind();
patternShader->bind(0);
diff --git a/src/mbgl/style/style_parser.cpp b/src/mbgl/style/style_parser.cpp
index 3f1fc64dab..1cf8d2e355 100644
--- a/src/mbgl/style/style_parser.cpp
+++ b/src/mbgl/style/style_parser.cpp
@@ -703,7 +703,7 @@ void StyleParser::parsePaint(JSVal value, ClassProperties &klass) {
parseOptionalProperty<Function<float>>("background-opacity", Key::BackgroundOpacity, klass, value);
parseOptionalProperty<Function<Color>>("background-color", Key::BackgroundColor, klass, value);
- parseOptionalProperty<std::string>("background-image", Key::BackgroundImage, klass, value);
+ parseOptionalProperty<FadedStopsFunction<Faded<std::string>>>("background-image", Key::BackgroundImage, klass, value);
}
void StyleParser::parseReference(JSVal value, util::ptr<StyleLayer> &layer) {
diff --git a/src/mbgl/style/style_properties.hpp b/src/mbgl/style/style_properties.hpp
index db9e4c34c9..d2c134e8d8 100644
--- a/src/mbgl/style/style_properties.hpp
+++ b/src/mbgl/style/style_properties.hpp
@@ -96,7 +96,7 @@ struct BackgroundProperties {
inline BackgroundProperties() {}
float opacity = 1.0f;
Color color = {{ 0, 0, 0, 1 }};
- std::string image;
+ Faded<std::string> image;
};
typedef mapbox::util::variant<