From 937f82fcda03d382b3f2011d4ad4d60cb9d8d8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Thu, 14 Aug 2014 13:21:36 +0200 Subject: [PATCH] use pimpl for collision in tile_parser --- include/mbgl/map/tile_parser.hpp | 5 +++-- include/mbgl/text/collision.hpp | 5 ++--- src/map/tile_parser.cpp | 14 +++++++++++--- src/renderer/symbol_bucket.cpp | 2 +- src/text/collision.cpp | 22 +++++++--------------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/include/mbgl/map/tile_parser.hpp b/include/mbgl/map/tile_parser.hpp index f011d47a3..fa64dad6d 100644 --- a/include/mbgl/map/tile_parser.hpp +++ b/include/mbgl/map/tile_parser.hpp @@ -4,7 +4,6 @@ #include #include #include -#include #include #include @@ -28,6 +27,7 @@ class StyleBucketLine; class StyleBucketSymbol; class StyleLayerGroup; class VectorTileData; +class Collision; class TileParser { public: @@ -37,6 +37,7 @@ public: const std::shared_ptr &glyphStore, const std::shared_ptr &spriteAtlas, const std::shared_ptr &sprite); + ~TileParser(); public: void parse(); @@ -65,7 +66,7 @@ private: std::shared_ptr sprite; std::shared_ptr texturePool; - Collision collision; + std::unique_ptr collision; }; } diff --git a/include/mbgl/text/collision.hpp b/include/mbgl/text/collision.hpp index 6771765c1..e2e2414ba 100644 --- a/include/mbgl/text/collision.hpp +++ b/include/mbgl/text/collision.hpp @@ -29,7 +29,6 @@ class Collision { public: Collision(float zoom, float tileExtent, float tileSize, float placementDepth = 1); - ~Collision(); float getPlacementScale(const GlyphBoxes &glyphs, float minPlacementScale, bool avoidEdges); PlacementRange getPlacementRange(const GlyphBoxes &glyphs, float placementScale, @@ -38,8 +37,8 @@ public: const PlacementRange &placementRange, bool horizontal); private: - void *hTree; - void *cTree; + Tree hTree; + Tree cTree; PlacementValue leftEdge; PlacementValue topEdge; PlacementValue rightEdge; diff --git a/src/map/tile_parser.cpp b/src/map/tile_parser.cpp index 6069ad82c..6923c1a42 100644 --- a/src/map/tile_parser.cpp +++ b/src/map/tile_parser.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -29,7 +30,12 @@ namespace regex_impl = boost; namespace regex_impl = std; #endif -using namespace mbgl; +namespace mbgl { + +// Note: This destructor is seemingly empty, but we need to declare it anyway +// because this object has a std::unique_ptr<> of a forward-declare type in +// its header file. +TileParser::~TileParser() = default; TileParser::TileParser(const std::string &data, VectorTileData &tile, const std::shared_ptr &style, @@ -44,7 +50,7 @@ TileParser::TileParser(const std::string &data, VectorTileData &tile, glyphStore(glyphStore), spriteAtlas(spriteAtlas), sprite(sprite), - collision(tile.id.z, 4096, tile.source.tile_size, tile.depth) { + collision(std::make_unique(tile.id.z, 4096, tile.source.tile_size, tile.depth)) { } void TileParser::parse() { @@ -163,7 +169,9 @@ std::unique_ptr TileParser::createLineBucket(const VectorTileLayer& laye } std::unique_ptr TileParser::createSymbolBucket(const VectorTileLayer& layer, const FilterExpression &filter, const StyleBucketSymbol &symbol) { - std::unique_ptr bucket = std::make_unique(symbol, collision); + std::unique_ptr bucket = std::make_unique(symbol, *collision); bucket->addFeatures(layer, filter, tile.id, *spriteAtlas, *sprite, *glyphAtlas, *glyphStore); return obsolete() ? nullptr : std::move(bucket); } + +} diff --git a/src/renderer/symbol_bucket.cpp b/src/renderer/symbol_bucket.cpp index f10d44bb4..30110faf0 100644 --- a/src/renderer/symbol_bucket.cpp +++ b/src/renderer/symbol_bucket.cpp @@ -240,7 +240,7 @@ void SymbolBucket::addFeature(const std::vector &line, const Shaping Placement iconPlacement; float glyphScale = 0; float iconScale = 0; - bool inside = !(anchor.x < 0 || anchor.x > 4096 || anchor.y < 0 || anchor.y > 4096); + const bool inside = !(anchor.x < 0 || anchor.x > 4096 || anchor.y < 0 || anchor.y > 4096); if (avoidEdges && !inside) continue; diff --git a/src/text/collision.cpp b/src/text/collision.cpp index f34aeb8b1..89e91d684 100644 --- a/src/text/collision.cpp +++ b/src/text/collision.cpp @@ -19,17 +19,9 @@ Box getBox(const CollisionAnchor &anchor, const CollisionRect &bbox, float minSc }; }; -Collision::~Collision() { - delete ((Tree *)cTree); - delete ((Tree *)hTree); -} - Collision::Collision(float zoom, float tileExtent, float tileSize, float placementDepth) - : hTree(new Tree()), // tree for horizontal labels - cTree(new Tree()), // tree for glyphs from curved labels - // tile pixels per screen pixels at the tile's zoom level - tilePixelRatio(tileExtent / tileSize), + : tilePixelRatio(tileExtent / tileSize), zoom(zoom), @@ -135,8 +127,8 @@ float Collision::getPlacementScale(const GlyphBoxes &glyphs, float minPlacementS const Box searchBox = getBox(anchor, bbox, minScale, maxScale); std::vector blocking; - ((Tree *)hTree)->query(bgi::intersects(searchBox), std::back_inserter(blocking)); - ((Tree *)cTree)->query(bgi::intersects(searchBox), std::back_inserter(blocking)); + hTree.query(bgi::intersects(searchBox), std::back_inserter(blocking)); + cTree.query(bgi::intersects(searchBox), std::back_inserter(blocking)); if (avoidEdges) { if (searchBox.min_corner().get<0>() < 0) blocking.emplace_back(leftEdge); @@ -218,10 +210,10 @@ PlacementRange Collision::getPlacementRange(const GlyphBoxes &glyphs, float plac Box query_box{Point{minPlacedX, minPlacedY}, Point{maxPlacedX, maxPlacedY}}; std::vector blocking; - ((Tree *)hTree)->query(bgi::intersects(query_box), std::back_inserter(blocking)); + hTree.query(bgi::intersects(query_box), std::back_inserter(blocking)); if (horizontal) { - ((Tree *)cTree)->query(bgi::intersects(query_box), std::back_inserter(blocking)); + cTree.query(bgi::intersects(query_box), std::back_inserter(blocking)); } for (const PlacementValue &value : blocking) { @@ -298,8 +290,8 @@ void Collision::insert(const GlyphBoxes &glyphs, const CollisionAnchor &anchor, // Bulk-insert all glyph boxes if (horizontal) { - ((Tree *)hTree)->insert(allBounds.begin(), allBounds.end()); + hTree.insert(allBounds.begin(), allBounds.end()); } else { - ((Tree *)cTree)->insert(allBounds.begin(), allBounds.end()); + cTree.insert(allBounds.begin(), allBounds.end()); } }