xref: /aoo4110/main/sd/source/filter/eppt/escherex.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sd.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #ifndef _PptEscherEx_HXX
29*b1cdbd2cSJim Jagielski #include "escherex.hxx"
30*b1cdbd2cSJim Jagielski #endif
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
33*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
34*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
35*b1cdbd2cSJim Jagielski 
PptEscherEx(SvStream & rOutStrm,const rtl::OUString & rBaseURI)36*b1cdbd2cSJim Jagielski PptEscherEx::PptEscherEx( SvStream& rOutStrm, const rtl::OUString& rBaseURI ) :
37*b1cdbd2cSJim Jagielski     EscherEx( EscherExGlobalRef( new EscherExGlobal ), rOutStrm )
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski 	mxGlobal->SetBaseURI( rBaseURI );
40*b1cdbd2cSJim Jagielski 	mnCurrentDg	= 0;
41*b1cdbd2cSJim Jagielski }
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
44*b1cdbd2cSJim Jagielski 
DrawingGroupContainerSize()45*b1cdbd2cSJim Jagielski sal_uInt32 PptEscherEx::DrawingGroupContainerSize()
46*b1cdbd2cSJim Jagielski {
47*b1cdbd2cSJim Jagielski 	return ImplDggContainerSize() + 8;
48*b1cdbd2cSJim Jagielski }
49*b1cdbd2cSJim Jagielski 
WriteDrawingGroupContainer(SvStream & rSt)50*b1cdbd2cSJim Jagielski void PptEscherEx::WriteDrawingGroupContainer( SvStream& rSt )
51*b1cdbd2cSJim Jagielski {
52*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = DrawingGroupContainerSize();
53*b1cdbd2cSJim Jagielski 	rSt << (sal_uInt32)( 0xf | ( 1035 << 16 ) )		// EPP_PPDrawingGroup
54*b1cdbd2cSJim Jagielski 		<< (sal_uInt32)( nSize - 8 );
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski 	ImplWriteDggContainer( rSt );
57*b1cdbd2cSJim Jagielski }
58*b1cdbd2cSJim Jagielski 
59*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
60*b1cdbd2cSJim Jagielski 
ImplDggContainerSize()61*b1cdbd2cSJim Jagielski sal_uInt32 PptEscherEx::ImplDggContainerSize()
62*b1cdbd2cSJim Jagielski {
63*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize;
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski     nSize  = mxGlobal->GetDggAtomSize();
66*b1cdbd2cSJim Jagielski     nSize += mxGlobal->GetBlibStoreContainerSize();
67*b1cdbd2cSJim Jagielski 	nSize += ImplOptAtomSize();
68*b1cdbd2cSJim Jagielski 	nSize += ImplSplitMenuColorsAtomSize();
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 	return nSize + 8;
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski 
ImplWriteDggContainer(SvStream & rSt)73*b1cdbd2cSJim Jagielski void PptEscherEx::ImplWriteDggContainer( SvStream& rSt )
74*b1cdbd2cSJim Jagielski {
75*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = ImplDggContainerSize();
76*b1cdbd2cSJim Jagielski 	if ( nSize )
77*b1cdbd2cSJim Jagielski 	{
78*b1cdbd2cSJim Jagielski 		rSt << (sal_uInt32)( 0xf | ( ESCHER_DggContainer << 16 ) )
79*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)( nSize - 8 );
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski         mxGlobal->SetDggContainer();
82*b1cdbd2cSJim Jagielski         mxGlobal->WriteDggAtom( rSt );
83*b1cdbd2cSJim Jagielski         mxGlobal->WriteBlibStoreContainer( rSt );
84*b1cdbd2cSJim Jagielski 		ImplWriteOptAtom( rSt );
85*b1cdbd2cSJim Jagielski 		ImplWriteSplitMenuColorsAtom( rSt );
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski #define ESCHER_OPT_COUNT 6
92*b1cdbd2cSJim Jagielski 
ImplOptAtomSize()93*b1cdbd2cSJim Jagielski sal_uInt32 PptEscherEx::ImplOptAtomSize()
94*b1cdbd2cSJim Jagielski {
95*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = 0;
96*b1cdbd2cSJim Jagielski 	if ( ESCHER_OPT_COUNT )
97*b1cdbd2cSJim Jagielski 		nSize = ( ESCHER_OPT_COUNT * 6 ) + 8;
98*b1cdbd2cSJim Jagielski 	return nSize;
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
ImplWriteOptAtom(SvStream & rSt)101*b1cdbd2cSJim Jagielski void PptEscherEx::ImplWriteOptAtom( SvStream& rSt )
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = ImplOptAtomSize();
104*b1cdbd2cSJim Jagielski 	if ( nSize )
105*b1cdbd2cSJim Jagielski 	{
106*b1cdbd2cSJim Jagielski 		rSt << (sal_uInt32)( ( ESCHER_OPT << 16 ) | ( ESCHER_OPT_COUNT << 4 ) | 0x3 )
107*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)( nSize - 8 )
108*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_fillColor			<< (sal_uInt32)0xffb800
109*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_fillBackColor		<< (sal_uInt32)0
110*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_fNoFillHitTest		<< (sal_uInt32)0x00100010
111*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_lineColor			<< (sal_uInt32)0x8000001
112*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_fNoLineDrawDash		<< (sal_uInt32)0x00080008
113*b1cdbd2cSJim Jagielski 			<< (sal_uInt16)ESCHER_Prop_shadowColor			<< (sal_uInt32)0x8000002;
114*b1cdbd2cSJim Jagielski 	}
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski #define ESCHER_SPLIT_MENU_COLORS_COUNT	4
120*b1cdbd2cSJim Jagielski 
ImplSplitMenuColorsAtomSize()121*b1cdbd2cSJim Jagielski sal_uInt32 PptEscherEx::ImplSplitMenuColorsAtomSize()
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = 0;
124*b1cdbd2cSJim Jagielski 	if ( ESCHER_SPLIT_MENU_COLORS_COUNT )
125*b1cdbd2cSJim Jagielski 		nSize = ( ESCHER_SPLIT_MENU_COLORS_COUNT << 2 ) + 8;
126*b1cdbd2cSJim Jagielski 	return nSize;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
ImplWriteSplitMenuColorsAtom(SvStream & rSt)129*b1cdbd2cSJim Jagielski void PptEscherEx::ImplWriteSplitMenuColorsAtom( SvStream& rSt )
130*b1cdbd2cSJim Jagielski {
131*b1cdbd2cSJim Jagielski 	sal_uInt32 nSize = ImplSplitMenuColorsAtomSize();
132*b1cdbd2cSJim Jagielski 	if ( nSize )
133*b1cdbd2cSJim Jagielski 	{
134*b1cdbd2cSJim Jagielski 		rSt << (sal_uInt32)( ( ESCHER_SplitMenuColors << 16 ) | ( ESCHER_SPLIT_MENU_COLORS_COUNT << 4 ) )
135*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)( nSize - 8 )
136*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)0x08000004
137*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)0x08000001
138*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)0x08000002
139*b1cdbd2cSJim Jagielski 			<< (sal_uInt32)0x100000f7;
140*b1cdbd2cSJim Jagielski 	}
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski }
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
145*b1cdbd2cSJim Jagielski 
~PptEscherEx()146*b1cdbd2cSJim Jagielski PptEscherEx::~PptEscherEx()
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
151*b1cdbd2cSJim Jagielski 
OpenContainer(sal_uInt16 n_EscherContainer,int nRecInstance)152*b1cdbd2cSJim Jagielski void PptEscherEx::OpenContainer( sal_uInt16 n_EscherContainer, int nRecInstance )
153*b1cdbd2cSJim Jagielski {
154*b1cdbd2cSJim Jagielski 	*mpOutStrm << (sal_uInt16)( ( nRecInstance << 4 ) | 0xf  ) << n_EscherContainer << (sal_uInt32)0;
155*b1cdbd2cSJim Jagielski 	mOffsets.push_back( mpOutStrm->Tell() - 4 );
156*b1cdbd2cSJim Jagielski 	mRecTypes.push_back( n_EscherContainer );
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski 	switch( n_EscherContainer )
159*b1cdbd2cSJim Jagielski 	{
160*b1cdbd2cSJim Jagielski 		case ESCHER_DgContainer :
161*b1cdbd2cSJim Jagielski 		{
162*b1cdbd2cSJim Jagielski 			if ( !mbEscherDg )
163*b1cdbd2cSJim Jagielski 			{
164*b1cdbd2cSJim Jagielski 				mbEscherDg = sal_True;
165*b1cdbd2cSJim Jagielski                 mnCurrentDg = mxGlobal->GenerateDrawingId();
166*b1cdbd2cSJim Jagielski 				AddAtom( 8, ESCHER_Dg, 0, mnCurrentDg );
167*b1cdbd2cSJim Jagielski 				PtReplaceOrInsert( ESCHER_Persist_Dg | mnCurrentDg, mpOutStrm->Tell() );
168*b1cdbd2cSJim Jagielski 				*mpOutStrm << (sal_uInt32)0		// The number of shapes in this drawing
169*b1cdbd2cSJim Jagielski 						   << (sal_uInt32)0;	// The last MSOSPID given to an SP in this DG
170*b1cdbd2cSJim Jagielski 			}
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 		break;
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 		case ESCHER_SpgrContainer :
175*b1cdbd2cSJim Jagielski 		{
176*b1cdbd2cSJim Jagielski 			if ( mbEscherDg )
177*b1cdbd2cSJim Jagielski 			{
178*b1cdbd2cSJim Jagielski 				mbEscherSpgr = sal_True;
179*b1cdbd2cSJim Jagielski 			}
180*b1cdbd2cSJim Jagielski 		}
181*b1cdbd2cSJim Jagielski 		break;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski 		case ESCHER_SpContainer :
184*b1cdbd2cSJim Jagielski 		{
185*b1cdbd2cSJim Jagielski 		}
186*b1cdbd2cSJim Jagielski 		break;
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 		default:
189*b1cdbd2cSJim Jagielski 		break;
190*b1cdbd2cSJim Jagielski 	}
191*b1cdbd2cSJim Jagielski }
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
194*b1cdbd2cSJim Jagielski 
CloseContainer()195*b1cdbd2cSJim Jagielski void PptEscherEx::CloseContainer()
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	/* SJ: #Issue 26747#
198*b1cdbd2cSJim Jagielski 	   not creating group objects with a depth higher than 16, because then
199*b1cdbd2cSJim Jagielski 	   PPT is having a big performance problem when starting a slide show
200*b1cdbd2cSJim Jagielski 	*/
201*b1cdbd2cSJim Jagielski 	if ( ( mRecTypes.back() != ESCHER_SpgrContainer ) || ( mnGroupLevel < 12 ) )
202*b1cdbd2cSJim Jagielski 	{
203*b1cdbd2cSJim Jagielski 		sal_uInt32 nSize, nPos = mpOutStrm->Tell();
204*b1cdbd2cSJim Jagielski 		nSize = ( nPos - mOffsets.back() ) - 4;
205*b1cdbd2cSJim Jagielski 		mpOutStrm->Seek( mOffsets.back() );
206*b1cdbd2cSJim Jagielski 		*mpOutStrm << nSize;
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 		switch( mRecTypes.back() )
209*b1cdbd2cSJim Jagielski 		{
210*b1cdbd2cSJim Jagielski 			case ESCHER_DgContainer :
211*b1cdbd2cSJim Jagielski 			{
212*b1cdbd2cSJim Jagielski 				if ( mbEscherDg )
213*b1cdbd2cSJim Jagielski 				{
214*b1cdbd2cSJim Jagielski 					mbEscherDg = sal_False;
215*b1cdbd2cSJim Jagielski 					if ( DoSeek( ESCHER_Persist_Dg | mnCurrentDg ) )
216*b1cdbd2cSJim Jagielski                         *mpOutStrm << mxGlobal->GetDrawingShapeCount( mnCurrentDg ) << mxGlobal->GetLastShapeId( mnCurrentDg );
217*b1cdbd2cSJim Jagielski 				}
218*b1cdbd2cSJim Jagielski 			}
219*b1cdbd2cSJim Jagielski 			break;
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski 			case ESCHER_SpgrContainer :
222*b1cdbd2cSJim Jagielski 			{
223*b1cdbd2cSJim Jagielski 				if ( mbEscherSpgr )
224*b1cdbd2cSJim Jagielski 				{
225*b1cdbd2cSJim Jagielski 					mbEscherSpgr = sal_False;
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 				}
228*b1cdbd2cSJim Jagielski 			}
229*b1cdbd2cSJim Jagielski 			break;
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 			default:
232*b1cdbd2cSJim Jagielski 			break;
233*b1cdbd2cSJim Jagielski 		}
234*b1cdbd2cSJim Jagielski 		mOffsets.pop_back();
235*b1cdbd2cSJim Jagielski 		mRecTypes.pop_back();
236*b1cdbd2cSJim Jagielski 		mpOutStrm->Seek( nPos );
237*b1cdbd2cSJim Jagielski 	}
238*b1cdbd2cSJim Jagielski }
239*b1cdbd2cSJim Jagielski 
240*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
241*b1cdbd2cSJim Jagielski 
EnterGroup(Rectangle * pBoundRect,SvMemoryStream * pClientData)242*b1cdbd2cSJim Jagielski sal_uInt32 PptEscherEx::EnterGroup( Rectangle* pBoundRect, SvMemoryStream* pClientData )
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski 	sal_uInt32 nShapeId = 0;
245*b1cdbd2cSJim Jagielski 	/* SJ: #Issue 26747#
246*b1cdbd2cSJim Jagielski 	   not creating group objects with a depth higher than 16, because then
247*b1cdbd2cSJim Jagielski 	   PPT is having a big performance problem when starting a slide show
248*b1cdbd2cSJim Jagielski 	*/
249*b1cdbd2cSJim Jagielski 	if ( mnGroupLevel < 12 )
250*b1cdbd2cSJim Jagielski 	{
251*b1cdbd2cSJim Jagielski 		Rectangle aRect;
252*b1cdbd2cSJim Jagielski 		if ( pBoundRect )
253*b1cdbd2cSJim Jagielski 			aRect = *pBoundRect;
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 		OpenContainer( ESCHER_SpgrContainer );
256*b1cdbd2cSJim Jagielski 		OpenContainer( ESCHER_SpContainer );
257*b1cdbd2cSJim Jagielski 		AddAtom( 16, ESCHER_Spgr, 1 );
258*b1cdbd2cSJim Jagielski 		PtReplaceOrInsert( ESCHER_Persist_Grouping_Snap | mnGroupLevel, mpOutStrm->Tell() );
259*b1cdbd2cSJim Jagielski 		*mpOutStrm	<< (sal_Int32)aRect.Left()	// Bounding box fuer die Gruppierten shapes an die sie attached werden
260*b1cdbd2cSJim Jagielski 					<< (sal_Int32)aRect.Top()
261*b1cdbd2cSJim Jagielski 					<< (sal_Int32)aRect.Right()
262*b1cdbd2cSJim Jagielski 					<< (sal_Int32)aRect.Bottom();
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski         nShapeId = GenerateShapeId();
265*b1cdbd2cSJim Jagielski 		if ( !mnGroupLevel )
266*b1cdbd2cSJim Jagielski 			AddShape( ESCHER_ShpInst_Min, 5, nShapeId );					// Flags: Group | Patriarch
267*b1cdbd2cSJim Jagielski 		else
268*b1cdbd2cSJim Jagielski 		{
269*b1cdbd2cSJim Jagielski 			AddShape( ESCHER_ShpInst_Min, 0x201, nShapeId );				// Flags: Group | HaveAnchor
270*b1cdbd2cSJim Jagielski 			if ( mnGroupLevel == 1 )
271*b1cdbd2cSJim Jagielski 			{
272*b1cdbd2cSJim Jagielski 				AddAtom( 8, ESCHER_ClientAnchor );
273*b1cdbd2cSJim Jagielski 				PtReplaceOrInsert( ESCHER_Persist_Grouping_Logic | mnGroupLevel, mpOutStrm->Tell() );
274*b1cdbd2cSJim Jagielski 				*mpOutStrm << (sal_Int16)aRect.Top() << (sal_Int16)aRect.Left() << (sal_Int16)aRect.Right() << (sal_Int16)aRect.Bottom();
275*b1cdbd2cSJim Jagielski 			}
276*b1cdbd2cSJim Jagielski 			else
277*b1cdbd2cSJim Jagielski 			{
278*b1cdbd2cSJim Jagielski 				AddAtom( 16, ESCHER_ChildAnchor );
279*b1cdbd2cSJim Jagielski 				PtReplaceOrInsert( ESCHER_Persist_Grouping_Snap | mnGroupLevel, mpOutStrm->Tell() );
280*b1cdbd2cSJim Jagielski 				*mpOutStrm  << (sal_Int32)aRect.Left()
281*b1cdbd2cSJim Jagielski 							<< (sal_Int32)aRect.Top()
282*b1cdbd2cSJim Jagielski 							<< (sal_Int32)aRect.Right()
283*b1cdbd2cSJim Jagielski 							<< (sal_Int32)aRect.Bottom();
284*b1cdbd2cSJim Jagielski 			}
285*b1cdbd2cSJim Jagielski 		}
286*b1cdbd2cSJim Jagielski 		if ( pClientData )
287*b1cdbd2cSJim Jagielski 		{
288*b1cdbd2cSJim Jagielski 			pClientData->Seek( STREAM_SEEK_TO_END );
289*b1cdbd2cSJim Jagielski 			sal_uInt32 nSize = pClientData->Tell();
290*b1cdbd2cSJim Jagielski 			if ( nSize )
291*b1cdbd2cSJim Jagielski 			{
292*b1cdbd2cSJim Jagielski 				*mpOutStrm << (sal_uInt32)( ( ESCHER_ClientData << 16 ) | 0xf )
293*b1cdbd2cSJim Jagielski 						<< nSize;
294*b1cdbd2cSJim Jagielski 				mpOutStrm->Write( pClientData->GetData(), nSize );
295*b1cdbd2cSJim Jagielski 			}
296*b1cdbd2cSJim Jagielski 		}
297*b1cdbd2cSJim Jagielski 		CloseContainer();												// ESCHER_SpContainer
298*b1cdbd2cSJim Jagielski 	}
299*b1cdbd2cSJim Jagielski 	mnGroupLevel++;
300*b1cdbd2cSJim Jagielski 	return nShapeId;
301*b1cdbd2cSJim Jagielski }
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski // ---------------------------------------------------------------------------------------------
304