/* -*-c++-*- */ /* osgEarth - Dynamic map generation toolkit for OpenSceneGraph * Copyright 2020 Pelican Mapping * http://osgearth.org * * osgEarth is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see */ #ifndef OSGEARTH_FEATURE_RASTERIZER #define OSGEARTH_FEATURE_RASTERIZER 1 #include #include #include #include #include namespace osgEarth { namespace Util { class OSGEARTH_EXPORT FeatureRasterizer { public: FeatureRasterizer( unsigned int width, unsigned int height, const GeoExtent& extent, const Color& backgroundColor = Color::Transparent); FeatureRasterizer( osg::Image* preallocatedImage, const GeoExtent& extent); MapboxGLGlyphManager* getGlyphManager() const; void setGlyphManager(MapboxGLGlyphManager* glyphManager); //! A scaling factor that adjusts symbols to the desired pixel size. Mostly useful for mapbox layers. float getPixelScale() const; void setPixelScale(float pixelScale); void render( const FeatureList& features, const Style& style, const FeatureProfile* profile =nullptr, const StyleSheet* sheet =nullptr); GeoImage finalize(); struct SymbolBoundingBoxes { bool intersects2d(const osg::BoundingBox& bb) { for (auto& b : _bounds) { if (osg::maximum(b.xMin(), bb.xMin()) <= osg::minimum(b.xMax(), bb.xMax()) && osg::maximum(b.yMin(), bb.yMin()) <= osg::minimum(b.yMax(), bb.yMax())) { return true; } } return false; } std::vector< osg::BoundingBox > _bounds; }; private: GeoExtent _extent; osg::ref_ptr< osg::Image > _image; osg::ref_ptr< MapboxGLGlyphManager > _glyphManager; float _pixelScale = 1.0f; enum RenderFormat { RF_BGRA, RF_ABGR }; RenderFormat _implPixelFormat; bool _inverted; SymbolBoundingBoxes _symbolBoundingBoxes; void render_blend2d( const FeatureList& features, const Style& style, const FeatureProfile* profile, const StyleSheet* sheet); void render_agglite( const FeatureList& features, const Style& style, const FeatureProfile* profile, const StyleSheet* sheet); }; class OSGEARTH_EXPORT FeatureStyleSorter { public: FeatureStyleSorter(); using Function = std::function; void sort( const TileKey& key, const Distance& buffer, Session* session, const FeatureFilterChain& filters, Function processFeaturesForStyle, ProgressCallback* progress) const; protected: void getFeatures( Session* session, const Query& query, const Distance& buffer, const GeoExtent& extent, const FeatureFilterChain& filters, FeatureList& output, ProgressCallback* progress) const; void sort_usingEmbeddedStyles( const TileKey& key, const Distance& buffer, const FeatureFilterChain& filters, Session* session, Function processFeaturesForStyle, ProgressCallback* progress) const; void sort_usingSelectors( const TileKey& key, const Distance& buffer, const FeatureFilterChain& filters, Session* session, Function processFeaturesForStyle, ProgressCallback* progress) const; void sort_usingOneStyle( const Style& style, const TileKey& key, const Distance& buffer, const FeatureFilterChain& filters, Session* session, Function processFeaturesForStyle, ProgressCallback* progress) const; }; } } #endif