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