1 #include <mbgl/renderer/group_by_layout.hpp> 2 #include <mbgl/renderer/render_layer.hpp> 3 #include <mbgl/style/layer_impl.hpp> 4 #include <mbgl/style/conversion/stringify.hpp> 5 #include <mbgl/util/rapidjson.hpp> 6 7 #include <rapidjson/writer.h> 8 #include <rapidjson/stringbuffer.h> 9 10 #include <unordered_map> 11 12 namespace mbgl { 13 layoutKey(const RenderLayer & layer)14std::string layoutKey(const RenderLayer& layer) { 15 using namespace style::conversion; 16 17 rapidjson::StringBuffer s; 18 rapidjson::Writer<rapidjson::StringBuffer> writer(s); 19 20 writer.StartArray(); 21 writer.Uint(static_cast<uint32_t>(layer.type)); 22 writer.String(layer.baseImpl->source); 23 writer.String(layer.baseImpl->sourceLayer); 24 writer.Double(layer.baseImpl->minZoom); 25 writer.Double(layer.baseImpl->maxZoom); 26 writer.Uint(static_cast<uint32_t>(layer.baseImpl->visibility)); 27 stringify(writer, layer.baseImpl->filter); 28 layer.baseImpl->stringifyLayout(writer); 29 writer.EndArray(); 30 31 return s.GetString(); 32 } 33 groupByLayout(const std::vector<std::unique_ptr<RenderLayer>> & layers)34std::vector<std::vector<const RenderLayer*>> groupByLayout(const std::vector<std::unique_ptr<RenderLayer>>& layers) { 35 std::unordered_map<std::string, std::vector<const RenderLayer*>> map; 36 for (auto& layer : layers) { 37 map[layoutKey(*layer)].push_back(layer.get()); 38 } 39 40 std::vector<std::vector<const RenderLayer*>> result; 41 for (auto& pair : map) { 42 result.push_back(pair.second); 43 } 44 45 return result; 46 } 47 48 } // namespace mbgl 49