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