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