/* -*-c++-*- */ /* osgEarth - Geospatial SDK 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 OSGEARTHSYMBOLOGY_STYLE_H #define OSGEARTHSYMBOLOGY_STYLE_H 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace osgEarth { class Style; //! Use a vector_map so we can maintain order of appearance using StyleMap = vector_map; /** * Style is an unordered collection of Symbols that describes how to render * geometry and other objects. */ class OSGEARTH_EXPORT Style { public: /** Constructs a new, empty style. */ Style( const std::string& name = "" ); /** Constructs a style by deserializing it from a Config. */ Style(const Config& conf); /** Constructs a stype by deserializing it from a Config. */ Style(const Config& conf, const StyleMap* sheet); /** Copy constructor. By default, duplicates all the symbols; but if you specify SHALLOW_COPY, the new one will point to the same symbols. */ Style(const Style& rhs, const osg::CopyOp& op =osg::CopyOp::DEEP_COPY_ALL ); /** assignment operator */ Style& operator = (const Style& rhs); /** Gets the name of this style */ const std::string& getName() const { return _name; } /** Sets the name of this style */ void setName( const std::string& value ) { _name = value; } /** Starts with this style, merges in all the symbols from the other style, and returns a new style */ Style combineWith( const Style& rhs ) const; /** Test whether the style is empty */ bool empty() const { return _symbols.empty(); } /** Adds a symbol to the collection. */ void addSymbol(Symbol* symbol); void add(Symbol* symbol) { addSymbol(symbol); } /** Remove a symbol from the collection */ bool removeSymbol (Symbol* symbol); void copySymbols(const Style& style); /** Remove a symbol by type */ template bool remove() { Symbol* s = get(); return s ? removeSymbol(s) : false; } /** Gets a typed symbol from the style (the first one found). */ template T* getSymbol() { for (SymbolList::const_iterator it = _symbols.begin(); it != _symbols.end(); ++it) { Symbol* symbol = (*it).get(); T* s = dynamic_cast(symbol); if (s) return s; } return 0L; } template T* get() { return getSymbol(); } // alias /** Whether the style contains a symbol of the template type */ template bool has() { return get() != 0L; } template bool has() const { return get() != 0L; } /** Gets a typed symbol from the style (the first one found) */ template const T* getSymbol() const { for (SymbolList::const_iterator it = _symbols.begin(); it != _symbols.end(); ++it) { Symbol* symbol = (*it).get(); const T* s = dynamic_cast(symbol); if (s) return s; } return 0L; } template const T* get() const { return getSymbol(); } // alias /** Gets a typed symbol from the style (first one found), or creates/adds/returns one of that type if it doesn't already exist. */ template T* getOrCreateSymbol() { T* sym = getSymbol(); if ( !sym ) { sym = new T(); addSymbol( sym ); } return sym; } template T* getOrCreate() { return getOrCreateSymbol(); } // alias /** Access to list of symbols currently defining the style */ SymbolList& symbols() { return _symbols; } const SymbolList& symbols() const { return _symbols; } /** Serializes this object into a Config. */ virtual Config getConfig(bool keepOrigType = true) const; void mergeConfig(const Config& conf, const StyleMap*); void fromSLD(const Config&, const StyleMap*); protected: std::string _name; SymbolList _symbols; std::string _origType; std::string _origData; optional _uri; }; typedef std::vector