/****************************************************************************** * $Id$ * * Project: OpenGIS Simple Features Reference Implementation * Purpose: Define of Feature Representation * Author: Stephane Villeneuve, stephane.v@videtron.ca * ****************************************************************************** * Copyright (c) 1999, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef OGR_FEATURESTYLE_INCLUDE #define OGR_FEATURESTYLE_INCLUDE #include "cpl_conv.h" #include "cpl_string.h" #include "ogr_core.h" class OGRFeature; /** * \file ogr_featurestyle.h * * Simple feature style classes. */ /* * All OGRStyleTool param lists are defined in ogr_core.h. */ /** OGR Style type */ typedef enum ogr_style_type { OGRSTypeUnused = -1, OGRSTypeString, OGRSTypeDouble, OGRSTypeInteger, OGRSTypeBoolean } OGRSType; //! @cond Doxygen_Suppress typedef struct ogr_style_param { int eParam; const char *pszToken; GBool bGeoref; OGRSType eType; } OGRStyleParamId; typedef struct ogr_style_value { char *pszValue; double dfValue; int nValue; // Used for both integer and boolean types GBool bValid; OGRSTUnitId eUnit; } OGRStyleValue; //! @endcond // Every time a pszStyleString given in parameter is NULL, // the StyleString defined in the Mgr will be use. /** * This class represents a style table */ class CPL_DLL OGRStyleTable { private: char **m_papszStyleTable = nullptr; CPLString osLastRequestedStyleName{}; int iNextStyle = 0; CPL_DISALLOW_COPY_ASSIGN(OGRStyleTable) public: OGRStyleTable(); ~OGRStyleTable(); GBool AddStyle(const char *pszName,const char *pszStyleString); GBool RemoveStyle(const char *pszName); GBool ModifyStyle(const char *pszName, const char *pszStyleString); GBool SaveStyleTable(const char *pszFilename); GBool LoadStyleTable(const char *pszFilename); const char *Find(const char *pszStyleString); GBool IsExist(const char *pszName); const char *GetStyleName(const char *pszName); void Print(FILE *fpOut); void Clear(); OGRStyleTable *Clone(); void ResetStyleStringReading(); const char *GetNextStyle(); const char *GetLastStyleName(); }; class OGRStyleTool; /** * This class represents a style manager */ class CPL_DLL OGRStyleMgr { private: OGRStyleTable *m_poDataSetStyleTable = nullptr; char *m_pszStyleString = nullptr; CPL_DISALLOW_COPY_ASSIGN(OGRStyleMgr) public: explicit OGRStyleMgr(OGRStyleTable *poDataSetStyleTable = nullptr); ~OGRStyleMgr(); GBool SetFeatureStyleString(OGRFeature *,const char *pszStyleString=nullptr, GBool bNoMatching = FALSE); /* It will set in the given feature the pszStyleString with the style or will set the style name found in dataset StyleTable (if bNoMatching == FALSE). */ const char *InitFromFeature(OGRFeature *); GBool InitStyleString(const char *pszStyleString = nullptr); const char *GetStyleName(const char *pszStyleString= nullptr); const char *GetStyleByName(const char *pszStyleName); GBool AddStyle(const char *pszStyleName, const char *pszStyleString=nullptr); const char *GetStyleString(OGRFeature * = nullptr); GBool AddPart(OGRStyleTool *); GBool AddPart(const char *); int GetPartCount(const char *pszStyleString = nullptr); OGRStyleTool *GetPart(int hPartId, const char *pszStyleString = nullptr); /* It could have a reference counting process us for the OGRStyleTable, if needed. */ //! @cond Doxygen_Suppress OGRStyleTable *GetDataSetStyleTable(){return m_poDataSetStyleTable;} OGRStyleTool *CreateStyleToolFromStyleString(const char *pszStyleString); //! @endcond }; /** * This class represents a style tool */ class CPL_DLL OGRStyleTool { private: GBool m_bModified = false; GBool m_bParsed = false; double m_dfScale = 1.0; OGRSTUnitId m_eUnit = OGRSTUMM; OGRSTClassId m_eClassId = OGRSTCNone; char *m_pszStyleString = nullptr; virtual GBool Parse() = 0; CPL_DISALLOW_COPY_ASSIGN(OGRStyleTool) protected: #ifndef DOXYGEN_SKIP GBool Parse(const OGRStyleParamId* pasStyle, OGRStyleValue* pasValue, int nCount); #endif public: OGRStyleTool() : m_bModified(FALSE), m_bParsed(FALSE), m_dfScale(0.0), m_eUnit(OGRSTUGround), m_eClassId(OGRSTCNone), m_pszStyleString(nullptr) {} explicit OGRStyleTool(OGRSTClassId eClassId); virtual ~OGRStyleTool(); static GBool GetRGBFromString(const char *pszColor, int &nRed, int &nGreen, int &nBlue, int &nTransparence); static int GetSpecificId(const char *pszId, const char *pszWanted); #ifndef DOXYGEN_SKIP GBool IsStyleModified() {return m_bModified;} void StyleModified() {m_bModified = TRUE;} GBool IsStyleParsed() {return m_bParsed;} void StyleParsed() {m_bParsed = TRUE;} #endif OGRSTClassId GetType(); #ifndef DOXYGEN_SKIP void SetInternalInputUnitFromParam(char *pszString); #endif void SetUnit(OGRSTUnitId,double dfScale = 1.0); //the dfScale will be //used if we are working with Ground Unit ( ground = paper * scale); OGRSTUnitId GetUnit(){return m_eUnit;} // There are two way to set the parameters in the Style, with generic // methods (using a defined enumeration) or with the reel method specific // for Each style tools. virtual const char *GetStyleString() = 0; void SetStyleString(const char *pszStyleString); const char *GetStyleString(const OGRStyleParamId *pasStyleParam , OGRStyleValue *pasStyleValue, int nSize); const char *GetParamStr(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull); int GetParamNum(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull); double GetParamDbl(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, GBool &bValueIsNull); void SetParamStr(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, const char *pszParamString); void SetParamNum(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, int nParam); void SetParamDbl(const OGRStyleParamId &sStyleParam , OGRStyleValue &sStyleValue, double dfParam); #ifndef DOXYGEN_SKIP double ComputeWithUnit(double, OGRSTUnitId); int ComputeWithUnit(int , OGRSTUnitId); #endif }; //! @cond Doxygen_Suppress /** * This class represents a style pen */ class CPL_DLL OGRStylePen : public OGRStyleTool { private: OGRStyleValue *m_pasStyleValue; GBool Parse() override; CPL_DISALLOW_COPY_ASSIGN(OGRStylePen) public: OGRStylePen(); ~OGRStylePen() override; /**********************************************************************/ /* Explicit fct for all parameters defined in the Drawing tools Pen */ /**********************************************************************/ const char *Color(GBool &bDefault){return GetParamStr(OGRSTPenColor,bDefault);} void SetColor(const char *pszColor){SetParamStr(OGRSTPenColor,pszColor);} double Width(GBool &bDefault){return GetParamDbl(OGRSTPenWidth,bDefault);} void SetWidth(double dfWidth){SetParamDbl(OGRSTPenWidth,dfWidth);} const char *Pattern(GBool &bDefault){return GetParamStr(OGRSTPenPattern,bDefault);} void SetPattern(const char *pszPattern){SetParamStr(OGRSTPenPattern,pszPattern);} const char *Id(GBool &bDefault){return GetParamStr(OGRSTPenId,bDefault);} void SetId(const char *pszId){SetParamStr(OGRSTPenId,pszId);} double PerpendicularOffset(GBool &bDefault){return GetParamDbl(OGRSTPenPerOffset,bDefault);} void SetPerpendicularOffset(double dfPerp){SetParamDbl(OGRSTPenPerOffset,dfPerp);} const char *Cap(GBool &bDefault){return GetParamStr(OGRSTPenCap,bDefault);} void SetCap(const char *pszCap){SetParamStr(OGRSTPenCap,pszCap);} const char *Join(GBool &bDefault){return GetParamStr(OGRSTPenJoin,bDefault);} void SetJoin(const char *pszJoin){SetParamStr(OGRSTPenJoin,pszJoin);} int Priority(GBool &bDefault){return GetParamNum(OGRSTPenPriority,bDefault);} void SetPriority(int nPriority){SetParamNum(OGRSTPenPriority,nPriority);} /*****************************************************************/ const char *GetParamStr(OGRSTPenParam eParam, GBool &bValueIsNull); int GetParamNum(OGRSTPenParam eParam,GBool &bValueIsNull); double GetParamDbl(OGRSTPenParam eParam,GBool &bValueIsNull); void SetParamStr(OGRSTPenParam eParam, const char *pszParamString); void SetParamNum(OGRSTPenParam eParam, int nParam); void SetParamDbl(OGRSTPenParam eParam, double dfParam); const char *GetStyleString() override; }; /** * This class represents a style brush */ class CPL_DLL OGRStyleBrush : public OGRStyleTool { private: OGRStyleValue *m_pasStyleValue; GBool Parse() override; CPL_DISALLOW_COPY_ASSIGN(OGRStyleBrush) public: OGRStyleBrush(); ~OGRStyleBrush() override; /* Explicit fct for all parameters defined in the Drawing tools Brush */ const char *ForeColor(GBool &bDefault){return GetParamStr(OGRSTBrushFColor,bDefault);} void SetForeColor(const char *pszColor){SetParamStr(OGRSTBrushFColor,pszColor);} const char *BackColor(GBool &bDefault){return GetParamStr(OGRSTBrushBColor,bDefault);} void SetBackColor(const char *pszColor){SetParamStr(OGRSTBrushBColor,pszColor);} const char *Id(GBool &bDefault){ return GetParamStr(OGRSTBrushId,bDefault);} void SetId(const char *pszId){SetParamStr(OGRSTBrushId,pszId);} double Angle(GBool &bDefault){return GetParamDbl(OGRSTBrushAngle,bDefault);} void SetAngle(double dfAngle){SetParamDbl(OGRSTBrushAngle,dfAngle );} double Size(GBool &bDefault){return GetParamDbl(OGRSTBrushSize,bDefault);} void SetSize(double dfSize){SetParamDbl(OGRSTBrushSize,dfSize );} double SpacingX(GBool &bDefault){return GetParamDbl(OGRSTBrushDx,bDefault);} void SetSpacingX(double dfX){SetParamDbl(OGRSTBrushDx,dfX );} double SpacingY(GBool &bDefault){return GetParamDbl(OGRSTBrushDy,bDefault);} void SetSpacingY(double dfY){SetParamDbl(OGRSTBrushDy,dfY );} int Priority(GBool &bDefault){ return GetParamNum(OGRSTBrushPriority,bDefault);} void SetPriority(int nPriority){ SetParamNum(OGRSTBrushPriority,nPriority);} /*****************************************************************/ const char *GetParamStr(OGRSTBrushParam eParam, GBool &bValueIsNull); int GetParamNum(OGRSTBrushParam eParam,GBool &bValueIsNull); double GetParamDbl(OGRSTBrushParam eParam,GBool &bValueIsNull); void SetParamStr(OGRSTBrushParam eParam, const char *pszParamString); void SetParamNum(OGRSTBrushParam eParam, int nParam); void SetParamDbl(OGRSTBrushParam eParam, double dfParam); const char *GetStyleString() override; }; /** * This class represents a style symbol */ class CPL_DLL OGRStyleSymbol : public OGRStyleTool { private: OGRStyleValue *m_pasStyleValue; GBool Parse() override; CPL_DISALLOW_COPY_ASSIGN(OGRStyleSymbol) public: OGRStyleSymbol(); ~OGRStyleSymbol() override; /*****************************************************************/ /* Explicit fct for all parameters defined in the Drawing tools */ /*****************************************************************/ const char *Id(GBool &bDefault){return GetParamStr(OGRSTSymbolId,bDefault);} void SetId(const char *pszId){ SetParamStr(OGRSTSymbolId,pszId);} double Angle(GBool &bDefault){ return GetParamDbl(OGRSTSymbolAngle,bDefault);} void SetAngle(double dfAngle){SetParamDbl(OGRSTSymbolAngle,dfAngle );} const char *Color(GBool &bDefault){return GetParamStr(OGRSTSymbolColor,bDefault);} void SetColor(const char *pszColor){SetParamStr(OGRSTSymbolColor,pszColor);} double Size(GBool &bDefault){ return GetParamDbl(OGRSTSymbolSize,bDefault);} void SetSize(double dfSize){ SetParamDbl(OGRSTSymbolSize,dfSize );} double SpacingX(GBool &bDefault){return GetParamDbl(OGRSTSymbolDx,bDefault);} void SetSpacingX(double dfX){SetParamDbl(OGRSTSymbolDx,dfX );} double SpacingY(GBool &bDefault){return GetParamDbl(OGRSTSymbolDy,bDefault);} void SetSpacingY(double dfY){SetParamDbl(OGRSTSymbolDy,dfY );} double Step(GBool &bDefault){return GetParamDbl(OGRSTSymbolStep,bDefault);} void SetStep(double dfStep){SetParamDbl(OGRSTSymbolStep,dfStep );} double Offset(GBool &bDefault){return GetParamDbl(OGRSTSymbolOffset,bDefault);} void SetOffset(double dfOffset){SetParamDbl(OGRSTSymbolOffset,dfOffset );} double Perp(GBool &bDefault){return GetParamDbl(OGRSTSymbolPerp,bDefault);} void SetPerp(double dfPerp){SetParamDbl(OGRSTSymbolPerp,dfPerp );} int Priority(GBool &bDefault){return GetParamNum(OGRSTSymbolPriority,bDefault);} void SetPriority(int nPriority){SetParamNum(OGRSTSymbolPriority,nPriority);} const char *FontName(GBool &bDefault) {return GetParamStr(OGRSTSymbolFontName,bDefault);} void SetFontName(const char *pszFontName) {SetParamStr(OGRSTSymbolFontName,pszFontName);} const char *OColor(GBool &bDefault){return GetParamStr(OGRSTSymbolOColor,bDefault);} void SetOColor(const char *pszColor){SetParamStr(OGRSTSymbolOColor,pszColor);} /*****************************************************************/ const char *GetParamStr(OGRSTSymbolParam eParam, GBool &bValueIsNull); int GetParamNum(OGRSTSymbolParam eParam,GBool &bValueIsNull); double GetParamDbl(OGRSTSymbolParam eParam,GBool &bValueIsNull); void SetParamStr(OGRSTSymbolParam eParam, const char *pszParamString); void SetParamNum(OGRSTSymbolParam eParam, int nParam); void SetParamDbl(OGRSTSymbolParam eParam, double dfParam); const char *GetStyleString() override; }; /** * This class represents a style label */ class CPL_DLL OGRStyleLabel : public OGRStyleTool { private: OGRStyleValue *m_pasStyleValue; GBool Parse() override; CPL_DISALLOW_COPY_ASSIGN(OGRStyleLabel) public: OGRStyleLabel(); ~OGRStyleLabel() override; /*****************************************************************/ /* Explicit fct for all parameters defined in the Drawing tools */ /*****************************************************************/ const char *FontName(GBool &bDefault){return GetParamStr(OGRSTLabelFontName,bDefault);} void SetFontName(const char *pszFontName){SetParamStr(OGRSTLabelFontName,pszFontName);} double Size(GBool &bDefault){return GetParamDbl(OGRSTLabelSize,bDefault);} void SetSize(double dfSize){SetParamDbl(OGRSTLabelSize,dfSize);} const char *TextString(GBool &bDefault){return GetParamStr(OGRSTLabelTextString,bDefault);} void SetTextString(const char *pszTextString){SetParamStr(OGRSTLabelTextString,pszTextString);} double Angle(GBool &bDefault){return GetParamDbl(OGRSTLabelAngle,bDefault);} void SetAngle(double dfAngle){SetParamDbl(OGRSTLabelAngle,dfAngle);} const char *ForeColor(GBool &bDefault){return GetParamStr(OGRSTLabelFColor,bDefault);} void SetForColor(const char *pszForColor){SetParamStr(OGRSTLabelFColor,pszForColor);} const char *BackColor(GBool &bDefault){return GetParamStr(OGRSTLabelBColor,bDefault);} void SetBackColor(const char *pszBackColor){SetParamStr(OGRSTLabelBColor,pszBackColor);} const char *Placement(GBool &bDefault){return GetParamStr(OGRSTLabelPlacement,bDefault);} void SetPlacement(const char *pszPlacement){SetParamStr(OGRSTLabelPlacement,pszPlacement);} int Anchor(GBool &bDefault){return GetParamNum(OGRSTLabelAnchor,bDefault);} void SetAnchor(int nAnchor){SetParamNum(OGRSTLabelAnchor,nAnchor);} double SpacingX(GBool &bDefault){return GetParamDbl(OGRSTLabelDx,bDefault);} void SetSpacingX(double dfX){SetParamDbl(OGRSTLabelDx,dfX);} double SpacingY(GBool &bDefault){return GetParamDbl(OGRSTLabelDy,bDefault);} void SetSpacingY(double dfY){SetParamDbl(OGRSTLabelDy,dfY);} double Perp(GBool &bDefault){return GetParamDbl(OGRSTLabelPerp,bDefault);} void SetPerp(double dfPerp){SetParamDbl(OGRSTLabelPerp,dfPerp);} GBool Bold(GBool &bDefault){return GetParamNum(OGRSTLabelBold,bDefault);} void SetBold(GBool bBold){SetParamNum(OGRSTLabelBold,bBold);} GBool Italic(GBool &bDefault){return GetParamNum(OGRSTLabelItalic,bDefault);} void SetItalic(GBool bItalic){SetParamNum(OGRSTLabelItalic,bItalic);} GBool Underline(GBool &bDefault){return GetParamNum(OGRSTLabelUnderline,bDefault);} void SetUnderline(GBool bUnderline){SetParamNum(OGRSTLabelUnderline,bUnderline);} int Priority(GBool &bDefault){return GetParamNum(OGRSTLabelPriority,bDefault);} void SetPriority(int nPriority){SetParamNum(OGRSTLabelPriority,nPriority);} GBool Strikeout(GBool &bDefault){return GetParamNum(OGRSTLabelStrikeout,bDefault);} void SetStrikeout(GBool bStrikeout){SetParamNum(OGRSTLabelStrikeout,bStrikeout);} double Stretch(GBool &bDefault){return GetParamDbl(OGRSTLabelStretch,bDefault);} void SetStretch(double dfStretch){SetParamDbl(OGRSTLabelStretch,dfStretch);} const char *ShadowColor(GBool &bDefault){return GetParamStr(OGRSTLabelHColor,bDefault);} void SetShadowColor(const char *pszShadowColor){SetParamStr(OGRSTLabelHColor,pszShadowColor);} const char *OutlineColor(GBool &bDefault){return GetParamStr(OGRSTLabelOColor,bDefault);} void SetOutlineColor(const char *pszOutlineColor){SetParamStr(OGRSTLabelOColor,pszOutlineColor);} /*****************************************************************/ const char *GetParamStr(OGRSTLabelParam eParam, GBool &bValueIsNull); int GetParamNum(OGRSTLabelParam eParam,GBool &bValueIsNull); double GetParamDbl(OGRSTLabelParam eParam,GBool &bValueIsNull); void SetParamStr(OGRSTLabelParam eParam, const char *pszParamString); void SetParamNum(OGRSTLabelParam eParam, int nParam); void SetParamDbl(OGRSTLabelParam eParam, double dfParam); const char *GetStyleString() override; }; //! @endcond #endif /* OGR_FEATURESTYLE_INCLUDE */