1 /*  NAME:
2         E3Main.h
3 
4     DESCRIPTION:
5         Header file for E3Main.c.
6 
7     COPYRIGHT:
8         Copyright (c) 1999-2004, Quesa Developers. All rights reserved.
9 
10         For the current release of Quesa, please see:
11 
12             <http://www.quesa.org/>
13 
14         Redistribution and use in source and binary forms, with or without
15         modification, are permitted provided that the following conditions
16         are met:
17 
18             o Redistributions of source code must retain the above copyright
19               notice, this list of conditions and the following disclaimer.
20 
21             o Redistributions in binary form must reproduce the above
22               copyright notice, this list of conditions and the following
23               disclaimer in the documentation and/or other materials provided
24               with the distribution.
25 
26             o Neither the name of Quesa nor the names of its contributors
27               may be used to endorse or promote products derived from this
28               software without specific prior written permission.
29 
30         THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31         "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32         LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
33         A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
34         OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35         SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
36         TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
37         PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
38         LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
39         NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
40         SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41     ___________________________________________________________________________
42 */
43 #ifndef E3MAIN_HDR
44 #define E3MAIN_HDR
45 //=============================================================================
46 //      Include files
47 //-----------------------------------------------------------------------------
48 // Include files go here
49 
50 #include <new>
51 
52 
53 #include "E3Memory.h"
54 
55 
56 //=============================================================================
57 //		C++ preamble
58 //-----------------------------------------------------------------------------
59 #ifdef __cplusplus
60 extern "C" {
61 #endif
62 
63 
64 
65 
66 //=============================================================================
67 //      Constants
68 //-----------------------------------------------------------------------------
69 enum
70 	{
71     kQ3XMethodTypeNewObjectClass           = Q3_METHOD_TYPE('n', 'e', 'w', 'c')
72 	};
73 
74 
75 //=============================================================================
76 //      Macros
77 //-----------------------------------------------------------------------------
78 
79 #define Q3_CLASS_ENUMS(_type, _class, _parentClass) 			\
80 public :														\
81 	enum														\
82 		{														\
83 		eClassDepth = _parentClass::eClassDepth + 1 ,			\
84 		eClassType = _type ,									\
85 		eParentType = _parentClass::eClassType					\
86 		} ;														\
87 private :
88 
89 
90 
91 #define Q3_CLASS_INFO_IS_CLASS(_classInfo, _class) ((_classInfo)->IsClass ( _class::eClassType, _class::eClassDepth ))
92 #define Q3_OBJECT_IS_CLASS(_object, _class) ((_object)->IsClass ( _class::eClassType, _class::eClassDepth ))
93 
94 
95 #define Q3_REGISTER_CLASS(_Name, _metaHandler, _instanceClass )								\
96 	E3ClassTree::RegisterClass	( _instanceClass::eParentType,								\
97 								_instanceClass::eClassType,									\
98 								_Name,														\
99 								_metaHandler,												\
100 								sizeof ( _instanceClass )									\
101 								)
102 
103 //=============================================================================
104 //      Types
105 //-----------------------------------------------------------------------------
106 
107 
108 
109 class E3Root : public E3ClassInfo
110 	{
111 	const TQ3XObjectDisposeMethod			disposeMethod ;
112 	const TQ3XObjectNewMethod				newMethod ;
113 	const TQ3XObjectDeleteMethod			deleteMethod ;
114 	const TQ3XObjectDuplicateMethod			duplicateMethod ;
115 
116 public :
117 
118 	const TQ3XObjectSubmitMethod			submitRenderMethod ; // Used in attributes and geometry so must be at this level
119 	const TQ3XObjectSubmitMethod			submitPickMethod ; // Used in attributes and geometry so must be at this level
120 	const TQ3XObjectSubmitMethod			submitBoundsMethod ; // Used in attributes and geometry so must be at this level
121 	const TQ3XObjectSubmitMethod			submitWriteMethod ; // Used in elements and shared so must be at this level
122 
123 
124 									E3Root	(
125 											TQ3XMetaHandler	newClassMetaHandler,
126 											E3ClassInfo*	newParent
127 			 								) ; // constructor
128 
129 	friend struct OpaqueTQ3Object ;
130 	} ;
131 
132 
133 
134 class E3SharedInfo : public E3Root
135 	{
136 /*	TQ3XObjectDisposeMethod			disposeMethod ;
137 	TQ3XObjectNewMethod				newMethod ;
138 	TQ3XObjectDeleteMethod			deleteMethod ;
139 	TQ3XObjectDuplicateMethod		duplicateMethod ;*/
140 
141 public :
142 
143 									E3SharedInfo	(
144 											TQ3XMetaHandler	newClassMetaHandler,
145 											E3ClassInfo*	newParent
146 			 								) ; // constructor
147 	} ;
148 
149 
150 
151 
152 class E3ShapeInfo : public E3SharedInfo
153 	{
154 /*	TQ3XObjectDisposeMethod			disposeMethod ;
155 	TQ3XObjectNewMethod				newMethod ;
156 	TQ3XObjectDeleteMethod			deleteMethod ;
157 	TQ3XObjectDuplicateMethod		duplicateMethod ;*/
158 
159 public :
160 
161 									E3ShapeInfo	(
162 											TQ3XMetaHandler	newClassMetaHandler,
163 											E3ClassInfo*	newParent
164 			 								) ; // constructor
165 	} ;
166 
167 
168 
169 
170 // root object data
171 struct OpaqueTQ3Object
172 	{
173 	enum
174 		{
175 		eClassDepth = 0 ,
176 		eClassType = kQ3ObjectTypeRoot
177 		} ;
178 private :
179 
180 	TQ3ObjectType				quesaTag ;
181 	E3ClassInfoPtr				theClass ;
182 	TQ3SetObject				theSet ;
183 
184 #if Q3_DEBUG
185 	TQ3Object					prev ;
186 	TQ3Object					next ;
187 	struct TQ3StackCrawlRec*	stackCrawl ;
188 friend TQ3Status E3Memory_ForgetRecording ( void ) ;
189 friend TQ3Uns32 E3Memory_CountRecords ( void ) ;
190 friend TQ3Object E3Memory_NextRecordedObject ( TQ3Object inObject ) ;
191 friend TQ3Status E3Memory_DumpRecording ( const char* fileName, const char* memo ) ;
192 #endif
193 
194 
195 // Private methods :
196 
197 	void						Verify () ;
198 	TQ3Status					InitialiseInstanceData (	E3ClassInfoPtr	theClass ,
199 															TQ3Boolean		sharedParams ,
200 												   			const void		*paramData ) ;
201 	void						DeleteInstanceData ( E3ClassInfoPtr	theClass ) ;
202 	TQ3Status					DuplicateInstanceData ( TQ3Object		newObject ,
203 														E3ClassInfoPtr	theClass ) ;
204 
205 
206 
207 public :
208 
209 
210 	TQ3Status					Dispose ( void ) ;
211 	void						DestroyInstance ( void ) ;
212 	TQ3Object					DuplicateInstance ( void ) ;
213 	void*						FindLeafInstanceData ( void ) ;
214 	TQ3ObjectType				GetObjectType ( TQ3ObjectType baseType ) ;
GetLeafTypeOpaqueTQ3Object215 	TQ3ObjectType				GetLeafType ( void ) { return GetClass ()->GetType () ; }
216 	TQ3Object					GetLeafObject ( void ) ;
IsObjectValidOpaqueTQ3Object217 	TQ3Boolean					IsObjectValid ( void ) { return (TQ3Boolean) ( quesaTag == kQ3ObjectTypeQuesa ) ; }
IsClassOpaqueTQ3Object218 	TQ3Boolean					IsClass ( TQ3ObjectType queryClass, TQ3Int32 queryDepth )
219 												{ return (TQ3Boolean) ( theClass->ownAndParentTypes [ queryDepth ] == queryClass ) ; }
220 
221 
222 	// Locate a class
223 	E3ClassInfoPtr				GetClass ( void ) ;
224 	TQ3XFunctionPointer 		GetMethod ( TQ3XMethodType methodType ) ;
225 
226 
227 
228 	TQ3Status  					AddElement ( TQ3ElementType theType, const void *theData ) ;
229 	TQ3Status					GetElement ( TQ3ElementType theType, void *theData ) ;
230 	TQ3Boolean					ContainsElement ( TQ3ElementType theType ) ;
231 	TQ3Status					GetNextElementType ( TQ3ElementType *theType ) ;
232 	TQ3Status					EmptyElements ( void ) ;
233 	TQ3Status					ClearElement ( TQ3ElementType theType )	;
234 	TQ3Status					GetSet ( TQ3SetObject *set ) ;
235 	TQ3Status					SetSet ( TQ3SetObject set ) ;
236 	TQ3Status					SubmitElements ( TQ3ViewObject inView ) ;
237 
238 
239 	friend class E3ClassTree ;
240 	friend class E3ClassInfo ;
241 	friend TQ3Status			e3root_new ( TQ3Object theObject, void *privateData, void *paramData ) ;
242 	friend TQ3Status			e3root_duplicate ( TQ3Object fromObject, const void *fromPrivateData, TQ3Object toObject, void *toPrivateData) ;
243 	friend void					e3root_delete ( TQ3Object theObject, void *privateData ) ;
244 	} ;
245 
246 
247 
248 // Shared object data
249 class E3Shared : public OpaqueTQ3Object
250 	{
251 Q3_CLASS_ENUMS ( kQ3ObjectTypeShared, E3Shared, OpaqueTQ3Object )
252 	TQ3Uns32		refCount;
253 	TQ3Uns32		editIndex;
254 
255 	friend TQ3Status	e3shared_new ( E3Shared* theObject, void *privateData, void *paramData ) ;
256 	friend void			e3shared_dispose ( E3Shared* theObject ) ;
257 	friend TQ3Status	e3shared_duplicate (	TQ3Object fromObject,
258 												const void *fromPrivateData,
259 						 						TQ3Object toObject,
260 						 						void *toPrivateData ) ;
261 
262 public :
263 
264 
265 	E3Shared*			GetReference ( void ) ;
266 	TQ3Boolean			IsReferenced ( void ) ;
267 	TQ3Uns32			GetReferenceCount ( void ) ;
268 	TQ3Uns32			GetEditIndex ( void ) ;
269 	TQ3Status			Edited ( void ) ;
270 	} ;
271 
272 
273 
274 class E3Shape : public E3Shared
275 	{
276 Q3_CLASS_ENUMS ( kQ3SharedTypeShape, E3Shape, E3Shared )
277 	// Currently empty
278 	} ;
279 
280 
281 
282 
283 
284 //=============================================================================
285 //      Function prototypes
286 //-----------------------------------------------------------------------------
287 TQ3Status			E3Initialize(void);
288 TQ3Status			E3Exit(void);
289 TQ3Boolean			E3IsInitialized(void);
290 TQ3Status			E3GetVersion(TQ3Uns32 *majorRevision, TQ3Uns32 *minorRevision);
291 TQ3Status			E3GetReleaseVersion(TQ3Uns32 *releaseRevision);
292 
293 TQ3Status			E3ObjectHierarchy_GetTypeFromString(const TQ3ObjectClassNameString objectClassString, TQ3ObjectType *objectClassType);
294 TQ3Status			E3ObjectHierarchy_GetStringFromType(TQ3ObjectType objectClassType, TQ3ObjectClassNameString objectClassString);
295 TQ3Boolean			E3ObjectHierarchy_IsTypeRegistered(TQ3ObjectType objectClassType);
296 TQ3Boolean			E3ObjectHierarchy_IsNameRegistered(const char *objectClassName);
297 TQ3Status			E3ObjectHierarchy_GetSubClassData(TQ3ObjectType objectClassType, TQ3SubClassData *subClassData);
298 TQ3Status			E3ObjectHierarchy_EmptySubClassData(TQ3SubClassData *subClassData);
299 
300 TQ3Status			E3Object_CleanDispose(TQ3Object *object);
301 TQ3Object			E3Object_Duplicate(TQ3Object theObject);
302 TQ3Status			E3Object_Submit(TQ3Object theObject, TQ3ViewObject theView);
303 TQ3Boolean			E3Object_IsDrawable(TQ3Object theObject);
304 TQ3Boolean			E3Object_IsWritable(TQ3Object theObject, TQ3FileObject theFile);
305 TQ3ObjectType		E3Object_GetType(TQ3Object theObject);
306 TQ3Boolean			E3Object_IsType(TQ3Object theObject, TQ3ObjectType theType);
307 
308 TQ3Boolean			E3Shared_IsOfMyClass ( TQ3Object object ) ;
309 TQ3ObjectType		E3Shared_GetType(TQ3SharedObject sharedObject);
E3Shared_Edited(TQ3SharedObject sharedObject)310 inline TQ3Status	E3Shared_Edited ( TQ3SharedObject sharedObject )
311 	{ return ( (E3Shared*) sharedObject )->Edited () ; }
312 
313 TQ3Boolean			E3Shape_IsOfMyClass ( TQ3Object object ) ;
314 TQ3ObjectType		E3Shape_GetType(TQ3ShapeObject theShape);
315 TQ3Status			E3Shape_GetSet(TQ3ShapeObject theShape, TQ3SetObject *theSet);
316 TQ3Status			E3Shape_SetSet(TQ3ShapeObject theShape, TQ3SetObject theSet);
E3Shape_SubmitElements(TQ3ShapeObject inShape,TQ3ViewObject inView)317 inline TQ3Status	E3Shape_SubmitElements( TQ3ShapeObject inShape, TQ3ViewObject inView )
318 	{ return inShape->SubmitElements ( inView ) ; }
319 
320 TQ3Status			E3Bitmap_Empty(TQ3Bitmap *theBitmap);
321 TQ3Uns32			E3Bitmap_GetImageSize(TQ3Uns32 theWidth, TQ3Uns32 theHeight);
322 TQ3Boolean			E3Bitmap_GetBit(const TQ3Bitmap *theBitmap, TQ3Uns32 x, TQ3Uns32 y);
323 TQ3Status			E3Bitmap_SetBit(TQ3Bitmap *theBitmap, TQ3Uns32 x, TQ3Uns32 y, TQ3Boolean theState);
324 
325 
326 
327 
328 
329 //=============================================================================
330 //		C++ postamble
331 //-----------------------------------------------------------------------------
332 #ifdef __cplusplus
333 }
334 #endif
335 
336 #endif
337 
338