blob: b60554b256a5f254618a89935e72dc94b566ed82 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_vcl.hxx"
#include "vcl/pdfextoutdevdata.hxx"
#include "vcl/graph.hxx"
#include "vcl/outdev.hxx"
#include "vcl/gfxlink.hxx"
#include "vcl/dllapi.h"
#include "basegfx/polygon/b2dpolygon.hxx"
#include "basegfx/polygon/b2dpolygontools.hxx"
#include <boost/shared_ptr.hpp>
#include <set>
#include <map>
namespace vcl
{
struct SAL_DLLPRIVATE PDFExtOutDevDataSync
{
enum Action{ CreateNamedDest,
CreateDest,
CreateLink,
SetLinkDest,
SetLinkURL,
RegisterDest,
CreateOutlineItem,
SetOutlineItemParent,
SetOutlineItemText,
SetOutlineItemDest,
CreateNote,
SetAutoAdvanceTime,
SetPageTransition,
BeginStructureElement,
EndStructureElement,
SetCurrentStructureElement,
SetStructureAttribute,
SetStructureAttributeNumerical,
SetStructureBoundingBox,
SetActualText,
SetAlternateText,
CreateControl,
BeginGroup,
EndGroup,
EndGroupGfxLink
};
sal_uInt32 nIdx;
Action eAct;
};
struct SAL_DLLPRIVATE PDFLinkDestination
{
Rectangle mRect;
MapMode mMapMode;
sal_Int32 mPageNr;
PDFWriter::DestAreaType mAreaType;
};
struct SAL_DLLPRIVATE GlobalSyncData
{
std::deque< PDFExtOutDevDataSync::Action > mActions;
std::deque< MapMode > mParaMapModes;
std::deque< Rectangle > mParaRects;
std::deque< sal_Int32 > mParaInts;
std::deque< sal_uInt32 > mParauInts;
std::deque< rtl::OUString > mParaOUStrings;
std::deque< PDFWriter::DestAreaType > mParaDestAreaTypes;
std::deque< PDFNote > mParaPDFNotes;
std::deque< PDFWriter::PageTransition > mParaPageTransitions;
::std::map< sal_Int32, PDFLinkDestination > mFutureDestinations;
sal_Int32 GetMappedId();
sal_Int32 GetMappedStructId( sal_Int32 );
sal_Int32 mCurId;
std::vector< sal_Int32 > mParaIds;
std::vector< sal_Int32 > mStructIdMap;
sal_Int32 mCurrentStructElement;
std::vector< sal_Int32 > mStructParents;
GlobalSyncData() :
mCurId ( 0 ),
mCurrentStructElement( 0 )
{
mStructParents.push_back( 0 );
mStructIdMap.push_back( 0 );
}
void PlayGlobalActions( PDFWriter& rWriter );
};
sal_Int32 GlobalSyncData::GetMappedId()
{
sal_Int32 nLinkId = mParaInts.front();
mParaInts.pop_front();
/* negative values are intentionally passed as invalid IDs
* e.g. to create a new top level outline item
*/
if( nLinkId >= 0 )
{
if ( (sal_uInt32)nLinkId < mParaIds.size() )
nLinkId = mParaIds[ nLinkId ];
else
nLinkId = -1;
DBG_ASSERT( nLinkId >= 0, "unmapped id in GlobalSyncData" );
}
return nLinkId;
}
sal_Int32 GlobalSyncData::GetMappedStructId( sal_Int32 nStructId )
{
if ( (sal_uInt32)nStructId < mStructIdMap.size() )
nStructId = mStructIdMap[ nStructId ];
else
nStructId = -1;
DBG_ASSERT( nStructId >= 0, "unmapped structure id in GlobalSyncData" );
return nStructId;
}
void GlobalSyncData::PlayGlobalActions( PDFWriter& rWriter )
{
std::deque< PDFExtOutDevDataSync::Action >::iterator aIter( mActions.begin() );
std::deque< PDFExtOutDevDataSync::Action >::iterator aEnd( mActions.end() );
while( aIter != aEnd )
{
switch( *aIter )
{
case PDFExtOutDevDataSync::CreateNamedDest : //i56629
{
rWriter.Push( PUSH_MAPMODE );
rWriter.SetMapMode( mParaMapModes.front() );
mParaMapModes.pop_front();
mParaIds.push_back( rWriter.CreateNamedDest( mParaOUStrings.front(), mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
mParaOUStrings.pop_front();
mParaRects.pop_front();
mParaInts.pop_front();
mParaDestAreaTypes.pop_front();
rWriter.Pop();
}
break;
case PDFExtOutDevDataSync::CreateDest :
{
rWriter.Push( PUSH_MAPMODE );
rWriter.SetMapMode( mParaMapModes.front() );
mParaMapModes.pop_front();
mParaIds.push_back( rWriter.CreateDest( mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
mParaRects.pop_front();
mParaInts.pop_front();
mParaDestAreaTypes.pop_front();
rWriter.Pop();
}
break;
case PDFExtOutDevDataSync::CreateLink :
{
rWriter.Push( PUSH_MAPMODE );
rWriter.SetMapMode( mParaMapModes.front() );
mParaMapModes.pop_front();
mParaIds.push_back( rWriter.CreateLink( mParaRects.front(), mParaInts.front() ) );
// resolve LinkAnnotation structural attribute
rWriter.SetLinkPropertyID( mParaIds.back(), sal_Int32(mParaIds.size()-1) );
mParaRects.pop_front();
mParaInts.pop_front();
rWriter.Pop();
}
break;
case PDFExtOutDevDataSync::SetLinkDest :
{
sal_Int32 nLinkId = GetMappedId();
sal_Int32 nDestId = GetMappedId();
rWriter.SetLinkDest( nLinkId, nDestId );
}
break;
case PDFExtOutDevDataSync::SetLinkURL :
{
sal_Int32 nLinkId = GetMappedId();
rWriter.SetLinkURL( nLinkId, mParaOUStrings.front() );
mParaOUStrings.pop_front();
}
break;
case PDFExtOutDevDataSync::RegisterDest :
{
const sal_Int32 nDestId = mParaInts.front();
mParaInts.pop_front();
OSL_ENSURE( mFutureDestinations.find( nDestId ) != mFutureDestinations.end(),
"GlobalSyncData::PlayGlobalActions: DescribeRegisteredRequest has not been called for that destination!" );
PDFLinkDestination& rDest = mFutureDestinations[ nDestId ];
rWriter.Push( PUSH_MAPMODE );
rWriter.SetMapMode( rDest.mMapMode );
mParaIds.push_back( rWriter.RegisterDestReference( nDestId, rDest.mRect, rDest.mPageNr, rDest.mAreaType ) );
rWriter.Pop();
}
break;
case PDFExtOutDevDataSync::CreateOutlineItem :
{
sal_Int32 nParent = GetMappedId();
sal_Int32 nLinkId = GetMappedId();
mParaIds.push_back( rWriter.CreateOutlineItem( nParent, mParaOUStrings.front(), nLinkId ) );
mParaOUStrings.pop_front();
}
break;
case PDFExtOutDevDataSync::SetOutlineItemParent :
{
sal_Int32 nItem = GetMappedId();
sal_Int32 nNewParent = GetMappedId();
rWriter.SetOutlineItemParent( nItem, nNewParent );
}
break;
case PDFExtOutDevDataSync::SetOutlineItemText :
{
sal_Int32 nItem = GetMappedId();
rWriter.SetOutlineItemText( nItem, mParaOUStrings.front() );
mParaOUStrings.pop_front();
}
break;
case PDFExtOutDevDataSync::SetOutlineItemDest :
{
sal_Int32 nItem = GetMappedId();
sal_Int32 nDestId = GetMappedId();
rWriter.SetOutlineItemDest( nItem, nDestId );
}
break;
case PDFExtOutDevDataSync::CreateNote :
{
rWriter.Push( PUSH_MAPMODE );
rWriter.SetMapMode( mParaMapModes.front() );
rWriter.CreateNote( mParaRects.front(), mParaPDFNotes.front(), mParaInts.front() );
mParaMapModes.pop_front();
mParaRects.pop_front();
mParaPDFNotes.pop_front();
mParaInts.pop_front();
}
break;
case PDFExtOutDevDataSync::SetAutoAdvanceTime :
{
rWriter.SetAutoAdvanceTime( mParauInts.front(), mParaInts.front() );
mParauInts.pop_front();
mParaInts.pop_front();
}
break;
case PDFExtOutDevDataSync::SetPageTransition :
{
rWriter.SetPageTransition( mParaPageTransitions.front(), mParauInts.front(), mParaInts.front() );
mParaPageTransitions.pop_front();
mParauInts.pop_front();
mParaInts.pop_front();
}
break;
case PDFExtOutDevDataSync::BeginStructureElement:
case PDFExtOutDevDataSync::EndStructureElement:
case PDFExtOutDevDataSync::SetCurrentStructureElement:
case PDFExtOutDevDataSync::SetStructureAttribute:
case PDFExtOutDevDataSync::SetStructureAttributeNumerical:
case PDFExtOutDevDataSync::SetStructureBoundingBox:
case PDFExtOutDevDataSync::SetActualText:
case PDFExtOutDevDataSync::SetAlternateText:
case PDFExtOutDevDataSync::CreateControl:
case PDFExtOutDevDataSync::BeginGroup:
case PDFExtOutDevDataSync::EndGroup:
case PDFExtOutDevDataSync::EndGroupGfxLink:
break;
}
aIter++;
}
}
struct PageSyncData
{
std::deque< PDFExtOutDevDataSync > mActions;
std::deque< Rectangle > mParaRects;
std::deque< sal_Int32 > mParaInts;
std::deque< rtl::OUString > mParaOUStrings;
std::deque< PDFWriter::StructElement > mParaStructElements;
std::deque< PDFWriter::StructAttribute > mParaStructAttributes;
std::deque< PDFWriter::StructAttributeValue > mParaStructAttributeValues;
std::deque< Graphic > mGraphics;
std::deque< ::boost::shared_ptr< PDFWriter::AnyWidget > >
mControls;
GlobalSyncData* mpGlobalData;
sal_Bool mbGroupIgnoreGDIMtfActions;
PageSyncData( GlobalSyncData* pGlobal ) : mbGroupIgnoreGDIMtfActions ( sal_False ) { mpGlobalData = pGlobal; }
void PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct );
sal_Bool PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData );
};
void PageSyncData::PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct )
{
GDIMetaFile* pMtf = rOutDev.GetConnectMetaFile();
DBG_ASSERT( pMtf, "PageSyncData::PushAction -> no ConnectMetaFile !!!" );
PDFExtOutDevDataSync aSync;
aSync.eAct = eAct;
if ( pMtf )
aSync.nIdx = pMtf->GetActionCount();
else
aSync.nIdx = 0x7fffffff; // sync not possible
mActions.push_back( aSync );
}
sal_Bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData )
{
sal_Bool bRet = sal_False;
if ( mActions.size() && ( mActions.front().nIdx == rCurGDIMtfAction ) )
{
bRet = sal_True;
PDFExtOutDevDataSync aDataSync = mActions.front();
mActions.pop_front();
switch( aDataSync.eAct )
{
case PDFExtOutDevDataSync::BeginStructureElement :
{
sal_Int32 nNewEl = rWriter.BeginStructureElement( mParaStructElements.front(), mParaOUStrings.front() ) ;
mParaStructElements.pop_front();
mParaOUStrings.pop_front();
mpGlobalData->mStructIdMap.push_back( nNewEl );
}
break;
case PDFExtOutDevDataSync::EndStructureElement :
{
rWriter.EndStructureElement();
}
break;
case PDFExtOutDevDataSync::SetCurrentStructureElement:
{
rWriter.SetCurrentStructureElement( mpGlobalData->GetMappedStructId( mParaInts.front() ) );
mParaInts.pop_front();
}
break;
case PDFExtOutDevDataSync::SetStructureAttribute :
{
rWriter.SetStructureAttribute( mParaStructAttributes.front(), mParaStructAttributeValues.front() );
mParaStructAttributeValues.pop_front();
mParaStructAttributes.pop_front();
}
break;
case PDFExtOutDevDataSync::SetStructureAttributeNumerical :
{
rWriter.SetStructureAttributeNumerical( mParaStructAttributes.front(), mParaInts.front() );
mParaStructAttributes.pop_front();
mParaInts.pop_front();
}
break;
case PDFExtOutDevDataSync::SetStructureBoundingBox :
{
rWriter.SetStructureBoundingBox( mParaRects.front() );
mParaRects.pop_front();
}
break;
case PDFExtOutDevDataSync::SetActualText :
{
rWriter.SetActualText( mParaOUStrings.front() );
mParaOUStrings.pop_front();
}
break;
case PDFExtOutDevDataSync::SetAlternateText :
{
rWriter.SetAlternateText( mParaOUStrings.front() );
mParaOUStrings.pop_front();
}
break;
case PDFExtOutDevDataSync::CreateControl:
{
::boost::shared_ptr< PDFWriter::AnyWidget > pControl( mControls.front() );
DBG_ASSERT( pControl.get(), "PageSyncData::PlaySyncPageAct: invalid widget!" );
if ( pControl.get() )
rWriter.CreateControl( *pControl );
mControls.pop_front();
}
break;
case PDFExtOutDevDataSync::BeginGroup :
{
/* first determining if this BeginGroup is starting a GfxLink,
by searching for a EndGroup or a EndGroupGfxLink */
mbGroupIgnoreGDIMtfActions = sal_False;
std::deque< PDFExtOutDevDataSync >::iterator aBeg = mActions.begin();
std::deque< PDFExtOutDevDataSync >::iterator aEnd = mActions.end();
while ( aBeg != aEnd )
{
if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroup )
{
break;
}
else if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroupGfxLink )
{
if ( rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution() )
{
Graphic& rGraphic = mGraphics.front();
if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
{
mbGroupIgnoreGDIMtfActions = sal_True;
}
}
break;
}
aBeg++;
}
}
break;
case PDFExtOutDevDataSync::EndGroup :
{
mbGroupIgnoreGDIMtfActions = sal_False;
}
break;
case PDFExtOutDevDataSync::EndGroupGfxLink :
{
sal_Int32 nTransparency;
Rectangle aOutputRect, aVisibleOutputRect;
Graphic aGraphic( mGraphics.front() );
mGraphics.pop_front();
nTransparency = mParaInts.front();
mParaInts.pop_front();
aOutputRect = mParaRects.front();
mParaRects.pop_front();
aVisibleOutputRect = mParaRects.front();
mParaRects.pop_front();
if ( mbGroupIgnoreGDIMtfActions )
{
sal_Bool bClippingNeeded = ( aOutputRect != aVisibleOutputRect ) && !aVisibleOutputRect.IsEmpty();
GfxLink aGfxLink( aGraphic.GetLink() );
if ( aGfxLink.GetType() == GFX_LINK_TYPE_NATIVE_JPG )
{
if ( bClippingNeeded )
{
rWriter.Push();
basegfx::B2DPolyPolygon aRect( basegfx::tools::createPolygonFromRect(
basegfx::B2DRectangle( aVisibleOutputRect.Left(), aVisibleOutputRect.Top(),
aVisibleOutputRect.Right(), aVisibleOutputRect.Bottom() ) ) );
rWriter.SetClipRegion( aRect);
}
Bitmap aMask;
SvMemoryStream aTmp;
const sal_uInt8* pData = aGfxLink.GetData();
sal_uInt32 nBytes = aGfxLink.GetDataSize();
if( pData && nBytes )
{
aTmp.Write( pData, nBytes );
rWriter.DrawJPGBitmap( aTmp, aGraphic.GetBitmap().GetBitCount() > 8, aGraphic.GetSizePixel(), aOutputRect, aMask );
}
if ( bClippingNeeded )
rWriter.Pop();
}
mbGroupIgnoreGDIMtfActions = sal_False;
}
}
break;
case PDFExtOutDevDataSync::CreateNamedDest:
case PDFExtOutDevDataSync::CreateDest:
case PDFExtOutDevDataSync::CreateLink:
case PDFExtOutDevDataSync::SetLinkDest:
case PDFExtOutDevDataSync::SetLinkURL:
case PDFExtOutDevDataSync::RegisterDest:
case PDFExtOutDevDataSync::CreateOutlineItem:
case PDFExtOutDevDataSync::SetOutlineItemParent:
case PDFExtOutDevDataSync::SetOutlineItemText:
case PDFExtOutDevDataSync::SetOutlineItemDest:
case PDFExtOutDevDataSync::CreateNote:
case PDFExtOutDevDataSync::SetAutoAdvanceTime:
case PDFExtOutDevDataSync::SetPageTransition:
break;
}
}
else if ( mbGroupIgnoreGDIMtfActions )
{
rCurGDIMtfAction++;
bRet = sal_True;
}
return bRet;
}
TYPEINIT1(PDFExtOutDevData,ExtOutDevData);
PDFExtOutDevData::PDFExtOutDevData( const OutputDevice& rOutDev ) :
mrOutDev ( rOutDev ),
mbTaggedPDF ( sal_False ),
mbExportNotes ( sal_True ),
mbExportNotesPages ( sal_False ),
mbTransitionEffects ( sal_True ),
mbUseLosslessCompression( sal_True ),
mbReduceImageResolution ( sal_False ),
mbExportNDests ( sal_False ),
mnFormsFormat ( 0 ),
mnPage ( -1 ),
mpPageSyncData ( NULL ),
mpGlobalSyncData ( new GlobalSyncData() )
{
mpPageSyncData = new PageSyncData( mpGlobalSyncData );
}
PDFExtOutDevData::~PDFExtOutDevData()
{
delete mpPageSyncData;
delete mpGlobalSyncData;
}
const com::sun::star::lang::Locale& PDFExtOutDevData::GetDocumentLocale() const
{
return maDocLocale;
}
void PDFExtOutDevData::SetDocumentLocale( const com::sun::star::lang::Locale& rLoc )
{
maDocLocale = rLoc;
}
sal_Int32 PDFExtOutDevData::GetCurrentPageNumber() const
{
return mnPage;
}
void PDFExtOutDevData::SetCurrentPageNumber( const sal_Int32 nPage )
{
mnPage = nPage;
}
sal_Bool PDFExtOutDevData::GetIsLosslessCompression() const
{
return mbUseLosslessCompression;
}
void PDFExtOutDevData::SetIsLosslessCompression( const sal_Bool bUseLosslessCompression )
{
mbUseLosslessCompression = bUseLosslessCompression;
}
sal_Bool PDFExtOutDevData::GetIsReduceImageResolution() const
{
return mbReduceImageResolution;
}
void PDFExtOutDevData::SetIsReduceImageResolution( const sal_Bool bReduceImageResolution )
{
mbReduceImageResolution = bReduceImageResolution;
}
sal_Bool PDFExtOutDevData::GetIsExportNotes() const
{
return mbExportNotes;
}
void PDFExtOutDevData::SetIsExportNotes( const sal_Bool bExportNotes )
{
mbExportNotes = bExportNotes;
}
sal_Bool PDFExtOutDevData::GetIsExportNotesPages() const
{
return mbExportNotesPages;
}
void PDFExtOutDevData::SetIsExportNotesPages( const sal_Bool bExportNotesPages )
{
mbExportNotesPages = bExportNotesPages;
}
sal_Bool PDFExtOutDevData::GetIsExportTaggedPDF() const
{
return mbTaggedPDF;
}
void PDFExtOutDevData::SetIsExportTaggedPDF( const sal_Bool bTaggedPDF )
{
mbTaggedPDF = bTaggedPDF;
}
sal_Bool PDFExtOutDevData::GetIsExportTransitionEffects() const
{
return mbTransitionEffects;
}
void PDFExtOutDevData::SetIsExportTransitionEffects( const sal_Bool bTransitionEffects )
{
mbTransitionEffects = bTransitionEffects;
}
sal_Bool PDFExtOutDevData::GetIsExportFormFields() const
{
return mbExportFormFields;
}
void PDFExtOutDevData::SetIsExportFormFields( const sal_Bool bExportFomtFields )
{
mbExportFormFields = bExportFomtFields;
}
sal_Int32 PDFExtOutDevData::GetFormsFormat() const
{
return mnFormsFormat;
}
void PDFExtOutDevData::SetFormsFormat( const sal_Int32 nFormsFormat )
{
mnFormsFormat = nFormsFormat;
}
sal_Bool PDFExtOutDevData::GetIsExportBookmarks() const
{
return mbExportBookmarks;
}
void PDFExtOutDevData::SetIsExportBookmarks( const sal_Bool bExportBookmarks )
{
mbExportBookmarks = bExportBookmarks;
}
std::vector< PDFExtOutDevBookmarkEntry >& PDFExtOutDevData::GetBookmarks()
{
return maBookmarks;
}
sal_Bool PDFExtOutDevData::GetIsExportNamedDestinations() const
{
return mbExportNDests;
}
void PDFExtOutDevData::SetIsExportNamedDestinations( const sal_Bool bExportNDests )
{
mbExportNDests = bExportNDests;
}
void PDFExtOutDevData::ResetSyncData()
{
*mpPageSyncData = PageSyncData( mpGlobalSyncData );
}
sal_Bool PDFExtOutDevData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rIdx )
{
return mpPageSyncData->PlaySyncPageAct( rWriter, rIdx, *this );
}
void PDFExtOutDevData::PlayGlobalActions( PDFWriter& rWriter )
{
mpGlobalSyncData->PlayGlobalActions( rWriter );
}
/* global actions, syncronisation to the recorded metafile isn't needed,
all actions will be played after the last page was recorded
*/
//--->i56629
sal_Int32 PDFExtOutDevData::CreateNamedDest(const String& sDestName, const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNamedDest );
mpGlobalSyncData->mParaOUStrings.push_back( sDestName );
mpGlobalSyncData->mParaRects.push_back( rRect );
mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
return mpGlobalSyncData->mCurId++;
}
//<---i56629
sal_Int32 PDFExtOutDevData::RegisterDest()
{
const sal_Int32 nLinkDestID = mpGlobalSyncData->mCurId++;
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::RegisterDest );
mpGlobalSyncData->mParaInts.push_back( nLinkDestID );
return nLinkDestID;
}
void PDFExtOutDevData::DescribeRegisteredDest( sal_Int32 nDestId, const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
{
OSL_PRECOND( nDestId != -1, "PDFExtOutDevData::DescribeRegisteredDest: invalid destination Id!" );
PDFLinkDestination aLinkDestination;
aLinkDestination.mRect = rRect;
aLinkDestination.mMapMode = mrOutDev.GetMapMode();
aLinkDestination.mPageNr = nPageNr == -1 ? mnPage : nPageNr;
aLinkDestination.mAreaType = eType;
mpGlobalSyncData->mFutureDestinations[ nDestId ] = aLinkDestination;
}
sal_Int32 PDFExtOutDevData::CreateDest( const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateDest );
mpGlobalSyncData->mParaRects.push_back( rRect );
mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
return mpGlobalSyncData->mCurId++;
}
sal_Int32 PDFExtOutDevData::CreateLink( const Rectangle& rRect, sal_Int32 nPageNr )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateLink );
mpGlobalSyncData->mParaRects.push_back( rRect );
mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
return mpGlobalSyncData->mCurId++;
}
sal_Int32 PDFExtOutDevData::SetLinkDest( sal_Int32 nLinkId, sal_Int32 nDestId )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkDest );
mpGlobalSyncData->mParaInts.push_back( nLinkId );
mpGlobalSyncData->mParaInts.push_back( nDestId );
return 0;
}
sal_Int32 PDFExtOutDevData::SetLinkURL( sal_Int32 nLinkId, const rtl::OUString& rURL )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkURL );
mpGlobalSyncData->mParaInts.push_back( nLinkId );
mpGlobalSyncData->mParaOUStrings.push_back( rURL );
return 0;
}
sal_Int32 PDFExtOutDevData::CreateOutlineItem( sal_Int32 nParent, const rtl::OUString& rText, sal_Int32 nDestID )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateOutlineItem );
mpGlobalSyncData->mParaInts.push_back( nParent );
mpGlobalSyncData->mParaOUStrings.push_back( rText );
mpGlobalSyncData->mParaInts.push_back( nDestID );
return mpGlobalSyncData->mCurId++;
}
sal_Int32 PDFExtOutDevData::SetOutlineItemParent( sal_Int32 nItem, sal_Int32 nNewParent )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemParent );
mpGlobalSyncData->mParaInts.push_back( nItem );
mpGlobalSyncData->mParaInts.push_back( nNewParent );
return 0;
}
sal_Int32 PDFExtOutDevData::SetOutlineItemText( sal_Int32 nItem, const rtl::OUString& rText )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemText );
mpGlobalSyncData->mParaInts.push_back( nItem );
mpGlobalSyncData->mParaOUStrings.push_back( rText );
return 0;
}
sal_Int32 PDFExtOutDevData::SetOutlineItemDest( sal_Int32 nItem, sal_Int32 nDestID )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemDest );
mpGlobalSyncData->mParaInts.push_back( nItem );
mpGlobalSyncData->mParaInts.push_back( nDestID );
return 0;
}
void PDFExtOutDevData::CreateNote( const Rectangle& rRect, const PDFNote& rNote, sal_Int32 nPageNr )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNote );
mpGlobalSyncData->mParaRects.push_back( rRect );
mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
mpGlobalSyncData->mParaPDFNotes.push_back( rNote );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
}
void PDFExtOutDevData::SetAutoAdvanceTime( sal_uInt32 nSeconds, sal_Int32 nPageNr )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetAutoAdvanceTime );
mpGlobalSyncData->mParauInts.push_back( nSeconds );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
}
void PDFExtOutDevData::SetPageTransition( PDFWriter::PageTransition eType, sal_uInt32 nMilliSec, sal_Int32 nPageNr )
{
mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetPageTransition );
mpGlobalSyncData->mParaPageTransitions.push_back( eType );
mpGlobalSyncData->mParauInts.push_back( nMilliSec );
mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
}
/* local (page), actions have to be played synchroniously to the actions of
of the recorded metafile (created by each xRenderable->render()) */
sal_Int32 PDFExtOutDevData::BeginStructureElement( PDFWriter::StructElement eType, const rtl::OUString& rAlias )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginStructureElement );
mpPageSyncData->mParaStructElements.push_back( eType );
mpPageSyncData->mParaOUStrings.push_back( rAlias );
// need a global id
sal_Int32 nNewId = mpGlobalSyncData->mStructParents.size();
mpGlobalSyncData->mStructParents.push_back( mpGlobalSyncData->mCurrentStructElement );
mpGlobalSyncData->mCurrentStructElement = nNewId;
return nNewId;
}
void PDFExtOutDevData::EndStructureElement()
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndStructureElement );
mpGlobalSyncData->mCurrentStructElement = mpGlobalSyncData->mStructParents[ mpGlobalSyncData->mCurrentStructElement ];
}
bool PDFExtOutDevData::SetCurrentStructureElement( sal_Int32 nStructId )
{
bool bSuccess = false;
if( sal_uInt32(nStructId) < mpGlobalSyncData->mStructParents.size() )
{
mpGlobalSyncData->mCurrentStructElement = nStructId;
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetCurrentStructureElement );
mpPageSyncData->mParaInts.push_back( nStructId );
bSuccess = true;
}
return bSuccess;
}
sal_Int32 PDFExtOutDevData::GetCurrentStructureElement()
{
return mpGlobalSyncData->mCurrentStructElement;
}
bool PDFExtOutDevData::SetStructureAttribute( PDFWriter::StructAttribute eAttr, PDFWriter::StructAttributeValue eVal )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttribute );
mpPageSyncData->mParaStructAttributes.push_back( eAttr );
mpPageSyncData->mParaStructAttributeValues.push_back( eVal );
return true;
}
bool PDFExtOutDevData::SetStructureAttributeNumerical( PDFWriter::StructAttribute eAttr, sal_Int32 nValue )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttributeNumerical );
mpPageSyncData->mParaStructAttributes.push_back( eAttr );
mpPageSyncData->mParaInts.push_back( nValue );
return true;
}
void PDFExtOutDevData::SetStructureBoundingBox( const Rectangle& rRect )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureBoundingBox );
mpPageSyncData->mParaRects.push_back( rRect );
}
void PDFExtOutDevData::SetActualText( const String& rText )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetActualText );
mpPageSyncData->mParaOUStrings.push_back( rText );
}
void PDFExtOutDevData::SetAlternateText( const String& rText )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetAlternateText );
mpPageSyncData->mParaOUStrings.push_back( rText );
}
void PDFExtOutDevData::CreateControl( const PDFWriter::AnyWidget& rControlType, sal_Int32 /*nPageNr*/ )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::CreateControl );
::boost::shared_ptr< PDFWriter::AnyWidget > pClone( rControlType.Clone() );
mpPageSyncData->mControls.push_back( pClone );
}
void PDFExtOutDevData::BeginGroup()
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginGroup );
}
void PDFExtOutDevData::EndGroup()
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroup );
}
void PDFExtOutDevData::EndGroup( const Graphic& rGraphic,
sal_uInt8 nTransparency,
const Rectangle& rOutputRect,
const Rectangle& rVisibleOutputRect )
{
mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroupGfxLink );
mpPageSyncData->mGraphics.push_back( rGraphic );
mpPageSyncData->mParaInts.push_back( nTransparency );
mpPageSyncData->mParaRects.push_back( rOutputRect );
mpPageSyncData->mParaRects.push_back( rVisibleOutputRect );
}
}