inline bool encode_geometry(mapnik::geometry::linear_ring<std::int64_t> const& ring, vector_tile::Tile_Feature & current_feature, int32_t & start_x, int32_t & start_y) { std::size_t ring_size = ring.size(); if (ring_size < 3) { return false; } unsigned line_to_length = static_cast<unsigned>(ring_size) - 1; unsigned count = 0; enum { move_to = 1, line_to = 2, coords = 3 } status = move_to; bool drop_last = false; if (ring.size() > 2 && ring.front() == ring.back()) { drop_last = true; line_to_length -= 1; if (line_to_length < 2) { return false; } } for (auto const& pt : ring) { if (status == move_to) { status = line_to; current_feature.add_geometry(9); // 1 | (move_to << 3) } else if (status == line_to) { status = coords; current_feature.add_geometry(encode_length(line_to_length)); } else if (drop_last && count == line_to_length + 1) { continue; } int32_t dx = pt.x - start_x; int32_t dy = pt.y - start_y; // Manual zigzag encoding. current_feature.add_geometry(protozero::encode_zigzag32(dx)); current_feature.add_geometry(protozero::encode_zigzag32(dy)); start_x = pt.x; start_y = pt.y; ++count; } current_feature.add_geometry(15); // close_path return true; }
void operator() (mapnik::geometry::linear_ring<T> const& lr1, mapnik::geometry::linear_ring<T> const& lr2) { if (lr1.size() != lr2.size()) { REQUIRE(false); } for(auto const& p : zip_crange(lr1, lr2)) { REQUIRE(p.template get<0>().x == Approx(p.template get<1>().x)); REQUIRE(p.template get<0>().y == Approx(p.template get<1>().y)); } }