/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef _GI_ABSTRACT_CLIP_BOUNDARY_H_INCLUDED_ #define _GI_ABSTRACT_CLIP_BOUNDARY_H_INCLUDED_ #include "TD_PackPush.h" #include "GiClipBoundary.h" #include "IntArray.h" /** \details Base class for pass additional clip boundary information from OdGiDrawable objects to the underlying OdGi system. Library: TD_Gi */ class OdGiAbstractClipBoundary { public: enum BoundaryType { kNormal = 0, // Default clip boundary (not pass additional data, clip outside contour) kInverted, // Inverted clip boundary (pass inverted clip array, clip inside contour) kExtended, // Extended clip boundary (pass clipping contours, clip by sorted contours array) kComplex // Complex clip boundary (extended clip boundary which requires additional preprocessing) }; public: ODRX_HEAP_OPERATORS(); OdGiAbstractClipBoundary() { } virtual ~OdGiAbstractClipBoundary() { } /** \details Returns type of the inherited boundary. */ virtual BoundaryType type() const { return kNormal; } /** \details Returns cloned object. */ virtual OdGiAbstractClipBoundary *clone() const { return new OdGiAbstractClipBoundary(); } }; /** \details Class to pass inverted clip boundary information from OdGiDrawable objects to the underlying OdGi system. Library: TD_Gi */ class OdGiInvertedClipBoundary : public OdGiAbstractClipBoundary { protected: OdGePoint2dArray m_Points; // Array of points that defines the inverted clip boundary. public: OdGiInvertedClipBoundary() { } ~OdGiInvertedClipBoundary() { } /** \details Returns type of the inherited boundary. */ BoundaryType type() const { return kInverted; } /** \details Returns inverted clipping boundary. */ const OdGePoint2dArray &invertedClipBoundary() const { return m_Points; } /** \details Setup inverted clipping boundary. \param pPoints [in] Input points array. */ void setInvertedClipBoundary(const OdGePoint2dArray &pPoints) { m_Points = pPoints; } /** \details Returns cloned object. */ OdGiAbstractClipBoundary *clone() const { OdGiInvertedClipBoundary *pNew = new OdGiInvertedClipBoundary(); pNew->setInvertedClipBoundary(invertedClipBoundary()); return pNew; } }; /** \details Class to pass extended clip boundary information from OdGiDrawable objects to the underlying OdGi system. Library: TD_Gi */ class OdGiExtendedClipBoundary : public OdGiAbstractClipBoundary { protected: OdIntArray m_Counts; // Array of contour points counts OdGePoint2dArray m_Points; // Array of points that defines the extended clip boundary contours. public: OdGiExtendedClipBoundary() { } ~OdGiExtendedClipBoundary() { } /** \details Returns type of the inherited boundary. */ BoundaryType type() const { return kExtended; } /** \details Returns extended clipping boundary contour vertices counts. */ const OdIntArray &clipBoundaryCounts() const { return m_Counts; } /** \details Setup inverted extended boundary contour vertices counts. \param pCounts [in] Input counts array. */ void setClipBoundaryCounts(const OdIntArray &pCounts) { m_Counts = pCounts; } /** \details Returns extended clipping boundary points. */ const OdGePoint2dArray &clipBoundaryPoints() const { return m_Points; } /** \details Setup extended clipping boundary points. \param pPoints [in] Input points array. */ void setClipBoundaryPoints(const OdGePoint2dArray &pPoints) { m_Points = pPoints; } /** \details Returns cloned object. */ OdGiAbstractClipBoundary *clone() const { return copyExtendedData(new OdGiExtendedClipBoundary()); } protected: OdGiAbstractClipBoundary *copyExtendedData(OdGiExtendedClipBoundary *pNew) const { pNew->setClipBoundaryCounts(clipBoundaryCounts()); pNew->setClipBoundaryPoints(clipBoundaryPoints()); return pNew; } }; /** \details Class to pass extended clip boundary information which requires preprocessing from OdGiDrawable objects to the underlying OdGi system. Library: TD_Gi */ class OdGiComplexClipBoundary : public OdGiExtendedClipBoundary { public: OdGiComplexClipBoundary() { } ~OdGiComplexClipBoundary() { } /** \details Returns type of the inherited boundary. */ BoundaryType type() const { return kComplex; } /** \details Returns cloned object. */ OdGiAbstractClipBoundary *clone() const { return copyExtendedData(new OdGiComplexClipBoundary()); } }; /** \details Container for OdGiClipBoundary and OdGiAbstractClipBoundary. Library: TD_Gi */ struct OdGiClipBoundaryWithAbstractData : public OdGiClipBoundary { OdGiAbstractClipBoundary *m_pAbstractData; OdGiClipBoundaryWithAbstractData() : m_pAbstractData(NULL) { } OdGiClipBoundaryWithAbstractData(const OdGiClipBoundary &pBoundary, const OdGiAbstractClipBoundary *pAbsData = NULL) : OdGiClipBoundary(pBoundary), m_pAbstractData(NULL) { if (pAbsData) m_pAbstractData = pAbsData->clone(); } OdGiClipBoundaryWithAbstractData(const OdGiClipBoundaryWithAbstractData &pBoundary) : OdGiClipBoundary(pBoundary), m_pAbstractData(NULL) { if (pBoundary.m_pAbstractData) m_pAbstractData = pBoundary.m_pAbstractData->clone(); } ~OdGiClipBoundaryWithAbstractData() { if (m_pAbstractData) delete m_pAbstractData; } }; #include "TD_PackPop.h" #endif // _GI_ABSTRACT_CLIP_BOUNDARY_H_INCLUDED_