From 5a75b63a057dd6ec53ff95e2d7f45646ae020f14 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 24 Oct 2018 11:23:05 +0300 Subject: [PATCH 1/2] [core] Added RendererState::has{Image,Layer,Source} --- include/mbgl/renderer/renderer_state.hpp | 10 ++++- .../default/mbgl/gl/headless_frontend.cpp | 24 ++++++++++++ .../default/mbgl/gl/headless_frontend.hpp | 4 ++ src/mbgl/renderer/renderer_state.cpp | 32 ++++++++++++++++ test/map/map.test.cpp | 38 +++++++++++++++++++ 5 files changed, 107 insertions(+), 1 deletion(-) diff --git a/include/mbgl/renderer/renderer_state.hpp b/include/mbgl/renderer/renderer_state.hpp index 1b300c190b4..27985ae9968 100644 --- a/include/mbgl/renderer/renderer_state.hpp +++ b/include/mbgl/renderer/renderer_state.hpp @@ -8,7 +8,7 @@ namespace mbgl { class UpdateParameters; /** - * RendererState acts as a Memento-like object that is able to extract data out of UpdateParameters (an opaque object + * RendererState acts as a Memento object that is able to extract data out of UpdateParameters (an opaque object * from the public API perspective). */ class RendererState { @@ -17,6 +17,14 @@ class RendererState { // Obtains a CameraOptions out of a given UpdateParameters object. static CameraOptions getCameraOptions(UpdateParameters&, const EdgeInsets& = {}); + // Returns whether an image with the given ID exists from a given UpdateParamters object. + static bool hasImage(UpdateParameters&, const std::string& id); + + // Returns whether a layer with the given ID exists from a given UpdateParamters object. + static bool hasLayer(UpdateParameters&, const std::string& id); + + // Returns whether a source with the given ID exists from a given UpdateParamters object. + static bool hasSource(UpdateParameters&, const std::string& id); }; } // namespace mbgl diff --git a/platform/default/mbgl/gl/headless_frontend.cpp b/platform/default/mbgl/gl/headless_frontend.cpp index 1ec11a195f2..30def38f71a 100644 --- a/platform/default/mbgl/gl/headless_frontend.cpp +++ b/platform/default/mbgl/gl/headless_frontend.cpp @@ -64,6 +64,30 @@ CameraOptions HeadlessFrontend::getCameraOptions() { return nullCamera; } +bool HeadlessFrontend::hasImage(const std::string& id) { + if (updateParameters) { + return RendererState::hasImage(*updateParameters, id); + } + + return false; +} + +bool HeadlessFrontend::hasLayer(const std::string& id) { + if (updateParameters) { + return RendererState::hasLayer(*updateParameters, id); + } + + return false; +} + +bool HeadlessFrontend::hasSource(const std::string& id) { + if (updateParameters) { + return RendererState::hasSource(*updateParameters, id); + } + + return false; +} + void HeadlessFrontend::setSize(Size size_) { if (size != size_) { size = size_; diff --git a/platform/default/mbgl/gl/headless_frontend.hpp b/platform/default/mbgl/gl/headless_frontend.hpp index 29ab30c93df..45586033b0a 100644 --- a/platform/default/mbgl/gl/headless_frontend.hpp +++ b/platform/default/mbgl/gl/headless_frontend.hpp @@ -35,6 +35,10 @@ class HeadlessFrontend : public RendererFrontend { RendererBackend* getBackend(); CameraOptions getCameraOptions(); + bool hasImage(const std::string&); + bool hasLayer(const std::string&); + bool hasSource(const std::string&); + PremultipliedImage readStillImage(); PremultipliedImage render(Map&); diff --git a/src/mbgl/renderer/renderer_state.cpp b/src/mbgl/renderer/renderer_state.cpp index dc5c4c1292f..a024f37dfc8 100644 --- a/src/mbgl/renderer/renderer_state.cpp +++ b/src/mbgl/renderer/renderer_state.cpp @@ -1,10 +1,42 @@ #include #include +#include +#include +#include + namespace mbgl { CameraOptions RendererState::getCameraOptions(UpdateParameters& updateParameters, const EdgeInsets& padding) { return updateParameters.transformState.getCameraOptions(padding); } +bool RendererState::hasImage(UpdateParameters& updateParameters, const std::string& id) { + for (const auto& image : *updateParameters.images) { + if (image.get()->id == id) { + return true; + } + } + return false; +} + +bool RendererState::hasLayer(UpdateParameters& updateParameters, const std::string& id) { + for (const auto& layer : *updateParameters.layers) { + if (layer.get()->id == id) { + return true; + } + } + return false; +} + +bool RendererState::hasSource(UpdateParameters& updateParameters, const std::string& id) { + for (const auto& source : *updateParameters.sources) { + if (source.get()->id == id) { + return true; + } + } + return false; +} + + } // namespace mbgl diff --git a/test/map/map.test.cpp b/test/map/map.test.cpp index a21f9c7e75d..c57fe28ae5b 100644 --- a/test/map/map.test.cpp +++ b/test/map/map.test.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include using namespace mbgl; @@ -69,12 +71,48 @@ TEST(Map, RendererState) { test.runLoop.runOnce(); test.frontend.render(test.map); + // RendererState::getCameraOptions const CameraOptions& options = test.frontend.getCameraOptions(); EXPECT_NEAR(options.center->latitude(), coordinate.latitude(), 1e-7); EXPECT_NEAR(options.center->longitude(), coordinate.longitude(), 1e-7); ASSERT_DOUBLE_EQ(*options.zoom, zoom); ASSERT_DOUBLE_EQ(*options.pitch, pitchInDegrees); EXPECT_NEAR(*options.angle, bearingInDegrees, 1e-7); + + // RendererState::hasImage + test.map.getStyle().addImage(std::make_unique("default_marker", decodeImage(util::read_file("test/fixtures/sprites/default_marker.png")), 1.0)); + + // The frontend has not yet been notified about the newly-added image. + EXPECT_FALSE(test.frontend.hasImage("default_marker")); + + test.runLoop.runOnce(); + test.frontend.render(test.map); + + EXPECT_TRUE(test.frontend.hasImage("default_marker")); + + // RendererState::hasSource + auto source = std::make_unique("GeoJSONSource"); + source->setGeoJSON( Geometry{ Point{ 0, 0 } } ); + test.map.getStyle().addSource(std::move(source)); + + // The frontend has not yet been notified about the newly-added source. + EXPECT_FALSE(test.frontend.hasSource("GeoJSONSource")); + + test.runLoop.runOnce(); + test.frontend.render(test.map); + + EXPECT_TRUE(test.frontend.hasSource("GeoJSONSource")); + + // RendererState::hasLayer + test.map.getStyle().addLayer(std::make_unique("SymbolLayer", "GeoJSONSource")); + + // The frontend has not yet been notified about the newly-added source. + EXPECT_FALSE(test.frontend.hasLayer("SymbolLayer")); + + test.runLoop.runOnce(); + test.frontend.render(test.map); + + EXPECT_TRUE(test.frontend.hasLayer("SymbolLayer")); } TEST(Map, LatLngBehavior) { From b4b7ffa645ee40f8ca4ab976054d95a581bc5cc3 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Wed, 24 Oct 2018 11:23:40 +0300 Subject: [PATCH 2/2] [build] GCC 7+ complains about -Wimplicit-fallthrough in utf.cpp --- platform/default/utf.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/platform/default/utf.cpp b/platform/default/utf.cpp index f0f9d3e67a0..fdcff344b99 100644 --- a/platform/default/utf.cpp +++ b/platform/default/utf.cpp @@ -1,7 +1,16 @@ #include +#if defined(__GNUC__) && __GNUC__ >= 7 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif // defined(__GNUC__) && __GNUC__ >= 7 + #include +#if defined(__GNUC__) && __GNUC__ >= 7 +#pragma GCC diagnostic pop +#endif // defined(__GNUC__) && __GNUC__ >= 7 + namespace mbgl { namespace util {