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)14 std::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)34 std::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