zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/////////////////////////////////////////////////////////////////////////////// 
// 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_EMPTY_METAFILE_CACHE__
#define __OD_GS_EMPTY_METAFILE_CACHE__
 
#include "TD_PackPush.h"
 
#include "Gs/GsEntityNode.h"
#define STL_USING_MAP
#include "OdaSTL.h"
 
class OdGsLayerNode;
 
/** <group OdGs_Classes>
*/
class OdGsEmptyMetafileCache
{
  private:
    typedef std::map<OdUInt32, OdGsEntityNode::MetafilePtr> OdMmap;
    // Global map
    friend class OdGsModuleObject;
    GS_STATIC_EXPORT static OdMmap * s_mfMap;
    GS_STATIC_EXPORT static OdMutex* s_mtMfMap;
    static void rxInit();
    static void rxUninit();
    // Local map
    OdMmap m_mfMap;
  public:
    OdGsEmptyMetafileCache();
 
    static void get(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode *pLayerNode = NULL);
  protected:
    void getLocal(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode &pLayerNode);
    static void getGlobal(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode *pLayerNode);
    static void getImpl(OdGsEntityNode::MetafilePtr &pPtr, OdMmap &mfMap, OdUInt32 flags, OdGsLayerNode *pLayerNode);
};
 
#define ODGS_EMFCACHE_DEFINE_MEMBERS() \
  GS_STATIC_EXPORT OdGsEmptyMetafileCache::OdMmap* OdGsEmptyMetafileCache::s_mfMap = NULL; \
  GS_STATIC_EXPORT                        OdMutex* OdGsEmptyMetafileCache::s_mtMfMap = NULL; \
  void OdGsEmptyMetafileCache::rxInit() \
  { \
    s_mfMap   = new OdMmap(); \
    s_mtMfMap = new OdMutex(); \
  } \
  void OdGsEmptyMetafileCache::rxUninit() \
  { \
    delete s_mfMap;   s_mfMap = NULL; \
    delete s_mtMfMap; s_mtMfMap = NULL; \
  }
 
#include "TD_PackPop.h"
 
#endif // __OD_GS_EMPTY_METAFILE_CACHE__
 
// Inlines
 
#if defined(__OD_GS_EMPTY_METAFILE_CACHE__) && (defined(__OD_GS_EMPTY_METAFILE_CACHE_INLINES_INCLUDE__) || !defined(__OD_GS_LAYER_NODE__))
 
#ifndef __OD_GS_EMPTY_METAFILE_CACHE_INLINES__
#define __OD_GS_EMPTY_METAFILE_CACHE_INLINES__
 
#include "Gs/GsLayerNode.h"
 
inline
OdGsEmptyMetafileCache::OdGsEmptyMetafileCache()
{
}
 
inline
void OdGsEmptyMetafileCache::get(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode *pLayerNode)
{
  if (pLayerNode)
    pLayerNode->m_emfCache.getLocal(pPtr, flags, *pLayerNode);
  else
    getGlobal(pPtr, flags, pLayerNode);
}
 
inline
void OdGsEmptyMetafileCache::getLocal(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode &pLayerNode)
{
  TD_AUTOLOCK_P_DEF(pLayerNode.m_mt);
  getImpl(pPtr, m_mfMap, flags, &pLayerNode);
}
 
inline
void OdGsEmptyMetafileCache::getGlobal(OdGsEntityNode::MetafilePtr &pPtr, OdUInt32 flags, OdGsLayerNode *pLayerNode)
{
  OdMutexPtrAutoLock autoLock(odThreadsCounter() ? s_mtMfMap : NULL);
  getImpl(pPtr, *s_mfMap, flags, pLayerNode);
}
 
inline
void OdGsEmptyMetafileCache::getImpl(OdGsEntityNode::MetafilePtr &pPtr, OdMmap &mfMap, OdUInt32 flags, OdGsLayerNode *pLayerNode)
{
  OdMmap::iterator it = mfMap.find(flags);
  if (it != mfMap.end())
  {
    pPtr = it->second;
    return;
  }
  pPtr = OdGiRxObjectReImpl<OdGsEntityNode::Metafile>::createObject();
  pPtr->m_nAwareFlags = flags;
  pPtr->m_first.m_pLayer = pLayerNode;
  mfMap[flags] = pPtr;
}
 
#endif // __OD_GS_EMPTY_METAFILE_CACHE_INLINES__
 
#endif // defined(__OD_GS_EMPTY_METAFILE_CACHE__) && (defined(__OD_GS_EMPTY_METAFILE_CACHE_INLINES_INCLUDE__) || !defined(__OD_GS_LAYER_NODE__))