/////////////////////////////////////////////////////////////////////////////// // 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 __OD_GS_LAYER_NODE__ #define __OD_GS_LAYER_NODE__ #include "TD_PackPush.h" #include "Gs/GsNode.h" #include "Gi/GiLayerTraitsData.h" #include "ThreadsCounter.h" #include "GsEmptyMetafileCache.h" #include "OdVector.h" typedef OdVector > OdGiLayerTraitsDataArray; /** */ class GS_TOOLKIT_EXPORT OdGsLayerNode : public OdGsNode { enum { kDirty = OdGsNode::kLastFlag << 1, kVpDep = OdGsNode::kLastFlag << 2, kVpFrozen = OdGsNode::kLastFlag << 3, kLastFlag = kVpFrozen }; /** \details No operation. */ void update(OdGsUpdateContext& ctx, OdGsContainerNode* pParent, OdSiSpatialIndex* pParentIndex); /** \details No operation. */ virtual void display(OdGsDisplayContext& ctx); /** \details No operation. */ bool extents(OdGeExtents3d& ) const; void propagateLayerChanges(OdGsViewImpl& view); OdGiLayerTraitsData m_layerTraits; mutable OdGiLayerTraitsDataArray m_vpLayerTraits; friend class OdGsBaseModel; OdGsLayerNode* m_pNextChanged; public: ODRX_DECLARE_MEMBERS(OdGsLayerNode); /** \param pModel [in] Pointer to the BaseModel object. \param pUnderlyingDrawable [in] Pointer to the underlying Drawable object. */ OdGsLayerNode(OdGsBaseModel* pModel, const OdGiDrawable* pUnderlyingDrawable, bool bSetGsNode = true); ~OdGsLayerNode(); void destroy() {} OdGiLayerTraitsData& layerTraits(OdUInt32 nVpId); const OdGiLayerTraitsData& layerTraits(OdUInt32 nVpId) const; void reserveLayerTraits(OdUInt32 nVpId); bool isDirty() const; void setDirty(bool bDirty); bool isUpToDate(OdUInt32 nVpId) const; bool isValidCache(OdUInt32 nVpId) const; void setCacheUpToDate(OdUInt32 nVpId); bool isInvalidated() const; bool isVpDep() const; virtual ENodeType nodeType() const { return kLayerNode; } inline bool isVpFrozen() const; inline bool isFrozen() const; /** \details No operation. */ void invalidate(OdGsContainerNode* pParent, OdGsViewImpl* pView, OdUInt32 mask); /** \details */ void update(OdGsBaseVectorizer& view); bool isTraitsCompatible(OdUInt32 nVpId1, OdUInt32 nVpId2) const; bool saveNodeState(OdGsFiler *pFiler, OdGsBaseVectorizer *pVectorizer = NULL) const; bool loadNodeState(OdGsFiler *pFiler, OdGsBaseVectorizer *pVectorizer = NULL); private: friend class OdGsEmptyMetafileCache; OdGsEmptyMetafileCache m_emfCache; OdMutexPtr m_mt; }; inline bool OdGsLayerNode::isDirty() const { return GETBIT(m_flags, kDirty); } inline void OdGsLayerNode::setDirty(bool bDirty) { SETBIT(m_flags, kDirty, bDirty); } inline bool OdGsLayerNode::isUpToDate(OdUInt32 nVpId) const { if(isInvalidated()) return false; if(isVpDep()) { if(nVpId > 0 && m_vpLayerTraits.size() < nVpId) return false; return !GETBIT(layerTraits(nVpId).flags(), 0x80000000); } return !GETBIT(layerTraits(0).flags(), 0x80000000); } inline bool OdGsLayerNode::isInvalidated() const { return (m_layerTraits.m_flags == 0xFFFFFFFF) && !m_vpLayerTraits.size(); } inline bool OdGsLayerNode::isVpDep() const { return GETBIT(m_flags, kVpDep); } inline OdGiLayerTraitsData& OdGsLayerNode::layerTraits(OdUInt32 nVpId) { return const_cast(static_cast(this)->layerTraits(nVpId)); } inline const OdGiLayerTraitsData& OdGsLayerNode::layerTraits(OdUInt32 nVpId) const { if(isVpDep() && nVpId > 0) { ODA_ASSERT(m_vpLayerTraits.size() >= nVpId); return m_vpLayerTraits[--nVpId]; } return m_layerTraits; } inline bool OdGsLayerNode::isVpFrozen() const { return GETBIT(m_flags, kVpFrozen); } inline bool OdGsLayerNode::isFrozen() const { return m_layerTraits.isFrozen(); } // Include inline OdGsEmptyMetafileCache methods #ifndef __OD_GS_EMPTY_METAFILE_CACHE_INLINES_INCLUDE__ #define __OD_GS_EMPTY_METAFILE_CACHE_INLINES_INCLUDE__ #include "GsEmptyMetafileCache.h" #endif // #include "TD_PackPop.h" #endif // __OD_GS_LAYER_NODE__