1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9f62ea84SAndrew Rist  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9f62ea84SAndrew Rist  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19*9f62ea84SAndrew Rist  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir #include "vcl/pdfextoutdevdata.hxx"
27cdf0e10cSrcweir #include "vcl/graph.hxx"
28cdf0e10cSrcweir #include "vcl/outdev.hxx"
29cdf0e10cSrcweir #include "vcl/gfxlink.hxx"
30cdf0e10cSrcweir #include "vcl/dllapi.h"
31cdf0e10cSrcweir #include "basegfx/polygon/b2dpolygon.hxx"
32cdf0e10cSrcweir #include "basegfx/polygon/b2dpolygontools.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
36cdf0e10cSrcweir #include <set>
37cdf0e10cSrcweir #include <map>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir namespace vcl
40cdf0e10cSrcweir {
41cdf0e10cSrcweir struct SAL_DLLPRIVATE PDFExtOutDevDataSync
42cdf0e10cSrcweir {
43cdf0e10cSrcweir     enum Action{    CreateNamedDest,
44cdf0e10cSrcweir                     CreateDest,
45cdf0e10cSrcweir 					CreateLink,
46cdf0e10cSrcweir 					SetLinkDest,
47cdf0e10cSrcweir 					SetLinkURL,
48cdf0e10cSrcweir                     RegisterDest,
49cdf0e10cSrcweir 					CreateOutlineItem,
50cdf0e10cSrcweir 					SetOutlineItemParent,
51cdf0e10cSrcweir 					SetOutlineItemText,
52cdf0e10cSrcweir 					SetOutlineItemDest,
53cdf0e10cSrcweir 					CreateNote,
54cdf0e10cSrcweir 					SetAutoAdvanceTime,
55cdf0e10cSrcweir 					SetPageTransition,
56cdf0e10cSrcweir 
57cdf0e10cSrcweir 					BeginStructureElement,
58cdf0e10cSrcweir 					EndStructureElement,
59cdf0e10cSrcweir                     SetCurrentStructureElement,
60cdf0e10cSrcweir 					SetStructureAttribute,
61cdf0e10cSrcweir 					SetStructureAttributeNumerical,
62cdf0e10cSrcweir 					SetStructureBoundingBox,
63cdf0e10cSrcweir 					SetActualText,
64cdf0e10cSrcweir 					SetAlternateText,
65cdf0e10cSrcweir                     CreateControl,
66cdf0e10cSrcweir 					BeginGroup,
67cdf0e10cSrcweir 					EndGroup,
68cdf0e10cSrcweir 					EndGroupGfxLink
69cdf0e10cSrcweir 	};
70cdf0e10cSrcweir 
71cdf0e10cSrcweir 	sal_uInt32	nIdx;
72cdf0e10cSrcweir 	Action		eAct;
73cdf0e10cSrcweir };
74cdf0e10cSrcweir 
75cdf0e10cSrcweir struct SAL_DLLPRIVATE PDFLinkDestination
76cdf0e10cSrcweir {
77cdf0e10cSrcweir     Rectangle               mRect;
78cdf0e10cSrcweir     MapMode                 mMapMode;
79cdf0e10cSrcweir     sal_Int32               mPageNr;
80cdf0e10cSrcweir     PDFWriter::DestAreaType mAreaType;
81cdf0e10cSrcweir };
82cdf0e10cSrcweir 
83cdf0e10cSrcweir struct SAL_DLLPRIVATE GlobalSyncData
84cdf0e10cSrcweir {
85cdf0e10cSrcweir 	std::deque< PDFExtOutDevDataSync::Action >	mActions;
86cdf0e10cSrcweir 	std::deque< MapMode >						mParaMapModes;
87cdf0e10cSrcweir 	std::deque< Rectangle >						mParaRects;
88cdf0e10cSrcweir 	std::deque< sal_Int32 >						mParaInts;
89cdf0e10cSrcweir 	std::deque< sal_uInt32 >					mParauInts;
90cdf0e10cSrcweir 	std::deque< rtl::OUString >					mParaOUStrings;
91cdf0e10cSrcweir 	std::deque< PDFWriter::DestAreaType >		mParaDestAreaTypes;
92cdf0e10cSrcweir 	std::deque< PDFNote >						mParaPDFNotes;
93cdf0e10cSrcweir 	std::deque< PDFWriter::PageTransition >		mParaPageTransitions;
94cdf0e10cSrcweir     ::std::map< sal_Int32, PDFLinkDestination > mFutureDestinations;
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	sal_Int32 GetMappedId();
97cdf0e10cSrcweir     sal_Int32 GetMappedStructId( sal_Int32 );
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 	sal_Int32					mCurId;
100cdf0e10cSrcweir 	std::vector< sal_Int32 >	mParaIds;
101cdf0e10cSrcweir     std::vector< sal_Int32 >	mStructIdMap;
102cdf0e10cSrcweir 
103cdf0e10cSrcweir     sal_Int32					mCurrentStructElement;
104cdf0e10cSrcweir     std::vector< sal_Int32 >	mStructParents;
GlobalSyncDatavcl::GlobalSyncData105cdf0e10cSrcweir 	GlobalSyncData() :
106cdf0e10cSrcweir             mCurId ( 0 ),
107cdf0e10cSrcweir             mCurrentStructElement( 0 )
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir         mStructParents.push_back( 0 );
110cdf0e10cSrcweir         mStructIdMap.push_back( 0 );
111cdf0e10cSrcweir     }
112cdf0e10cSrcweir 	void PlayGlobalActions( PDFWriter& rWriter );
113cdf0e10cSrcweir };
114cdf0e10cSrcweir 
GetMappedId()115cdf0e10cSrcweir sal_Int32 GlobalSyncData::GetMappedId()
116cdf0e10cSrcweir {
117cdf0e10cSrcweir 	sal_Int32 nLinkId = mParaInts.front();
118cdf0e10cSrcweir 	mParaInts.pop_front();
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     /*  negative values are intentionally passed as invalid IDs
121cdf0e10cSrcweir      *  e.g. to create a new top level outline item
122cdf0e10cSrcweir      */
123cdf0e10cSrcweir     if( nLinkId >= 0 )
124cdf0e10cSrcweir     {
125cdf0e10cSrcweir         if ( (sal_uInt32)nLinkId < mParaIds.size() )
126cdf0e10cSrcweir             nLinkId = mParaIds[ nLinkId ];
127cdf0e10cSrcweir         else
128cdf0e10cSrcweir             nLinkId = -1;
129cdf0e10cSrcweir 
130cdf0e10cSrcweir         DBG_ASSERT( nLinkId >= 0, "unmapped id in GlobalSyncData" );
131cdf0e10cSrcweir     }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 	return nLinkId;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
GetMappedStructId(sal_Int32 nStructId)136cdf0e10cSrcweir sal_Int32 GlobalSyncData::GetMappedStructId( sal_Int32 nStructId )
137cdf0e10cSrcweir {
138cdf0e10cSrcweir 	if ( (sal_uInt32)nStructId < mStructIdMap.size() )
139cdf0e10cSrcweir 		nStructId = mStructIdMap[ nStructId ];
140cdf0e10cSrcweir 	else
141cdf0e10cSrcweir 		nStructId = -1;
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     DBG_ASSERT( nStructId >= 0, "unmapped structure id in GlobalSyncData" );
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	return nStructId;
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
PlayGlobalActions(PDFWriter & rWriter)148cdf0e10cSrcweir void GlobalSyncData::PlayGlobalActions( PDFWriter& rWriter )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir 	std::deque< PDFExtOutDevDataSync::Action >::iterator aIter( mActions.begin() );
151cdf0e10cSrcweir 	std::deque< PDFExtOutDevDataSync::Action >::iterator aEnd( mActions.end() );
152cdf0e10cSrcweir 	while( aIter != aEnd )
153cdf0e10cSrcweir 	{
154cdf0e10cSrcweir 		switch( *aIter )
155cdf0e10cSrcweir 		{
156cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateNamedDest : //i56629
157cdf0e10cSrcweir 			{
158cdf0e10cSrcweir  				rWriter.Push( PUSH_MAPMODE );
159cdf0e10cSrcweir 				rWriter.SetMapMode( mParaMapModes.front() );
160cdf0e10cSrcweir 				mParaMapModes.pop_front();
161cdf0e10cSrcweir 				mParaIds.push_back( rWriter.CreateNamedDest( mParaOUStrings.front(), mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
162cdf0e10cSrcweir                 mParaOUStrings.pop_front();
163cdf0e10cSrcweir 				mParaRects.pop_front();
164cdf0e10cSrcweir 				mParaInts.pop_front();
165cdf0e10cSrcweir 				mParaDestAreaTypes.pop_front();
166cdf0e10cSrcweir 				rWriter.Pop();
167cdf0e10cSrcweir 			}
168cdf0e10cSrcweir 			break;
169cdf0e10cSrcweir 			case PDFExtOutDevDataSync::CreateDest :
170cdf0e10cSrcweir 			{
171cdf0e10cSrcweir 				rWriter.Push( PUSH_MAPMODE );
172cdf0e10cSrcweir 				rWriter.SetMapMode( mParaMapModes.front() );
173cdf0e10cSrcweir 				mParaMapModes.pop_front();
174cdf0e10cSrcweir 				mParaIds.push_back( rWriter.CreateDest( mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
175cdf0e10cSrcweir 				mParaRects.pop_front();
176cdf0e10cSrcweir 				mParaInts.pop_front();
177cdf0e10cSrcweir 				mParaDestAreaTypes.pop_front();
178cdf0e10cSrcweir 				rWriter.Pop();
179cdf0e10cSrcweir 			}
180cdf0e10cSrcweir 			break;
181cdf0e10cSrcweir 			case PDFExtOutDevDataSync::CreateLink :
182cdf0e10cSrcweir 			{
183cdf0e10cSrcweir 				rWriter.Push( PUSH_MAPMODE );
184cdf0e10cSrcweir 				rWriter.SetMapMode( mParaMapModes.front() );
185cdf0e10cSrcweir 				mParaMapModes.pop_front();
186cdf0e10cSrcweir 				mParaIds.push_back( rWriter.CreateLink( mParaRects.front(), mParaInts.front() ) );
187cdf0e10cSrcweir                 // resolve LinkAnnotation structural attribute
188cdf0e10cSrcweir                 rWriter.SetLinkPropertyID( mParaIds.back(), sal_Int32(mParaIds.size()-1) );
189cdf0e10cSrcweir 				mParaRects.pop_front();
190cdf0e10cSrcweir 				mParaInts.pop_front();
191cdf0e10cSrcweir 				rWriter.Pop();
192cdf0e10cSrcweir 			}
193cdf0e10cSrcweir 			break;
194cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetLinkDest :
195cdf0e10cSrcweir 			{
196cdf0e10cSrcweir 				sal_Int32 nLinkId = GetMappedId();
197cdf0e10cSrcweir 				sal_Int32 nDestId = GetMappedId();
198cdf0e10cSrcweir 				rWriter.SetLinkDest( nLinkId, nDestId );
199cdf0e10cSrcweir 			}
200cdf0e10cSrcweir 			break;
201cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetLinkURL :
202cdf0e10cSrcweir 			{
203cdf0e10cSrcweir 				sal_Int32 nLinkId = GetMappedId();
204cdf0e10cSrcweir 				rWriter.SetLinkURL( nLinkId, mParaOUStrings.front() );
205cdf0e10cSrcweir 				mParaOUStrings.pop_front();
206cdf0e10cSrcweir 			}
207cdf0e10cSrcweir 			break;
208cdf0e10cSrcweir             case PDFExtOutDevDataSync::RegisterDest :
209cdf0e10cSrcweir             {
210cdf0e10cSrcweir 				const sal_Int32 nDestId = mParaInts.front();
211cdf0e10cSrcweir                 mParaInts.pop_front();
212cdf0e10cSrcweir                 OSL_ENSURE( mFutureDestinations.find( nDestId ) != mFutureDestinations.end(),
213cdf0e10cSrcweir                     "GlobalSyncData::PlayGlobalActions: DescribeRegisteredRequest has not been called for that destination!" );
214cdf0e10cSrcweir 
215cdf0e10cSrcweir                 PDFLinkDestination& rDest = mFutureDestinations[ nDestId ];
216cdf0e10cSrcweir 
217cdf0e10cSrcweir                 rWriter.Push( PUSH_MAPMODE );
218cdf0e10cSrcweir 				rWriter.SetMapMode( rDest.mMapMode );
219cdf0e10cSrcweir 				mParaIds.push_back( rWriter.RegisterDestReference( nDestId, rDest.mRect, rDest.mPageNr, rDest.mAreaType ) );
220cdf0e10cSrcweir 				rWriter.Pop();
221cdf0e10cSrcweir             }
222cdf0e10cSrcweir             break;
223cdf0e10cSrcweir 			case PDFExtOutDevDataSync::CreateOutlineItem :
224cdf0e10cSrcweir 			{
225cdf0e10cSrcweir 				sal_Int32 nParent = GetMappedId();
226cdf0e10cSrcweir 				sal_Int32 nLinkId = GetMappedId();
227cdf0e10cSrcweir 				mParaIds.push_back( rWriter.CreateOutlineItem( nParent, mParaOUStrings.front(), nLinkId ) );
228cdf0e10cSrcweir 				mParaOUStrings.pop_front();
229cdf0e10cSrcweir 			}
230cdf0e10cSrcweir 			break;
231cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetOutlineItemParent :
232cdf0e10cSrcweir 			{
233cdf0e10cSrcweir 				sal_Int32 nItem = GetMappedId();
234cdf0e10cSrcweir 				sal_Int32 nNewParent = GetMappedId();
235cdf0e10cSrcweir 				rWriter.SetOutlineItemParent( nItem, nNewParent );
236cdf0e10cSrcweir 			}
237cdf0e10cSrcweir 			break;
238cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetOutlineItemText :
239cdf0e10cSrcweir 			{
240cdf0e10cSrcweir 				sal_Int32 nItem = GetMappedId();
241cdf0e10cSrcweir 				rWriter.SetOutlineItemText( nItem, mParaOUStrings.front() );
242cdf0e10cSrcweir 				mParaOUStrings.pop_front();
243cdf0e10cSrcweir 			}
244cdf0e10cSrcweir 			break;
245cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetOutlineItemDest :
246cdf0e10cSrcweir 			{
247cdf0e10cSrcweir 				sal_Int32 nItem = GetMappedId();
248cdf0e10cSrcweir 				sal_Int32 nDestId = GetMappedId();
249cdf0e10cSrcweir 				rWriter.SetOutlineItemDest( nItem, nDestId );
250cdf0e10cSrcweir 			}
251cdf0e10cSrcweir 			break;
252cdf0e10cSrcweir 			case PDFExtOutDevDataSync::CreateNote :
253cdf0e10cSrcweir 			{
254cdf0e10cSrcweir 				rWriter.Push( PUSH_MAPMODE );
255cdf0e10cSrcweir 				rWriter.SetMapMode( mParaMapModes.front() );
256cdf0e10cSrcweir 				rWriter.CreateNote( mParaRects.front(), mParaPDFNotes.front(), mParaInts.front() );
257cdf0e10cSrcweir 				mParaMapModes.pop_front();
258cdf0e10cSrcweir 				mParaRects.pop_front();
259cdf0e10cSrcweir 				mParaPDFNotes.pop_front();
260cdf0e10cSrcweir 				mParaInts.pop_front();
261cdf0e10cSrcweir 			}
262cdf0e10cSrcweir 			break;
263cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetAutoAdvanceTime :
264cdf0e10cSrcweir 			{
265cdf0e10cSrcweir 				rWriter.SetAutoAdvanceTime( mParauInts.front(), mParaInts.front() );
266cdf0e10cSrcweir 				mParauInts.pop_front();
267cdf0e10cSrcweir 				mParaInts.pop_front();
268cdf0e10cSrcweir 			}
269cdf0e10cSrcweir 			break;
270cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetPageTransition :
271cdf0e10cSrcweir 			{
272cdf0e10cSrcweir 				rWriter.SetPageTransition( mParaPageTransitions.front(), mParauInts.front(), mParaInts.front() );
273cdf0e10cSrcweir 				mParaPageTransitions.pop_front();
274cdf0e10cSrcweir 				mParauInts.pop_front();
275cdf0e10cSrcweir 				mParaInts.pop_front();
276cdf0e10cSrcweir 			}
277cdf0e10cSrcweir 			break;
278cdf0e10cSrcweir             case PDFExtOutDevDataSync::BeginStructureElement:
279cdf0e10cSrcweir             case PDFExtOutDevDataSync::EndStructureElement:
280cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetCurrentStructureElement:
281cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetStructureAttribute:
282cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetStructureAttributeNumerical:
283cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetStructureBoundingBox:
284cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetActualText:
285cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetAlternateText:
286cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateControl:
287cdf0e10cSrcweir             case PDFExtOutDevDataSync::BeginGroup:
288cdf0e10cSrcweir             case PDFExtOutDevDataSync::EndGroup:
289cdf0e10cSrcweir             case PDFExtOutDevDataSync::EndGroupGfxLink:
290cdf0e10cSrcweir                 break;
291cdf0e10cSrcweir 		}
292cdf0e10cSrcweir 		aIter++;
293cdf0e10cSrcweir 	}
294cdf0e10cSrcweir }
295cdf0e10cSrcweir 
296cdf0e10cSrcweir struct PageSyncData
297cdf0e10cSrcweir {
298cdf0e10cSrcweir 	std::deque< PDFExtOutDevDataSync >				mActions;
299cdf0e10cSrcweir 	std::deque< Rectangle >							mParaRects;
300cdf0e10cSrcweir 	std::deque< sal_Int32 >							mParaInts;
301cdf0e10cSrcweir 	std::deque< rtl::OUString >						mParaOUStrings;
302cdf0e10cSrcweir 	std::deque< PDFWriter::StructElement >			mParaStructElements;
303cdf0e10cSrcweir 	std::deque< PDFWriter::StructAttribute >		mParaStructAttributes;
304cdf0e10cSrcweir 	std::deque< PDFWriter::StructAttributeValue >	mParaStructAttributeValues;
305cdf0e10cSrcweir 	std::deque< Graphic >							mGraphics;
306cdf0e10cSrcweir     std::deque< ::boost::shared_ptr< PDFWriter::AnyWidget > >
307cdf0e10cSrcweir                                                     mControls;
308cdf0e10cSrcweir     GlobalSyncData*									mpGlobalData;
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 	sal_Bool										mbGroupIgnoreGDIMtfActions;
311cdf0e10cSrcweir 
PageSyncDatavcl::PageSyncData312cdf0e10cSrcweir 	PageSyncData( GlobalSyncData* pGlobal ) : mbGroupIgnoreGDIMtfActions ( sal_False ) { mpGlobalData = pGlobal; }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 	void PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct );
315cdf0e10cSrcweir 	sal_Bool PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData );
316cdf0e10cSrcweir };
PushAction(const OutputDevice & rOutDev,const PDFExtOutDevDataSync::Action eAct)317cdf0e10cSrcweir void PageSyncData::PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir 	GDIMetaFile* pMtf = rOutDev.GetConnectMetaFile();
320cdf0e10cSrcweir 	DBG_ASSERT( pMtf, "PageSyncData::PushAction -> no ConnectMetaFile !!!" );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 	PDFExtOutDevDataSync aSync;
323cdf0e10cSrcweir 	aSync.eAct = eAct;
324cdf0e10cSrcweir 	if ( pMtf )
325cdf0e10cSrcweir 		aSync.nIdx = pMtf->GetActionCount();
326cdf0e10cSrcweir 	else
327cdf0e10cSrcweir 		aSync.nIdx = 0x7fffffff;	// sync not possible
328cdf0e10cSrcweir 	mActions.push_back( aSync );
329cdf0e10cSrcweir }
PlaySyncPageAct(PDFWriter & rWriter,sal_uInt32 & rCurGDIMtfAction,const PDFExtOutDevData & rOutDevData)330cdf0e10cSrcweir sal_Bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData )
331cdf0e10cSrcweir {
332cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
333cdf0e10cSrcweir 	if ( mActions.size() && ( mActions.front().nIdx == rCurGDIMtfAction ) )
334cdf0e10cSrcweir 	{
335cdf0e10cSrcweir 		bRet = sal_True;
336cdf0e10cSrcweir 		PDFExtOutDevDataSync aDataSync = mActions.front();
337cdf0e10cSrcweir 		mActions.pop_front();
338cdf0e10cSrcweir 		switch( aDataSync.eAct )
339cdf0e10cSrcweir 		{
340cdf0e10cSrcweir 			case PDFExtOutDevDataSync::BeginStructureElement :
341cdf0e10cSrcweir 			{
342cdf0e10cSrcweir                 sal_Int32 nNewEl = rWriter.BeginStructureElement( mParaStructElements.front(), mParaOUStrings.front() ) ;
343cdf0e10cSrcweir 				mParaStructElements.pop_front();
344cdf0e10cSrcweir                 mParaOUStrings.pop_front();
345cdf0e10cSrcweir 				mpGlobalData->mStructIdMap.push_back( nNewEl );
346cdf0e10cSrcweir 			}
347cdf0e10cSrcweir 			break;
348cdf0e10cSrcweir 			case PDFExtOutDevDataSync::EndStructureElement :
349cdf0e10cSrcweir 			{
350cdf0e10cSrcweir 				rWriter.EndStructureElement();
351cdf0e10cSrcweir 			}
352cdf0e10cSrcweir 			break;
353cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetCurrentStructureElement:
354cdf0e10cSrcweir             {
355cdf0e10cSrcweir                 rWriter.SetCurrentStructureElement( mpGlobalData->GetMappedStructId( mParaInts.front() ) );
356cdf0e10cSrcweir                 mParaInts.pop_front();
357cdf0e10cSrcweir             }
358cdf0e10cSrcweir             break;
359cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetStructureAttribute :
360cdf0e10cSrcweir 			{
361cdf0e10cSrcweir 				rWriter.SetStructureAttribute( mParaStructAttributes.front(), mParaStructAttributeValues.front() );
362cdf0e10cSrcweir 				mParaStructAttributeValues.pop_front();
363cdf0e10cSrcweir 				mParaStructAttributes.pop_front();
364cdf0e10cSrcweir 			}
365cdf0e10cSrcweir 			break;
366cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetStructureAttributeNumerical :
367cdf0e10cSrcweir 			{
368cdf0e10cSrcweir 				rWriter.SetStructureAttributeNumerical( mParaStructAttributes.front(), mParaInts.front() );
369cdf0e10cSrcweir 				mParaStructAttributes.pop_front();
370cdf0e10cSrcweir 				mParaInts.pop_front();
371cdf0e10cSrcweir 			}
372cdf0e10cSrcweir 			break;
373cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetStructureBoundingBox :
374cdf0e10cSrcweir 			{
375cdf0e10cSrcweir 				rWriter.SetStructureBoundingBox( mParaRects.front() );
376cdf0e10cSrcweir 				mParaRects.pop_front();
377cdf0e10cSrcweir 			}
378cdf0e10cSrcweir 			break;
379cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetActualText :
380cdf0e10cSrcweir 			{
381cdf0e10cSrcweir 				rWriter.SetActualText( mParaOUStrings.front() );
382cdf0e10cSrcweir 				mParaOUStrings.pop_front();
383cdf0e10cSrcweir 			}
384cdf0e10cSrcweir 			break;
385cdf0e10cSrcweir 			case PDFExtOutDevDataSync::SetAlternateText :
386cdf0e10cSrcweir 			{
387cdf0e10cSrcweir 				rWriter.SetAlternateText( mParaOUStrings.front() );
388cdf0e10cSrcweir 				mParaOUStrings.pop_front();
389cdf0e10cSrcweir 			}
390cdf0e10cSrcweir 			break;
391cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateControl:
392cdf0e10cSrcweir             {
393cdf0e10cSrcweir                 ::boost::shared_ptr< PDFWriter::AnyWidget > pControl( mControls.front() );
394cdf0e10cSrcweir                 DBG_ASSERT( pControl.get(), "PageSyncData::PlaySyncPageAct: invalid widget!" );
395cdf0e10cSrcweir                 if ( pControl.get() )
396cdf0e10cSrcweir                     rWriter.CreateControl( *pControl );
397cdf0e10cSrcweir 				mControls.pop_front();
398cdf0e10cSrcweir             }
399cdf0e10cSrcweir             break;
400cdf0e10cSrcweir 			case PDFExtOutDevDataSync::BeginGroup :
401cdf0e10cSrcweir 			{
402cdf0e10cSrcweir 				/* first determining if this BeginGroup is starting a GfxLink,
403cdf0e10cSrcweir 				   by searching for a EndGroup or a EndGroupGfxLink */
404cdf0e10cSrcweir 				mbGroupIgnoreGDIMtfActions = sal_False;
405cdf0e10cSrcweir 				std::deque< PDFExtOutDevDataSync >::iterator aBeg = mActions.begin();
406cdf0e10cSrcweir 				std::deque< PDFExtOutDevDataSync >::iterator aEnd = mActions.end();
407cdf0e10cSrcweir 				while ( aBeg != aEnd )
408cdf0e10cSrcweir 				{
409cdf0e10cSrcweir 					if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroup )
410cdf0e10cSrcweir 					{
411cdf0e10cSrcweir 						break;
412cdf0e10cSrcweir 					}
413cdf0e10cSrcweir 					else if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroupGfxLink )
414cdf0e10cSrcweir 					{
415cdf0e10cSrcweir 						if ( rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution() )
416cdf0e10cSrcweir 						{
417cdf0e10cSrcweir 							Graphic& rGraphic = mGraphics.front();
418cdf0e10cSrcweir 							if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
419cdf0e10cSrcweir 							{
420cdf0e10cSrcweir 								mbGroupIgnoreGDIMtfActions = sal_True;
421cdf0e10cSrcweir 							}
422cdf0e10cSrcweir 						}
423cdf0e10cSrcweir 						break;
424cdf0e10cSrcweir 					}
425cdf0e10cSrcweir 					aBeg++;
426cdf0e10cSrcweir 				}
427cdf0e10cSrcweir 			}
428cdf0e10cSrcweir 			break;
429cdf0e10cSrcweir 			case PDFExtOutDevDataSync::EndGroup :
430cdf0e10cSrcweir 			{
431cdf0e10cSrcweir 				mbGroupIgnoreGDIMtfActions = sal_False;
432cdf0e10cSrcweir 			}
433cdf0e10cSrcweir 			break;
434cdf0e10cSrcweir 			case PDFExtOutDevDataSync::EndGroupGfxLink :
435cdf0e10cSrcweir 			{
436cdf0e10cSrcweir                 sal_Int32 nTransparency;
437cdf0e10cSrcweir                 Rectangle aOutputRect, aVisibleOutputRect;
438cdf0e10cSrcweir                 Graphic   aGraphic( mGraphics.front() );
439cdf0e10cSrcweir 
440cdf0e10cSrcweir                 mGraphics.pop_front();
441cdf0e10cSrcweir                 nTransparency = mParaInts.front();
442cdf0e10cSrcweir                 mParaInts.pop_front();
443cdf0e10cSrcweir                 aOutputRect = mParaRects.front();
444cdf0e10cSrcweir                 mParaRects.pop_front();
445cdf0e10cSrcweir                 aVisibleOutputRect = mParaRects.front();
446cdf0e10cSrcweir                 mParaRects.pop_front();
447cdf0e10cSrcweir 
448cdf0e10cSrcweir 				if ( mbGroupIgnoreGDIMtfActions )
449cdf0e10cSrcweir 				{
450cdf0e10cSrcweir 					sal_Bool bClippingNeeded = ( aOutputRect != aVisibleOutputRect ) && !aVisibleOutputRect.IsEmpty();
451cdf0e10cSrcweir 
452cdf0e10cSrcweir 					GfxLink	  aGfxLink( aGraphic.GetLink() );
453cdf0e10cSrcweir 					if ( aGfxLink.GetType() == GFX_LINK_TYPE_NATIVE_JPG )
454cdf0e10cSrcweir 					{
455cdf0e10cSrcweir 						if ( bClippingNeeded )
456cdf0e10cSrcweir 						{
457cdf0e10cSrcweir 							rWriter.Push();
458cdf0e10cSrcweir                             basegfx::B2DPolyPolygon aRect( basegfx::tools::createPolygonFromRect(
459cdf0e10cSrcweir                                 basegfx::B2DRectangle( aVisibleOutputRect.Left(), aVisibleOutputRect.Top(),
460cdf0e10cSrcweir                                                        aVisibleOutputRect.Right(), aVisibleOutputRect.Bottom() ) ) );
461cdf0e10cSrcweir 							rWriter.SetClipRegion( aRect);
462cdf0e10cSrcweir 						}
463cdf0e10cSrcweir 						Bitmap aMask;
464cdf0e10cSrcweir 						SvMemoryStream aTmp;
465cdf0e10cSrcweir                         const sal_uInt8* pData = aGfxLink.GetData();
466cdf0e10cSrcweir                         sal_uInt32 nBytes = aGfxLink.GetDataSize();
467cdf0e10cSrcweir                         if( pData && nBytes )
468cdf0e10cSrcweir                         {
469cdf0e10cSrcweir                             aTmp.Write( pData, nBytes );
470cdf0e10cSrcweir                             rWriter.DrawJPGBitmap( aTmp, aGraphic.GetBitmap().GetBitCount() > 8, aGraphic.GetSizePixel(), aOutputRect, aMask );
471cdf0e10cSrcweir                         }
472cdf0e10cSrcweir 
473cdf0e10cSrcweir 						if ( bClippingNeeded )
474cdf0e10cSrcweir 							rWriter.Pop();
475cdf0e10cSrcweir 					}
476cdf0e10cSrcweir 					mbGroupIgnoreGDIMtfActions = sal_False;
477cdf0e10cSrcweir 				}
478cdf0e10cSrcweir 			}
479cdf0e10cSrcweir 			break;
480cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateNamedDest:
481cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateDest:
482cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateLink:
483cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetLinkDest:
484cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetLinkURL:
485cdf0e10cSrcweir             case PDFExtOutDevDataSync::RegisterDest:
486cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateOutlineItem:
487cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetOutlineItemParent:
488cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetOutlineItemText:
489cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetOutlineItemDest:
490cdf0e10cSrcweir             case PDFExtOutDevDataSync::CreateNote:
491cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetAutoAdvanceTime:
492cdf0e10cSrcweir             case PDFExtOutDevDataSync::SetPageTransition:
493cdf0e10cSrcweir                 break;
494cdf0e10cSrcweir 		}
495cdf0e10cSrcweir 	}
496cdf0e10cSrcweir 	else if ( mbGroupIgnoreGDIMtfActions )
497cdf0e10cSrcweir 	{
498cdf0e10cSrcweir 		rCurGDIMtfAction++;
499cdf0e10cSrcweir 		bRet = sal_True;
500cdf0e10cSrcweir 	}
501cdf0e10cSrcweir 	return bRet;
502cdf0e10cSrcweir }
503cdf0e10cSrcweir 
504cdf0e10cSrcweir TYPEINIT1(PDFExtOutDevData,ExtOutDevData);
PDFExtOutDevData(const OutputDevice & rOutDev)505cdf0e10cSrcweir PDFExtOutDevData::PDFExtOutDevData( const OutputDevice& rOutDev ) :
506cdf0e10cSrcweir 	mrOutDev				( rOutDev ),
507cdf0e10cSrcweir 	mbTaggedPDF				( sal_False ),
508cdf0e10cSrcweir 	mbExportNotes			( sal_True ),
50954744b05SEike Rathke 	mbExportNotesPages		( sal_False ),
510cdf0e10cSrcweir 	mbTransitionEffects		( sal_True ),
511cdf0e10cSrcweir 	mbUseLosslessCompression( sal_True ),
512cdf0e10cSrcweir 	mbReduceImageResolution	( sal_False ),
513cdf0e10cSrcweir     mbExportNDests          ( sal_False ),
514cdf0e10cSrcweir 	mnFormsFormat			( 0 ),
515cdf0e10cSrcweir 	mnPage					( -1 ),
516cdf0e10cSrcweir 	mpPageSyncData			( NULL ),
517cdf0e10cSrcweir 	mpGlobalSyncData		( new GlobalSyncData() )
518cdf0e10cSrcweir {
519cdf0e10cSrcweir     mpPageSyncData = new PageSyncData( mpGlobalSyncData );
520cdf0e10cSrcweir }
521cdf0e10cSrcweir 
~PDFExtOutDevData()522cdf0e10cSrcweir PDFExtOutDevData::~PDFExtOutDevData()
523cdf0e10cSrcweir {
524cdf0e10cSrcweir 	delete mpPageSyncData;
525cdf0e10cSrcweir 	delete mpGlobalSyncData;
526cdf0e10cSrcweir }
527cdf0e10cSrcweir 
GetDocumentLocale() const528cdf0e10cSrcweir const com::sun::star::lang::Locale& PDFExtOutDevData::GetDocumentLocale() const
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     return maDocLocale;
531cdf0e10cSrcweir }
SetDocumentLocale(const com::sun::star::lang::Locale & rLoc)532cdf0e10cSrcweir void PDFExtOutDevData::SetDocumentLocale( const com::sun::star::lang::Locale& rLoc )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir     maDocLocale = rLoc;
535cdf0e10cSrcweir }
GetCurrentPageNumber() const536cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::GetCurrentPageNumber() const
537cdf0e10cSrcweir {
538cdf0e10cSrcweir 	return mnPage;
539cdf0e10cSrcweir }
SetCurrentPageNumber(const sal_Int32 nPage)540cdf0e10cSrcweir void PDFExtOutDevData::SetCurrentPageNumber( const sal_Int32 nPage )
541cdf0e10cSrcweir {
542cdf0e10cSrcweir 	mnPage = nPage;
543cdf0e10cSrcweir }
GetIsLosslessCompression() const544cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsLosslessCompression() const
545cdf0e10cSrcweir {
546cdf0e10cSrcweir 	return mbUseLosslessCompression;
547cdf0e10cSrcweir }
SetIsLosslessCompression(const sal_Bool bUseLosslessCompression)548cdf0e10cSrcweir void PDFExtOutDevData::SetIsLosslessCompression( const sal_Bool bUseLosslessCompression )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir 	mbUseLosslessCompression = bUseLosslessCompression;
551cdf0e10cSrcweir }
GetIsReduceImageResolution() const552cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsReduceImageResolution() const
553cdf0e10cSrcweir {
554cdf0e10cSrcweir 	return mbReduceImageResolution;
555cdf0e10cSrcweir }
SetIsReduceImageResolution(const sal_Bool bReduceImageResolution)556cdf0e10cSrcweir void PDFExtOutDevData::SetIsReduceImageResolution( const sal_Bool bReduceImageResolution )
557cdf0e10cSrcweir {
558cdf0e10cSrcweir 	mbReduceImageResolution = bReduceImageResolution;
559cdf0e10cSrcweir }
GetIsExportNotes() const560cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportNotes() const
561cdf0e10cSrcweir {
562cdf0e10cSrcweir 	return mbExportNotes;
563cdf0e10cSrcweir }
SetIsExportNotes(const sal_Bool bExportNotes)564cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportNotes( const sal_Bool bExportNotes )
565cdf0e10cSrcweir {
566cdf0e10cSrcweir 	mbExportNotes = bExportNotes;
567cdf0e10cSrcweir }
GetIsExportNotesPages() const56854744b05SEike Rathke sal_Bool PDFExtOutDevData::GetIsExportNotesPages() const
56954744b05SEike Rathke {
57054744b05SEike Rathke 	return mbExportNotesPages;
57154744b05SEike Rathke }
SetIsExportNotesPages(const sal_Bool bExportNotesPages)57254744b05SEike Rathke void PDFExtOutDevData::SetIsExportNotesPages( const sal_Bool bExportNotesPages )
57354744b05SEike Rathke {
57454744b05SEike Rathke 	mbExportNotesPages = bExportNotesPages;
57554744b05SEike Rathke }
GetIsExportTaggedPDF() const576cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportTaggedPDF() const
577cdf0e10cSrcweir {
578cdf0e10cSrcweir 	return mbTaggedPDF;
579cdf0e10cSrcweir }
SetIsExportTaggedPDF(const sal_Bool bTaggedPDF)580cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportTaggedPDF( const sal_Bool bTaggedPDF )
581cdf0e10cSrcweir {
582cdf0e10cSrcweir 	mbTaggedPDF = bTaggedPDF;
583cdf0e10cSrcweir }
GetIsExportTransitionEffects() const584cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportTransitionEffects() const
585cdf0e10cSrcweir {
586cdf0e10cSrcweir 	return mbTransitionEffects;
587cdf0e10cSrcweir }
SetIsExportTransitionEffects(const sal_Bool bTransitionEffects)588cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportTransitionEffects( const sal_Bool bTransitionEffects )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir 	mbTransitionEffects = bTransitionEffects;
591cdf0e10cSrcweir }
GetIsExportFormFields() const592cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportFormFields() const
593cdf0e10cSrcweir {
594cdf0e10cSrcweir     return mbExportFormFields;
595cdf0e10cSrcweir }
SetIsExportFormFields(const sal_Bool bExportFomtFields)596cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportFormFields( const sal_Bool bExportFomtFields )
597cdf0e10cSrcweir {
598cdf0e10cSrcweir     mbExportFormFields = bExportFomtFields;
599cdf0e10cSrcweir }
GetFormsFormat() const600cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::GetFormsFormat() const
601cdf0e10cSrcweir {
602cdf0e10cSrcweir 	return mnFormsFormat;
603cdf0e10cSrcweir }
SetFormsFormat(const sal_Int32 nFormsFormat)604cdf0e10cSrcweir void PDFExtOutDevData::SetFormsFormat( const sal_Int32 nFormsFormat )
605cdf0e10cSrcweir {
606cdf0e10cSrcweir 	mnFormsFormat = nFormsFormat;
607cdf0e10cSrcweir }
GetIsExportBookmarks() const608cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportBookmarks() const
609cdf0e10cSrcweir {
610cdf0e10cSrcweir     return mbExportBookmarks;
611cdf0e10cSrcweir }
SetIsExportBookmarks(const sal_Bool bExportBookmarks)612cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportBookmarks( const sal_Bool bExportBookmarks )
613cdf0e10cSrcweir {
614cdf0e10cSrcweir     mbExportBookmarks = bExportBookmarks;
615cdf0e10cSrcweir }
GetBookmarks()616cdf0e10cSrcweir std::vector< PDFExtOutDevBookmarkEntry >& PDFExtOutDevData::GetBookmarks()
617cdf0e10cSrcweir {
618cdf0e10cSrcweir 	return maBookmarks;
619cdf0e10cSrcweir }
GetIsExportNamedDestinations() const620cdf0e10cSrcweir sal_Bool PDFExtOutDevData::GetIsExportNamedDestinations() const
621cdf0e10cSrcweir {
622cdf0e10cSrcweir     return mbExportNDests;
623cdf0e10cSrcweir }
SetIsExportNamedDestinations(const sal_Bool bExportNDests)624cdf0e10cSrcweir void PDFExtOutDevData::SetIsExportNamedDestinations( const sal_Bool bExportNDests )
625cdf0e10cSrcweir {
626cdf0e10cSrcweir     mbExportNDests = bExportNDests;
627cdf0e10cSrcweir }
ResetSyncData()628cdf0e10cSrcweir void PDFExtOutDevData::ResetSyncData()
629cdf0e10cSrcweir {
630cdf0e10cSrcweir 	*mpPageSyncData = PageSyncData( mpGlobalSyncData );
631cdf0e10cSrcweir }
PlaySyncPageAct(PDFWriter & rWriter,sal_uInt32 & rIdx)632cdf0e10cSrcweir sal_Bool PDFExtOutDevData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rIdx )
633cdf0e10cSrcweir {
634cdf0e10cSrcweir 	return mpPageSyncData->PlaySyncPageAct( rWriter, rIdx, *this );
635cdf0e10cSrcweir }
PlayGlobalActions(PDFWriter & rWriter)636cdf0e10cSrcweir void PDFExtOutDevData::PlayGlobalActions( PDFWriter& rWriter )
637cdf0e10cSrcweir {
638cdf0e10cSrcweir 	mpGlobalSyncData->PlayGlobalActions( rWriter );
639cdf0e10cSrcweir }
640cdf0e10cSrcweir 
641cdf0e10cSrcweir /* global actions, syncronisation to the recorded metafile isn't needed,
642cdf0e10cSrcweir    all actions will be played after the last page was recorded
643cdf0e10cSrcweir */
644cdf0e10cSrcweir //--->i56629
CreateNamedDest(const String & sDestName,const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)645cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::CreateNamedDest(const String& sDestName,  const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
646cdf0e10cSrcweir {
647cdf0e10cSrcweir     mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNamedDest );
648cdf0e10cSrcweir     mpGlobalSyncData->mParaOUStrings.push_back( sDestName );
649cdf0e10cSrcweir     mpGlobalSyncData->mParaRects.push_back( rRect );
650cdf0e10cSrcweir     mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
651cdf0e10cSrcweir     mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
652cdf0e10cSrcweir     mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
653cdf0e10cSrcweir 
654cdf0e10cSrcweir     return mpGlobalSyncData->mCurId++;
655cdf0e10cSrcweir }
656cdf0e10cSrcweir //<---i56629
RegisterDest()657cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::RegisterDest()
658cdf0e10cSrcweir {
659cdf0e10cSrcweir     const sal_Int32 nLinkDestID = mpGlobalSyncData->mCurId++;
660cdf0e10cSrcweir     mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::RegisterDest );
661cdf0e10cSrcweir     mpGlobalSyncData->mParaInts.push_back( nLinkDestID );
662cdf0e10cSrcweir 
663cdf0e10cSrcweir     return nLinkDestID;
664cdf0e10cSrcweir }
DescribeRegisteredDest(sal_Int32 nDestId,const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)665cdf0e10cSrcweir void PDFExtOutDevData::DescribeRegisteredDest( sal_Int32 nDestId, const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
666cdf0e10cSrcweir {
667cdf0e10cSrcweir     OSL_PRECOND( nDestId != -1, "PDFExtOutDevData::DescribeRegisteredDest: invalid destination Id!" );
668cdf0e10cSrcweir     PDFLinkDestination aLinkDestination;
669cdf0e10cSrcweir     aLinkDestination.mRect = rRect;
670cdf0e10cSrcweir     aLinkDestination.mMapMode = mrOutDev.GetMapMode();
671cdf0e10cSrcweir     aLinkDestination.mPageNr = nPageNr == -1 ? mnPage : nPageNr;
672cdf0e10cSrcweir     aLinkDestination.mAreaType = eType;
673cdf0e10cSrcweir     mpGlobalSyncData->mFutureDestinations[ nDestId ] = aLinkDestination;
674cdf0e10cSrcweir }
CreateDest(const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)675cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::CreateDest( const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
676cdf0e10cSrcweir {
677cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateDest );
678cdf0e10cSrcweir 	mpGlobalSyncData->mParaRects.push_back( rRect );
679cdf0e10cSrcweir 	mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
680cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
681cdf0e10cSrcweir 	mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
682cdf0e10cSrcweir 	return mpGlobalSyncData->mCurId++;
683cdf0e10cSrcweir }
CreateLink(const Rectangle & rRect,sal_Int32 nPageNr)684cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::CreateLink( const Rectangle& rRect, sal_Int32 nPageNr )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateLink );
687cdf0e10cSrcweir 	mpGlobalSyncData->mParaRects.push_back( rRect );
688cdf0e10cSrcweir 	mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
689cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
690cdf0e10cSrcweir 	return mpGlobalSyncData->mCurId++;
691cdf0e10cSrcweir }
SetLinkDest(sal_Int32 nLinkId,sal_Int32 nDestId)692cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::SetLinkDest( sal_Int32 nLinkId, sal_Int32 nDestId )
693cdf0e10cSrcweir {
694cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkDest );
695cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nLinkId );
696cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nDestId );
697cdf0e10cSrcweir 	return 0;
698cdf0e10cSrcweir }
SetLinkURL(sal_Int32 nLinkId,const rtl::OUString & rURL)699cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::SetLinkURL( sal_Int32 nLinkId, const rtl::OUString& rURL )
700cdf0e10cSrcweir {
701cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkURL );
702cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nLinkId );
703cdf0e10cSrcweir 	mpGlobalSyncData->mParaOUStrings.push_back( rURL );
704cdf0e10cSrcweir 	return 0;
705cdf0e10cSrcweir }
CreateOutlineItem(sal_Int32 nParent,const rtl::OUString & rText,sal_Int32 nDestID)706cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::CreateOutlineItem( sal_Int32 nParent, const rtl::OUString& rText, sal_Int32 nDestID )
707cdf0e10cSrcweir {
708cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateOutlineItem );
709cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nParent );
710cdf0e10cSrcweir 	mpGlobalSyncData->mParaOUStrings.push_back( rText );
711cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nDestID );
712cdf0e10cSrcweir 	return mpGlobalSyncData->mCurId++;
713cdf0e10cSrcweir }
SetOutlineItemParent(sal_Int32 nItem,sal_Int32 nNewParent)714cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::SetOutlineItemParent( sal_Int32 nItem, sal_Int32 nNewParent )
715cdf0e10cSrcweir {
716cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemParent );
717cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nItem );
718cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nNewParent );
719cdf0e10cSrcweir 	return 0;
720cdf0e10cSrcweir }
SetOutlineItemText(sal_Int32 nItem,const rtl::OUString & rText)721cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::SetOutlineItemText( sal_Int32 nItem, const rtl::OUString& rText )
722cdf0e10cSrcweir {
723cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemText );
724cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nItem );
725cdf0e10cSrcweir 	mpGlobalSyncData->mParaOUStrings.push_back( rText );
726cdf0e10cSrcweir 	return 0;
727cdf0e10cSrcweir }
SetOutlineItemDest(sal_Int32 nItem,sal_Int32 nDestID)728cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::SetOutlineItemDest( sal_Int32 nItem, sal_Int32 nDestID )
729cdf0e10cSrcweir {
730cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemDest );
731cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nItem );
732cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nDestID );
733cdf0e10cSrcweir 	return 0;
734cdf0e10cSrcweir }
CreateNote(const Rectangle & rRect,const PDFNote & rNote,sal_Int32 nPageNr)735cdf0e10cSrcweir void PDFExtOutDevData::CreateNote( const Rectangle& rRect, const PDFNote& rNote, sal_Int32 nPageNr )
736cdf0e10cSrcweir {
737cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNote );
738cdf0e10cSrcweir 	mpGlobalSyncData->mParaRects.push_back( rRect );
739cdf0e10cSrcweir 	mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
740cdf0e10cSrcweir 	mpGlobalSyncData->mParaPDFNotes.push_back( rNote );
741cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
742cdf0e10cSrcweir }
SetAutoAdvanceTime(sal_uInt32 nSeconds,sal_Int32 nPageNr)743cdf0e10cSrcweir void PDFExtOutDevData::SetAutoAdvanceTime( sal_uInt32 nSeconds, sal_Int32 nPageNr )
744cdf0e10cSrcweir {
745cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetAutoAdvanceTime );
746cdf0e10cSrcweir 	mpGlobalSyncData->mParauInts.push_back( nSeconds );
747cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
748cdf0e10cSrcweir }
SetPageTransition(PDFWriter::PageTransition eType,sal_uInt32 nMilliSec,sal_Int32 nPageNr)749cdf0e10cSrcweir void PDFExtOutDevData::SetPageTransition( PDFWriter::PageTransition eType, sal_uInt32 nMilliSec, sal_Int32 nPageNr )
750cdf0e10cSrcweir {
751cdf0e10cSrcweir 	mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetPageTransition );
752cdf0e10cSrcweir 	mpGlobalSyncData->mParaPageTransitions.push_back( eType );
753cdf0e10cSrcweir 	mpGlobalSyncData->mParauInts.push_back( nMilliSec );
754cdf0e10cSrcweir 	mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
755cdf0e10cSrcweir }
756cdf0e10cSrcweir 
757cdf0e10cSrcweir /* local (page), actions have to be played synchroniously to the actions of
758cdf0e10cSrcweir    of the recorded metafile (created by each xRenderable->render()) */
BeginStructureElement(PDFWriter::StructElement eType,const rtl::OUString & rAlias)759cdf0e10cSrcweir    sal_Int32 PDFExtOutDevData::BeginStructureElement( PDFWriter::StructElement eType, const rtl::OUString& rAlias )
760cdf0e10cSrcweir {
761cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginStructureElement );
762cdf0e10cSrcweir 	mpPageSyncData->mParaStructElements.push_back( eType );
763cdf0e10cSrcweir     mpPageSyncData->mParaOUStrings.push_back( rAlias );
764cdf0e10cSrcweir     // need a global id
765cdf0e10cSrcweir     sal_Int32 nNewId = mpGlobalSyncData->mStructParents.size();
766cdf0e10cSrcweir     mpGlobalSyncData->mStructParents.push_back( mpGlobalSyncData->mCurrentStructElement );
767cdf0e10cSrcweir     mpGlobalSyncData->mCurrentStructElement = nNewId;
768cdf0e10cSrcweir     return nNewId;
769cdf0e10cSrcweir }
EndStructureElement()770cdf0e10cSrcweir void PDFExtOutDevData::EndStructureElement()
771cdf0e10cSrcweir {
772cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndStructureElement );
773cdf0e10cSrcweir     mpGlobalSyncData->mCurrentStructElement = mpGlobalSyncData->mStructParents[ mpGlobalSyncData->mCurrentStructElement ];
774cdf0e10cSrcweir }
SetCurrentStructureElement(sal_Int32 nStructId)775cdf0e10cSrcweir bool PDFExtOutDevData::SetCurrentStructureElement( sal_Int32 nStructId )
776cdf0e10cSrcweir {
777cdf0e10cSrcweir     bool bSuccess = false;
778cdf0e10cSrcweir     if( sal_uInt32(nStructId) < mpGlobalSyncData->mStructParents.size() )
779cdf0e10cSrcweir     {
780cdf0e10cSrcweir         mpGlobalSyncData->mCurrentStructElement = nStructId;
781cdf0e10cSrcweir         mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetCurrentStructureElement );
782cdf0e10cSrcweir         mpPageSyncData->mParaInts.push_back( nStructId );
783cdf0e10cSrcweir         bSuccess = true;
784cdf0e10cSrcweir     }
785cdf0e10cSrcweir     return bSuccess;
786cdf0e10cSrcweir }
GetCurrentStructureElement()787cdf0e10cSrcweir sal_Int32 PDFExtOutDevData::GetCurrentStructureElement()
788cdf0e10cSrcweir {
789cdf0e10cSrcweir     return mpGlobalSyncData->mCurrentStructElement;
790cdf0e10cSrcweir }
SetStructureAttribute(PDFWriter::StructAttribute eAttr,PDFWriter::StructAttributeValue eVal)791cdf0e10cSrcweir bool PDFExtOutDevData::SetStructureAttribute( PDFWriter::StructAttribute eAttr, PDFWriter::StructAttributeValue eVal )
792cdf0e10cSrcweir {
793cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttribute );
794cdf0e10cSrcweir 	mpPageSyncData->mParaStructAttributes.push_back( eAttr );
795cdf0e10cSrcweir 	mpPageSyncData->mParaStructAttributeValues.push_back( eVal );
796cdf0e10cSrcweir 	return true;
797cdf0e10cSrcweir }
SetStructureAttributeNumerical(PDFWriter::StructAttribute eAttr,sal_Int32 nValue)798cdf0e10cSrcweir bool PDFExtOutDevData::SetStructureAttributeNumerical( PDFWriter::StructAttribute eAttr, sal_Int32 nValue )
799cdf0e10cSrcweir {
800cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttributeNumerical );
801cdf0e10cSrcweir 	mpPageSyncData->mParaStructAttributes.push_back( eAttr );
802cdf0e10cSrcweir 	mpPageSyncData->mParaInts.push_back( nValue );
803cdf0e10cSrcweir 	return true;
804cdf0e10cSrcweir }
SetStructureBoundingBox(const Rectangle & rRect)805cdf0e10cSrcweir void PDFExtOutDevData::SetStructureBoundingBox( const Rectangle& rRect )
806cdf0e10cSrcweir {
807cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureBoundingBox );
808cdf0e10cSrcweir 	mpPageSyncData->mParaRects.push_back( rRect );
809cdf0e10cSrcweir }
SetActualText(const String & rText)810cdf0e10cSrcweir void PDFExtOutDevData::SetActualText( const String& rText )
811cdf0e10cSrcweir {
812cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetActualText );
813cdf0e10cSrcweir 	mpPageSyncData->mParaOUStrings.push_back( rText );
814cdf0e10cSrcweir }
SetAlternateText(const String & rText)815cdf0e10cSrcweir void PDFExtOutDevData::SetAlternateText( const String& rText )
816cdf0e10cSrcweir {
817cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetAlternateText );
818cdf0e10cSrcweir 	mpPageSyncData->mParaOUStrings.push_back( rText );
819cdf0e10cSrcweir }
820cdf0e10cSrcweir 
CreateControl(const PDFWriter::AnyWidget & rControlType,sal_Int32)821cdf0e10cSrcweir void PDFExtOutDevData::CreateControl( const PDFWriter::AnyWidget& rControlType, sal_Int32 /*nPageNr*/ )
822cdf0e10cSrcweir {
823cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::CreateControl );
824cdf0e10cSrcweir 
825cdf0e10cSrcweir     ::boost::shared_ptr< PDFWriter::AnyWidget > pClone( rControlType.Clone() );
826cdf0e10cSrcweir     mpPageSyncData->mControls.push_back( pClone );
827cdf0e10cSrcweir }
828cdf0e10cSrcweir 
BeginGroup()829cdf0e10cSrcweir void PDFExtOutDevData::BeginGroup()
830cdf0e10cSrcweir {
831cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginGroup );
832cdf0e10cSrcweir }
833cdf0e10cSrcweir 
EndGroup()834cdf0e10cSrcweir void PDFExtOutDevData::EndGroup()
835cdf0e10cSrcweir {
836cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroup );
837cdf0e10cSrcweir }
EndGroup(const Graphic & rGraphic,sal_uInt8 nTransparency,const Rectangle & rOutputRect,const Rectangle & rVisibleOutputRect)838cdf0e10cSrcweir void PDFExtOutDevData::EndGroup( const Graphic& 	rGraphic,
839cdf0e10cSrcweir                                  sal_uInt8				nTransparency,
840cdf0e10cSrcweir                                  const Rectangle& 	rOutputRect,
841cdf0e10cSrcweir                                  const Rectangle& 	rVisibleOutputRect )
842cdf0e10cSrcweir {
843cdf0e10cSrcweir 	mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroupGfxLink );
844cdf0e10cSrcweir 	mpPageSyncData->mGraphics.push_back( rGraphic );
845cdf0e10cSrcweir 	mpPageSyncData->mParaInts.push_back( nTransparency );
846cdf0e10cSrcweir 	mpPageSyncData->mParaRects.push_back( rOutputRect );
847cdf0e10cSrcweir 	mpPageSyncData->mParaRects.push_back( rVisibleOutputRect );
848cdf0e10cSrcweir }
849cdf0e10cSrcweir 
850cdf0e10cSrcweir }
851