1f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5f6e50924SAndrew Rist  * distributed with this work for additional information
6f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10f6e50924SAndrew Rist  *
11f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12f6e50924SAndrew Rist  *
13f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17f6e50924SAndrew Rist  * specific language governing permissions and limitations
18f6e50924SAndrew Rist  * under the License.
19f6e50924SAndrew Rist  *
20f6e50924SAndrew Rist  *************************************************************/
21f6e50924SAndrew Rist 
22f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <vector>
28cdf0e10cSrcweir #include <vos/mutex.hxx>
29cdf0e10cSrcweir #include <com/sun/star/io/XOutputStream.hpp>
30cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp>
31cdf0e10cSrcweir #include <com/sun/star/frame/XModel.hpp>
32cdf0e10cSrcweir #include <com/sun/star/document/XFilter.hpp>
33cdf0e10cSrcweir #include <com/sun/star/document/XExporter.hpp>
34cdf0e10cSrcweir #include <com/sun/star/document/XMimeTypeInfo.hpp>
35cdf0e10cSrcweir #include <com/sun/star/lang/XServiceInfo.hpp>
36cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp>
37cdf0e10cSrcweir #include <com/sun/star/drawing/XShape.hpp>
38cdf0e10cSrcweir #include <com/sun/star/drawing/XDrawPage.hpp>
39cdf0e10cSrcweir #include <com/sun/star/graphic/XGraphic.hpp>
40cdf0e10cSrcweir #include <com/sun/star/graphic/XGraphicRenderer.hpp>
41cdf0e10cSrcweir #include <com/sun/star/task/XStatusIndicator.hpp>
42cdf0e10cSrcweir #include <com/sun/star/task/XInteractionHandler.hpp>
43cdf0e10cSrcweir #include <com/sun/star/task/XInteractionContinuation.hpp>
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #include <comphelper/interaction.hxx>
46cdf0e10cSrcweir #include <framework/interaction.hxx>
47cdf0e10cSrcweir #include <com/sun/star/drawing/GraphicFilterRequest.hpp>
48cdf0e10cSrcweir #include <com/sun/star/util/URL.hpp>
49cdf0e10cSrcweir #include <cppuhelper/implbase4.hxx>
50cdf0e10cSrcweir #include <osl/diagnose.h>
51cdf0e10cSrcweir #include <osl/mutex.hxx>
52cdf0e10cSrcweir #include <vcl/metaact.hxx>
53cdf0e10cSrcweir #include <vcl/svapp.hxx>
54cdf0e10cSrcweir #include <vcl/virdev.hxx>
55cdf0e10cSrcweir #include <svtools/FilterConfigItem.hxx>
56cdf0e10cSrcweir #include <svl/outstrm.hxx>
57cdf0e10cSrcweir #include <svx/sdr/contact/objectcontactofobjlistpainter.hxx>
58cdf0e10cSrcweir #include <svx/sdr/contact/viewobjectcontact.hxx>
59cdf0e10cSrcweir #include <svx/sdr/contact/viewcontact.hxx>
60cdf0e10cSrcweir #include <svx/sdr/contact/displayinfo.hxx>
61cdf0e10cSrcweir #include <svx/sdr/contact/viewcontactofsdrobj.hxx>
62cdf0e10cSrcweir #include <editeng/numitem.hxx>
63cdf0e10cSrcweir #include <svx/svdpagv.hxx>
64cdf0e10cSrcweir #include <svx/svdograf.hxx>
65cdf0e10cSrcweir #include "svx/xoutbmp.hxx"
66cdf0e10cSrcweir #include "svtools/filter.hxx"
67cdf0e10cSrcweir #include "svx/unoapi.hxx"
68cdf0e10cSrcweir #include <svx/svdpage.hxx>
69cdf0e10cSrcweir #include <svx/svdmodel.hxx>
70cdf0e10cSrcweir #include <svx/fmview.hxx>
71cdf0e10cSrcweir #include <svx/fmmodel.hxx>
72cdf0e10cSrcweir #include <svx/unopage.hxx>
73cdf0e10cSrcweir #include <svx/pageitem.hxx>
74cdf0e10cSrcweir #include <editeng/eeitem.hxx>
75cdf0e10cSrcweir #include <svx/svdoutl.hxx>
76cdf0e10cSrcweir #include <editeng/flditem.hxx>
77cdf0e10cSrcweir 
78cdf0e10cSrcweir #include "boost/scoped_ptr.hpp"
79cdf0e10cSrcweir 
80cdf0e10cSrcweir #define MAX_EXT_PIX			2048
81cdf0e10cSrcweir 
82cdf0e10cSrcweir using namespace ::comphelper;
83cdf0e10cSrcweir using namespace ::osl;
84cdf0e10cSrcweir using namespace ::vos;
85cdf0e10cSrcweir using ::rtl::OUString;
86cdf0e10cSrcweir using namespace ::cppu;
87cdf0e10cSrcweir using namespace ::com::sun::star;
88cdf0e10cSrcweir using namespace ::com::sun::star::uno;
89cdf0e10cSrcweir using namespace ::com::sun::star::util;
90cdf0e10cSrcweir using namespace ::com::sun::star::container;
91cdf0e10cSrcweir using namespace ::com::sun::star::drawing;
92cdf0e10cSrcweir using namespace ::com::sun::star::lang;
93cdf0e10cSrcweir using namespace ::com::sun::star::document;
94cdf0e10cSrcweir using namespace ::com::sun::star::frame;
95cdf0e10cSrcweir using namespace ::com::sun::star::beans;
96cdf0e10cSrcweir using namespace ::com::sun::star::task;
97cdf0e10cSrcweir #include <svx/sdr/contact/viewobjectcontactredirector.hxx>
98cdf0e10cSrcweir #include <svx/sdr/contact/viewobjectcontact.hxx>
99cdf0e10cSrcweir #include <svx/sdr/contact/viewcontact.hxx>
100cdf0e10cSrcweir 
101cdf0e10cSrcweir // #i102251#
102cdf0e10cSrcweir #include <editeng/editstat.hxx>
103cdf0e10cSrcweir 
104cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
105cdf0e10cSrcweir 
106cdf0e10cSrcweir namespace svx
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	struct ExportSettings
109cdf0e10cSrcweir 	{
110cdf0e10cSrcweir 		OUString maFilterName;
111cdf0e10cSrcweir 		OUString maMediaType;
112cdf0e10cSrcweir 		URL maURL;
113cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > mxOutputStream;
114cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::graphic::XGraphicRenderer > mxGraphicRenderer;
115cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::task::XStatusIndicator >	mxStatusIndicator;
116cdf0e10cSrcweir 		com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler >	mxInteractionHandler;
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 		sal_Int32 mnWidth;
119cdf0e10cSrcweir 		sal_Int32 mnHeight;
120cdf0e10cSrcweir 		sal_Bool mbExportOnlyBackground;
121cdf0e10cSrcweir 		sal_Bool mbVerboseComments;
122cdf0e10cSrcweir 		sal_Bool mbScrollText;
123cdf0e10cSrcweir 		sal_Bool mbUseHighContrast;
124cdf0e10cSrcweir 		sal_Bool mbTranslucent;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 		Sequence< PropertyValue >	maFilterData;
127cdf0e10cSrcweir 
128cdf0e10cSrcweir 		Fraction    maScaleX;
129cdf0e10cSrcweir 		Fraction    maScaleY;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir 		ExportSettings( SdrModel* pDoc );
132cdf0e10cSrcweir 	};
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	ExportSettings::ExportSettings( SdrModel* pDoc )
135cdf0e10cSrcweir 	: mnWidth( 0 )
136cdf0e10cSrcweir 	, mnHeight( 0 )
137cdf0e10cSrcweir 	, mbExportOnlyBackground( false )
138cdf0e10cSrcweir 	, mbVerboseComments( false )
139cdf0e10cSrcweir 	, mbScrollText( false )
140cdf0e10cSrcweir 	, mbUseHighContrast( false )
141cdf0e10cSrcweir 	, mbTranslucent( sal_False )
142cdf0e10cSrcweir 	, maScaleX( 1, 1 )
143cdf0e10cSrcweir 	, maScaleY( 1, 1 )
144cdf0e10cSrcweir 	{
145cdf0e10cSrcweir 		if( pDoc )
146cdf0e10cSrcweir 		{
147cdf0e10cSrcweir 			maScaleX = pDoc->GetScaleFraction();
148cdf0e10cSrcweir 			maScaleY = pDoc->GetScaleFraction();
149cdf0e10cSrcweir 		}
150cdf0e10cSrcweir 	}
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 	/**	implements a component to export shapes or pages to external graphic formats.
153cdf0e10cSrcweir 
154cdf0e10cSrcweir 		@implements com.sun.star.drawing.GraphicExportFilter
155cdf0e10cSrcweir 	*/
156cdf0e10cSrcweir 	class GraphicExporter : public WeakImplHelper4< XFilter, XExporter, XServiceInfo, XMimeTypeInfo >
157cdf0e10cSrcweir 	{
158cdf0e10cSrcweir 	public:
159cdf0e10cSrcweir 		GraphicExporter();
160cdf0e10cSrcweir 		virtual ~GraphicExporter();
161cdf0e10cSrcweir 
162cdf0e10cSrcweir 		// XFilter
163cdf0e10cSrcweir 		virtual sal_Bool SAL_CALL filter( const Sequence< PropertyValue >& aDescriptor ) throw(RuntimeException);
164cdf0e10cSrcweir 		virtual void SAL_CALL cancel(  ) throw(RuntimeException);
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 		// XExporter
167cdf0e10cSrcweir 		virtual void SAL_CALL setSourceDocument( const Reference< XComponent >& xDoc ) throw(IllegalArgumentException, RuntimeException);
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 		// XServiceInfo
170cdf0e10cSrcweir 		virtual OUString SAL_CALL getImplementationName(  ) throw(RuntimeException);
171cdf0e10cSrcweir 		virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) throw(RuntimeException);
172cdf0e10cSrcweir 		virtual Sequence< OUString > SAL_CALL getSupportedServiceNames(  ) throw(RuntimeException);
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 		// XMimeTypeInfo
175cdf0e10cSrcweir 		virtual sal_Bool SAL_CALL supportsMimeType( const ::rtl::OUString& MimeTypeName ) throw (RuntimeException);
176cdf0e10cSrcweir 		virtual Sequence< OUString > SAL_CALL getSupportedMimeTypeNames(  ) throw (RuntimeException);
177cdf0e10cSrcweir 
178cdf0e10cSrcweir 		VirtualDevice* CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWidthPixel, sal_uIntPtr nHeightPixel ) const;
179cdf0e10cSrcweir 
180cdf0e10cSrcweir 		DECL_LINK( CalcFieldValueHdl, EditFieldInfo* );
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 		void ParseSettings( const Sequence< PropertyValue >& aDescriptor, ExportSettings& rSettings );
183cdf0e10cSrcweir 		bool GetGraphic( ExportSettings& rSettings, Graphic& aGraphic, sal_Bool bVectorType );
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	private:
186cdf0e10cSrcweir 		Reference< XShape >		mxShape;
187cdf0e10cSrcweir 		Reference< XDrawPage >	mxPage;
188cdf0e10cSrcweir 		Reference< XShapes >	mxShapes;
189cdf0e10cSrcweir 
190cdf0e10cSrcweir 		SvxDrawPage*		mpUnoPage;
191cdf0e10cSrcweir 
192cdf0e10cSrcweir 		Link				maOldCalcFieldValueHdl;
193cdf0e10cSrcweir 		sal_Int32			mnPageNumber;
194cdf0e10cSrcweir 		SdrPage*			mpCurrentPage;
195cdf0e10cSrcweir 		SdrModel*			mpDoc;
196cdf0e10cSrcweir 	};
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 	SVX_DLLPUBLIC Reference< XInterface > SAL_CALL GraphicExporter_createInstance(const Reference< XMultiServiceFactory > & )
199cdf0e10cSrcweir 		throw( Exception )
200cdf0e10cSrcweir 	{
201cdf0e10cSrcweir 		return (XWeak*)new GraphicExporter();
202cdf0e10cSrcweir 	}
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 	SVX_DLLPUBLIC Sequence< OUString > SAL_CALL GraphicExporter_getSupportedServiceNames()
205cdf0e10cSrcweir 		throw()
206cdf0e10cSrcweir 	{
207cdf0e10cSrcweir 		Sequence< OUString > aSupportedServiceNames( 1 );
208cdf0e10cSrcweir 		aSupportedServiceNames[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GraphicExportFilter" ) );
209cdf0e10cSrcweir 		return aSupportedServiceNames;
210cdf0e10cSrcweir 	}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 	SVX_DLLPUBLIC OUString SAL_CALL GraphicExporter_getImplementationName()
213cdf0e10cSrcweir 		throw()
214cdf0e10cSrcweir 	{
215cdf0e10cSrcweir 		return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Draw.GraphicExporter" ) );
216cdf0e10cSrcweir 	}
217cdf0e10cSrcweir 
218cdf0e10cSrcweir 	/** creates a bitmap that is optionaly transparent from a metafile
219cdf0e10cSrcweir 	*/
220cdf0e10cSrcweir 	BitmapEx GetBitmapFromMetaFile( const GDIMetaFile& rMtf, sal_Bool bTransparent, const Size* pSize )
221cdf0e10cSrcweir 	{
222cdf0e10cSrcweir 		Graphic     aGraphic( rMtf );
223cdf0e10cSrcweir 		BitmapEx	aBmpEx;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir         // #i102089# support user's settings of AA and LineSnap when the MetaFile gets
226cdf0e10cSrcweir         // rasterconverted to a bitmap
227cdf0e10cSrcweir         const SvtOptionsDrawinglayer aDrawinglayerOpt;
228cdf0e10cSrcweir         const GraphicConversionParameters aParameters(
229cdf0e10cSrcweir             pSize ? *pSize : Size(0, 0),
230cdf0e10cSrcweir             true, // allow unlimited size
231cdf0e10cSrcweir             aDrawinglayerOpt.IsAntiAliasing(),
232cdf0e10cSrcweir             aDrawinglayerOpt.IsSnapHorVerLinesToDiscrete());
233cdf0e10cSrcweir 
234cdf0e10cSrcweir 		if( bTransparent )
235cdf0e10cSrcweir 		{
236cdf0e10cSrcweir 			Graphic aMaskGraphic(rMtf.GetMonochromeMtf(COL_BLACK));
237cdf0e10cSrcweir 			Bitmap  aMaskBmp(aMaskGraphic.GetBitmap(aParameters));
238cdf0e10cSrcweir 
239cdf0e10cSrcweir 			aMaskBmp.Convert(BMP_CONVERSION_1BIT_THRESHOLD);
240cdf0e10cSrcweir 			aBmpEx = BitmapEx(aGraphic.GetBitmap(aParameters), aMaskBmp);
241cdf0e10cSrcweir 		}
242cdf0e10cSrcweir 		else
243cdf0e10cSrcweir         {
244cdf0e10cSrcweir 			aBmpEx = BitmapEx(aGraphic.GetBitmap(aParameters));
245cdf0e10cSrcweir         }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 		aBmpEx.SetPrefMapMode( rMtf.GetPrefMapMode() );
248cdf0e10cSrcweir 		aBmpEx.SetPrefSize( rMtf.GetPrefSize() );
249cdf0e10cSrcweir 
250cdf0e10cSrcweir 		return aBmpEx;
251cdf0e10cSrcweir 	}
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 	Size* CalcSize( sal_Int32 nWidth, sal_Int32 nHeight, const Size& aBoundSize, Size& aOutSize )
254cdf0e10cSrcweir 	{
255cdf0e10cSrcweir 		if( (nWidth == 0) && (nHeight == 0) )
256cdf0e10cSrcweir 			return NULL;
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 		if( (nWidth == 0) && (nHeight != 0) && (aBoundSize.Height() != 0) )
259cdf0e10cSrcweir 		{
260cdf0e10cSrcweir 			nWidth = ( nHeight * aBoundSize.Width() ) / aBoundSize.Height();
261cdf0e10cSrcweir 		}
262cdf0e10cSrcweir 		else if( (nWidth != 0) && (nHeight == 0) && (aBoundSize.Width() != 0) )
263cdf0e10cSrcweir 		{
264cdf0e10cSrcweir 			nHeight = ( nWidth * aBoundSize.Height() ) / aBoundSize.Width();
265cdf0e10cSrcweir 		}
266cdf0e10cSrcweir 
267cdf0e10cSrcweir 		aOutSize.Width() = nWidth;
268cdf0e10cSrcweir 		aOutSize.Height() = nHeight;
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 		return &aOutSize;
271cdf0e10cSrcweir 	}
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
274cdf0e10cSrcweir class ImplExportCheckVisisbilityRedirector : public ::sdr::contact::ViewObjectContactRedirector
275cdf0e10cSrcweir {
276cdf0e10cSrcweir public:
277cdf0e10cSrcweir 	ImplExportCheckVisisbilityRedirector( SdrPage* pCurrentPage );
278cdf0e10cSrcweir 	virtual ~ImplExportCheckVisisbilityRedirector();
279cdf0e10cSrcweir 
280cdf0e10cSrcweir 	virtual drawinglayer::primitive2d::Primitive2DSequence createRedirectedPrimitive2DSequence(
281cdf0e10cSrcweir 		const sdr::contact::ViewObjectContact& rOriginal,
282cdf0e10cSrcweir 		const sdr::contact::DisplayInfo& rDisplayInfo);
283cdf0e10cSrcweir 
284cdf0e10cSrcweir private:
285cdf0e10cSrcweir 	SdrPage*	mpCurrentPage;
286cdf0e10cSrcweir };
287cdf0e10cSrcweir 
288cdf0e10cSrcweir ImplExportCheckVisisbilityRedirector::ImplExportCheckVisisbilityRedirector( SdrPage* pCurrentPage )
289cdf0e10cSrcweir :	ViewObjectContactRedirector(), mpCurrentPage( pCurrentPage )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir ImplExportCheckVisisbilityRedirector::~ImplExportCheckVisisbilityRedirector()
294cdf0e10cSrcweir {
295cdf0e10cSrcweir }
296cdf0e10cSrcweir 
297cdf0e10cSrcweir drawinglayer::primitive2d::Primitive2DSequence ImplExportCheckVisisbilityRedirector::createRedirectedPrimitive2DSequence(
298cdf0e10cSrcweir 	const sdr::contact::ViewObjectContact& rOriginal,
299cdf0e10cSrcweir 	const sdr::contact::DisplayInfo& rDisplayInfo)
300cdf0e10cSrcweir {
301cdf0e10cSrcweir 	SdrObject* pObject = rOriginal.GetViewContact().TryToGetSdrObject();
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	if(pObject)
304cdf0e10cSrcweir 	{
305cdf0e10cSrcweir 		SdrPage* pPage = mpCurrentPage;
306cdf0e10cSrcweir 		if( pPage == 0 )
307cdf0e10cSrcweir 			pPage = pObject->GetPage();
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 		if( (pPage == 0) || pPage->checkVisibility(rOriginal, rDisplayInfo, false) )
310cdf0e10cSrcweir 		{
311cdf0e10cSrcweir 			return ::sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
312cdf0e10cSrcweir 		}
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 		return drawinglayer::primitive2d::Primitive2DSequence();
315cdf0e10cSrcweir 	}
316cdf0e10cSrcweir 	else
317cdf0e10cSrcweir 	{
318cdf0e10cSrcweir 		// not an object, maybe a page
319cdf0e10cSrcweir 		return ::sdr::contact::ViewObjectContactRedirector::createRedirectedPrimitive2DSequence(rOriginal, rDisplayInfo);
320cdf0e10cSrcweir 	}
321cdf0e10cSrcweir }
322cdf0e10cSrcweir 
323cdf0e10cSrcweir using namespace ::svx;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir GraphicExporter::GraphicExporter()
326cdf0e10cSrcweir : mpUnoPage( NULL ), mnPageNumber(-1), mpCurrentPage(0), mpDoc( NULL )
327cdf0e10cSrcweir {
328cdf0e10cSrcweir }
329cdf0e10cSrcweir 
330cdf0e10cSrcweir GraphicExporter::~GraphicExporter()
331cdf0e10cSrcweir {
332cdf0e10cSrcweir }
333cdf0e10cSrcweir 
334cdf0e10cSrcweir IMPL_LINK(GraphicExporter, CalcFieldValueHdl, EditFieldInfo*, pInfo)
335cdf0e10cSrcweir {
336cdf0e10cSrcweir 	if( pInfo )
337cdf0e10cSrcweir 	{
338cdf0e10cSrcweir 		if( mpCurrentPage )
339cdf0e10cSrcweir 		{
340cdf0e10cSrcweir 			pInfo->SetSdrPage( mpCurrentPage );
341cdf0e10cSrcweir 		}
342cdf0e10cSrcweir 		else if( mnPageNumber != -1 )
343cdf0e10cSrcweir 		{
344cdf0e10cSrcweir 			const SvxFieldData* pField = pInfo->GetField().GetField();
345cdf0e10cSrcweir 			if( pField && pField->ISA( SvxPageField ) )
346cdf0e10cSrcweir 			{
347cdf0e10cSrcweir 				String aPageNumValue;
348cdf0e10cSrcweir 				sal_Bool bUpper = sal_False;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 				switch(mpDoc->GetPageNumType())
351cdf0e10cSrcweir 				{
352cdf0e10cSrcweir 					case SVX_CHARS_UPPER_LETTER:
353cdf0e10cSrcweir 						aPageNumValue += (sal_Unicode)(char)((mnPageNumber - 1) % 26 + 'A');
354cdf0e10cSrcweir 						break;
355cdf0e10cSrcweir 					case SVX_CHARS_LOWER_LETTER:
356cdf0e10cSrcweir 						aPageNumValue += (sal_Unicode)(char)((mnPageNumber - 1) % 26 + 'a');
357cdf0e10cSrcweir 						break;
358cdf0e10cSrcweir 					case SVX_ROMAN_UPPER:
359cdf0e10cSrcweir 						bUpper = sal_True;
360cdf0e10cSrcweir 					case SVX_ROMAN_LOWER:
361cdf0e10cSrcweir 						aPageNumValue += SvxNumberFormat::CreateRomanString(mnPageNumber, bUpper);
362cdf0e10cSrcweir 						break;
363cdf0e10cSrcweir 					case SVX_NUMBER_NONE:
364cdf0e10cSrcweir 						aPageNumValue.Erase();
365cdf0e10cSrcweir 						aPageNumValue += sal_Unicode(' ');
366cdf0e10cSrcweir 						break;
367cdf0e10cSrcweir 					default:
368cdf0e10cSrcweir 						aPageNumValue += String::CreateFromInt32( (sal_Int32)mnPageNumber );
369cdf0e10cSrcweir 				}
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 				pInfo->SetRepresentation( aPageNumValue );
372cdf0e10cSrcweir 
373cdf0e10cSrcweir 				return(0);
374cdf0e10cSrcweir 			}
375cdf0e10cSrcweir 		}
376cdf0e10cSrcweir 	}
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	long nRet = maOldCalcFieldValueHdl.Call( pInfo );
379cdf0e10cSrcweir 
380cdf0e10cSrcweir 	if( pInfo && mpCurrentPage )
381cdf0e10cSrcweir 		pInfo->SetSdrPage( 0 );
382cdf0e10cSrcweir 
383cdf0e10cSrcweir 	return nRet;
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386cdf0e10cSrcweir /** creates an virtual device for the given page
387cdf0e10cSrcweir 
388cdf0e10cSrcweir 	@return	the returned VirtualDevice is owned by the caller
389cdf0e10cSrcweir */
390cdf0e10cSrcweir VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWidthPixel, sal_uIntPtr nHeightPixel ) const
391cdf0e10cSrcweir {
392cdf0e10cSrcweir 	VirtualDevice*	pVDev = new VirtualDevice();
393cdf0e10cSrcweir 	MapMode			aMM( MAP_100TH_MM );
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 	Point aPoint( 0, 0 );
396cdf0e10cSrcweir 	Size aPageSize(pPage->GetSize());
397cdf0e10cSrcweir 
398cdf0e10cSrcweir 	// use scaling?
399cdf0e10cSrcweir 	if( nWidthPixel )
400cdf0e10cSrcweir 	{
401cdf0e10cSrcweir 		const Fraction aFrac( (long) nWidthPixel, pVDev->LogicToPixel( aPageSize, aMM ).Width() );
402cdf0e10cSrcweir 
403cdf0e10cSrcweir 		aMM.SetScaleX( aFrac );
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 		if( nHeightPixel == 0 )
406cdf0e10cSrcweir 			aMM.SetScaleY( aFrac );
407cdf0e10cSrcweir 	}
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 	if( nHeightPixel )
410cdf0e10cSrcweir 	{
411cdf0e10cSrcweir 		const Fraction aFrac( (long) nHeightPixel, pVDev->LogicToPixel( aPageSize, aMM ).Height() );
412cdf0e10cSrcweir 
413cdf0e10cSrcweir 		if( nWidthPixel == 0 )
414cdf0e10cSrcweir 			aMM.SetScaleX( aFrac );
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 		aMM.SetScaleY( aFrac );
417cdf0e10cSrcweir 	}
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 	pVDev->SetMapMode( aMM );
420cdf0e10cSrcweir #ifdef DBG_UTIL
421cdf0e10cSrcweir 	sal_Bool bAbort = !
422cdf0e10cSrcweir #endif
423cdf0e10cSrcweir 		pVDev->SetOutputSize(aPageSize);
424cdf0e10cSrcweir 	DBG_ASSERT(!bAbort, "virt. Device nicht korrekt erzeugt");
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 	SdrView* pView = new SdrView(mpDoc, pVDev);
427cdf0e10cSrcweir 	pView->SetPageVisible( sal_False );
428cdf0e10cSrcweir 	pView->SetBordVisible( sal_False );
429cdf0e10cSrcweir 	pView->SetGridVisible( sal_False );
430cdf0e10cSrcweir 	pView->SetHlplVisible( sal_False );
431cdf0e10cSrcweir 	pView->SetGlueVisible( sal_False );
432cdf0e10cSrcweir 	pView->ShowSdrPage(pPage);
433cdf0e10cSrcweir 	Region aRegion (Rectangle( aPoint, aPageSize ) );
434cdf0e10cSrcweir 
435cdf0e10cSrcweir 	ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 	pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
438cdf0e10cSrcweir 
439cdf0e10cSrcweir 	delete pView;
440cdf0e10cSrcweir 	return pVDev;
441cdf0e10cSrcweir }
442cdf0e10cSrcweir 
443cdf0e10cSrcweir void GraphicExporter::ParseSettings( const Sequence< PropertyValue >& aDescriptor, ExportSettings& rSettings )
444cdf0e10cSrcweir {
445cdf0e10cSrcweir 	sal_Int32 nArgs = aDescriptor.getLength();
446cdf0e10cSrcweir 	const PropertyValue* pValues = aDescriptor.getConstArray();
447cdf0e10cSrcweir 	while( nArgs-- )
448cdf0e10cSrcweir 	{
449cdf0e10cSrcweir 		if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FilterName" ) ) )
450cdf0e10cSrcweir 		{
451cdf0e10cSrcweir 			pValues->Value >>= rSettings.maFilterName;
452cdf0e10cSrcweir 		}
453cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MediaType" ) ) )
454cdf0e10cSrcweir 		{
455cdf0e10cSrcweir 			pValues->Value >>= rSettings.maMediaType;
456cdf0e10cSrcweir 		}
457cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "URL" ) ) )
458cdf0e10cSrcweir 		{
459cdf0e10cSrcweir 			if( !( pValues->Value >>= rSettings.maURL ) )
460cdf0e10cSrcweir 			{
461cdf0e10cSrcweir 				pValues->Value >>= rSettings.maURL.Complete;
462cdf0e10cSrcweir 			}
463cdf0e10cSrcweir 		}
464cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OutputStream" ) ) )
465cdf0e10cSrcweir 		{
466cdf0e10cSrcweir 			pValues->Value >>= rSettings.mxOutputStream;
467cdf0e10cSrcweir 		}
468cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GraphicRenderer" ) ) )
469cdf0e10cSrcweir 		{
470cdf0e10cSrcweir 			pValues->Value >>= rSettings.mxGraphicRenderer;
471cdf0e10cSrcweir 		}
472cdf0e10cSrcweir 		else if ( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "StatusIndicator" ) ) )
473cdf0e10cSrcweir 		{
474cdf0e10cSrcweir 			pValues->Value >>= rSettings.mxStatusIndicator;
475cdf0e10cSrcweir 		}
476cdf0e10cSrcweir 		else if ( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "InteractionHandler" ) ) )
477cdf0e10cSrcweir 		{
478cdf0e10cSrcweir 			pValues->Value >>= rSettings.mxInteractionHandler;
479cdf0e10cSrcweir 		}
480cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Width" ) ) )	// for compatibility reasons, deprecated
481cdf0e10cSrcweir 		{
482cdf0e10cSrcweir 			pValues->Value >>= rSettings.mnWidth;
483cdf0e10cSrcweir 		}
484cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Height" ) ) )	// for compatibility reasons, deprecated
485cdf0e10cSrcweir 		{
486cdf0e10cSrcweir 			pValues->Value >>= rSettings.mnHeight;
487cdf0e10cSrcweir 		}
488cdf0e10cSrcweir 		else if( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ExportOnlyBackground" ) ) )	// for compatibility reasons, deprecated
489cdf0e10cSrcweir 		{
490cdf0e10cSrcweir 			pValues->Value >>= rSettings.mbExportOnlyBackground;
491cdf0e10cSrcweir 		}
492cdf0e10cSrcweir 		else if ( pValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FilterData" ) ) )
493cdf0e10cSrcweir 		{
494cdf0e10cSrcweir 			pValues->Value >>= rSettings.maFilterData;
495cdf0e10cSrcweir 
496cdf0e10cSrcweir 			sal_Int32 nFilterArgs = rSettings.maFilterData.getLength();
497cdf0e10cSrcweir 			PropertyValue* pDataValues = rSettings.maFilterData.getArray();
498cdf0e10cSrcweir 			while( nFilterArgs-- )
499cdf0e10cSrcweir 			{
500cdf0e10cSrcweir 				if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Translucent" ) ) )
501cdf0e10cSrcweir 				{
502cdf0e10cSrcweir 					if ( !( pDataValues->Value >>= rSettings.mbTranslucent ) )	// SJ: TODO: The GIF Transparency is stored as int32 in
503cdf0e10cSrcweir 					{												// configuration files, this has to be changed to boolean
504cdf0e10cSrcweir 						sal_Int32 nTranslucent = 0;
505cdf0e10cSrcweir 						if ( pDataValues->Value >>= nTranslucent )
506cdf0e10cSrcweir 							rSettings.mbTranslucent = nTranslucent != 0;
507cdf0e10cSrcweir 					}
508cdf0e10cSrcweir 				}
509cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PixelWidth" ) ) )
510cdf0e10cSrcweir 				{
511cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mnWidth;
512cdf0e10cSrcweir 				}
513cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PixelHeight" ) ) )
514cdf0e10cSrcweir 				{
515cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mnHeight;
516cdf0e10cSrcweir 				}
517cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Width" ) ) )	// for compatibility reasons, deprecated
518cdf0e10cSrcweir 				{
519cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mnWidth;
520cdf0e10cSrcweir 					pDataValues->Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PixelWidth" ) );
521cdf0e10cSrcweir 				}
522cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Height" ) ) )	// for compatibility reasons, deprecated
523cdf0e10cSrcweir 				{
524cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mnHeight;
525cdf0e10cSrcweir 					pDataValues->Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "PixelHeight" ) );
526cdf0e10cSrcweir 				}
527cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ExportOnlyBackground" ) ) )
528cdf0e10cSrcweir 				{
529cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mbExportOnlyBackground;
530cdf0e10cSrcweir 				}
531cdf0e10cSrcweir                 else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HighContrast" ) ) )
532cdf0e10cSrcweir                 {
533cdf0e10cSrcweir                     pDataValues->Value >>= rSettings.mbUseHighContrast;
534cdf0e10cSrcweir                 }
535cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PageNumber" ) ) )
536cdf0e10cSrcweir 				{
537cdf0e10cSrcweir 					pDataValues->Value >>= mnPageNumber;
538cdf0e10cSrcweir 				}
539cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "VerboseComments" ) ) )
540cdf0e10cSrcweir 				{
541cdf0e10cSrcweir                     // #110496# Read flag for verbose metafile comments
542cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mbVerboseComments;
543cdf0e10cSrcweir 				}
544cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ScrollText" ) ) )
545cdf0e10cSrcweir 				{
546cdf0e10cSrcweir                     // #110496# Read flag solitary scroll text metafile
547cdf0e10cSrcweir 					pDataValues->Value >>= rSettings.mbScrollText;
548cdf0e10cSrcweir 				}
549cdf0e10cSrcweir 				else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "CurrentPage" ) ) )
550cdf0e10cSrcweir 				{
551cdf0e10cSrcweir 					Reference< XDrawPage >	xPage;
552cdf0e10cSrcweir 					pDataValues->Value >>= xPage;
553cdf0e10cSrcweir 					if( xPage.is() )
554cdf0e10cSrcweir 					{
555cdf0e10cSrcweir 						SvxDrawPage* pUnoPage = SvxDrawPage::getImplementation( xPage );
556cdf0e10cSrcweir 						if( pUnoPage && pUnoPage->GetSdrPage() )
557cdf0e10cSrcweir 							mpCurrentPage = pUnoPage->GetSdrPage();
558cdf0e10cSrcweir 					}
559cdf0e10cSrcweir 				}
560cdf0e10cSrcweir                 else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ScaleXNumerator" ) ) )
561cdf0e10cSrcweir                 {
562cdf0e10cSrcweir                     sal_Int32 nVal = 1;
563cdf0e10cSrcweir                     if( pDataValues->Value >>= nVal )
564cdf0e10cSrcweir                         rSettings.maScaleX = Fraction( nVal, rSettings.maScaleX.GetDenominator() );
565cdf0e10cSrcweir                 }
566cdf0e10cSrcweir                 else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ScaleXDenominator" ) ) )
567cdf0e10cSrcweir                 {
568cdf0e10cSrcweir                     sal_Int32 nVal = 1;
569cdf0e10cSrcweir                     if( pDataValues->Value >>= nVal )
570cdf0e10cSrcweir                         rSettings.maScaleX = Fraction( rSettings.maScaleX.GetNumerator(), nVal );
571cdf0e10cSrcweir                 }
572cdf0e10cSrcweir                 else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ScaleYNumerator" ) ) )
573cdf0e10cSrcweir                 {
574cdf0e10cSrcweir                     sal_Int32 nVal = 1;
575cdf0e10cSrcweir                     if( pDataValues->Value >>= nVal )
576cdf0e10cSrcweir                         rSettings.maScaleY = Fraction( nVal, rSettings.maScaleY.GetDenominator() );
577cdf0e10cSrcweir                 }
578cdf0e10cSrcweir                 else if( pDataValues->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ScaleYDenominator" ) ) )
579cdf0e10cSrcweir                 {
580cdf0e10cSrcweir                     sal_Int32 nVal = 1;
581cdf0e10cSrcweir                     if( pDataValues->Value >>= nVal )
582cdf0e10cSrcweir                         rSettings.maScaleY = Fraction( rSettings.maScaleY.GetNumerator(), nVal );
583cdf0e10cSrcweir                 }
584cdf0e10cSrcweir 
585cdf0e10cSrcweir 				pDataValues++;
586cdf0e10cSrcweir 			}
587cdf0e10cSrcweir 		}
588cdf0e10cSrcweir 
589cdf0e10cSrcweir 		pValues++;
590cdf0e10cSrcweir 	}
591cdf0e10cSrcweir 
592cdf0e10cSrcweir 	// putting the StatusIndicator that we got from the MediaDescriptor into our local FilterData copy
593cdf0e10cSrcweir 	if ( rSettings.mxStatusIndicator.is() )
594cdf0e10cSrcweir 	{
595cdf0e10cSrcweir 		rtl::OUString sStatusIndicator( RTL_CONSTASCII_USTRINGPARAM( "StatusIndicator" ) );
596cdf0e10cSrcweir 		int i = rSettings.maFilterData.getLength();
597cdf0e10cSrcweir 		rSettings.maFilterData.realloc( i + 1 );
598cdf0e10cSrcweir 		rSettings.maFilterData[ i ].Name = sStatusIndicator;
599cdf0e10cSrcweir 		rSettings.maFilterData[ i ].Value <<= rSettings.mxStatusIndicator;
600cdf0e10cSrcweir 	}
601cdf0e10cSrcweir }
602cdf0e10cSrcweir 
603cdf0e10cSrcweir bool GraphicExporter::GetGraphic( ExportSettings& rSettings, Graphic& aGraphic, sal_Bool bVectorType )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir 	if( !mpDoc || !mpUnoPage )
606cdf0e10cSrcweir 		return false;
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 	SdrPage* pPage = mpUnoPage->GetSdrPage();
609cdf0e10cSrcweir 	if( !pPage )
610cdf0e10cSrcweir 		return false;
611cdf0e10cSrcweir 
612cdf0e10cSrcweir 	VirtualDevice		aVDev;
613cdf0e10cSrcweir 	const MapMode 		aMap( mpDoc->GetScaleUnit(), Point(), rSettings.maScaleX, rSettings.maScaleY );
614cdf0e10cSrcweir 
615cdf0e10cSrcweir 	SdrOutliner& rOutl=mpDoc->GetDrawOutliner(NULL);
616cdf0e10cSrcweir 	maOldCalcFieldValueHdl = rOutl.GetCalcFieldValueHdl();
617cdf0e10cSrcweir 	rOutl.SetCalcFieldValueHdl( LINK(this, GraphicExporter, CalcFieldValueHdl) );
618cdf0e10cSrcweir 	rOutl.SetBackgroundColor( pPage->GetPageBackgroundColor() );
619cdf0e10cSrcweir 
620cdf0e10cSrcweir 	// #i102251#
621cdf0e10cSrcweir     const sal_uInt32 nOldCntrl(rOutl.GetControlWord());
622cdf0e10cSrcweir     sal_uInt32 nCntrl = nOldCntrl & ~EE_CNTRL_ONLINESPELLING;
623cdf0e10cSrcweir     rOutl.SetControlWord(nCntrl);
624cdf0e10cSrcweir 
625cdf0e10cSrcweir     SdrObject* pTempBackgroundShape = 0;
626cdf0e10cSrcweir 	std::vector< SdrObject* > aShapes;
627cdf0e10cSrcweir 	bool bRet = true;
628cdf0e10cSrcweir 
629cdf0e10cSrcweir 	// export complete page?
630cdf0e10cSrcweir 	if ( !mxShape.is() )
631cdf0e10cSrcweir 	{
632cdf0e10cSrcweir 		if( rSettings.mbExportOnlyBackground )
633cdf0e10cSrcweir 		{
634cdf0e10cSrcweir             const SdrPageProperties* pCorrectProperties = pPage->getCorrectSdrPageProperties();
635cdf0e10cSrcweir 
636cdf0e10cSrcweir             if(pCorrectProperties)
637cdf0e10cSrcweir             {
638cdf0e10cSrcweir                 pTempBackgroundShape = new SdrRectObj(Rectangle(Point(0,0), pPage->GetSize()));
639cdf0e10cSrcweir                 pTempBackgroundShape->SetMergedItemSet(pCorrectProperties->GetItemSet());
640cdf0e10cSrcweir                 pTempBackgroundShape->SetMergedItem(XLineStyleItem(XLINE_NONE));
641cdf0e10cSrcweir                 pTempBackgroundShape->NbcSetStyleSheet(pCorrectProperties->GetStyleSheet(), true);
642cdf0e10cSrcweir 		        aShapes.push_back(pTempBackgroundShape);
643cdf0e10cSrcweir             }
644cdf0e10cSrcweir 		}
645cdf0e10cSrcweir 		else
646cdf0e10cSrcweir 		{
647cdf0e10cSrcweir 			const Size aSize( pPage->GetSize() );
648cdf0e10cSrcweir 
649cdf0e10cSrcweir 			// generate a bitmap to convert it to a pixel format.
650cdf0e10cSrcweir 			// For gif pictures there can also be a vector format used (bTranslucent)
651cdf0e10cSrcweir 			if ( !bVectorType && !rSettings.mbTranslucent )
652cdf0e10cSrcweir 			{
653cdf0e10cSrcweir 				long nWidthPix = 0;
654cdf0e10cSrcweir 				long nHeightPix = 0;
655cdf0e10cSrcweir                 if ( rSettings.mnWidth > 0 && rSettings.mnHeight > 0 )
656cdf0e10cSrcweir                 {
657cdf0e10cSrcweir 					nWidthPix = rSettings.mnWidth;
658cdf0e10cSrcweir 					nHeightPix = rSettings.mnHeight;
659cdf0e10cSrcweir                 }
660cdf0e10cSrcweir                 else
661cdf0e10cSrcweir                 {
662cdf0e10cSrcweir 				    const Size aSizePix( Application::GetDefaultDevice()->LogicToPixel( aSize, aMap ) );
663cdf0e10cSrcweir                     if (aSizePix.Width() > MAX_EXT_PIX || aSizePix.Height() > MAX_EXT_PIX)
664cdf0e10cSrcweir                     {
665cdf0e10cSrcweir                         if (aSizePix.Width() > MAX_EXT_PIX)
666cdf0e10cSrcweir                             nWidthPix = MAX_EXT_PIX;
667cdf0e10cSrcweir                         else
668cdf0e10cSrcweir                             nWidthPix = aSizePix.Width();
669cdf0e10cSrcweir                         if (aSizePix.Height() > MAX_EXT_PIX)
670cdf0e10cSrcweir                             nHeightPix = MAX_EXT_PIX;
671cdf0e10cSrcweir                         else
672cdf0e10cSrcweir                             nHeightPix = aSizePix.Height();
673cdf0e10cSrcweir 
674cdf0e10cSrcweir                         double fWidthDif = aSizePix.Width() / nWidthPix;
675cdf0e10cSrcweir                         double fHeightDif = aSizePix.Height() / nHeightPix;
676cdf0e10cSrcweir 
677cdf0e10cSrcweir                         if (fWidthDif > fHeightDif)
678cdf0e10cSrcweir                             nHeightPix = static_cast<long>(aSizePix.Height() / fWidthDif);
679cdf0e10cSrcweir                         else
680cdf0e10cSrcweir                             nWidthPix = static_cast<long>(aSizePix.Width() / fHeightDif);
681cdf0e10cSrcweir                     }
682cdf0e10cSrcweir                     else
683cdf0e10cSrcweir                     {
684cdf0e10cSrcweir 				        nWidthPix = aSizePix.Width();
685cdf0e10cSrcweir                         nHeightPix = aSizePix.Height();
686cdf0e10cSrcweir                     }
687cdf0e10cSrcweir                 }
688cdf0e10cSrcweir 
689cdf0e10cSrcweir 				boost::scoped_ptr< SdrView > pLocalView;
690cdf0e10cSrcweir 				if( PTR_CAST( FmFormModel, mpDoc ) )
691cdf0e10cSrcweir 				{
692cdf0e10cSrcweir 					pLocalView.reset( new FmFormView( PTR_CAST( FmFormModel, mpDoc ), &aVDev ) );
693cdf0e10cSrcweir 				}
694cdf0e10cSrcweir 				else
695cdf0e10cSrcweir 				{
696cdf0e10cSrcweir 					pLocalView.reset( new SdrView( mpDoc, &aVDev ) );
697cdf0e10cSrcweir 				}
698cdf0e10cSrcweir 
699cdf0e10cSrcweir 
700cdf0e10cSrcweir 				VirtualDevice*	pVDev = CreatePageVDev( pPage, nWidthPix, nHeightPix );
701cdf0e10cSrcweir 
702cdf0e10cSrcweir 				if( pVDev )
703cdf0e10cSrcweir 				{
704cdf0e10cSrcweir 					aGraphic = pVDev->GetBitmap( Point(), pVDev->GetOutputSize() );
705cdf0e10cSrcweir 					aGraphic.SetPrefMapMode( aMap );
706cdf0e10cSrcweir 					aGraphic.SetPrefSize( aSize );
707cdf0e10cSrcweir 					delete pVDev;
708cdf0e10cSrcweir 				}
709cdf0e10cSrcweir 			}
710cdf0e10cSrcweir 			// create a metafile to export a vector format
711cdf0e10cSrcweir 			else
712cdf0e10cSrcweir 			{
713cdf0e10cSrcweir 				GDIMetaFile aMtf;
714cdf0e10cSrcweir 
715cdf0e10cSrcweir 				aVDev.SetMapMode( aMap );
716cdf0e10cSrcweir                 if( rSettings.mbUseHighContrast )
717cdf0e10cSrcweir                     aVDev.SetDrawMode( aVDev.GetDrawMode() | DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
718cdf0e10cSrcweir                 aVDev.EnableOutput( sal_False );
719cdf0e10cSrcweir 				aMtf.Record( &aVDev );
720cdf0e10cSrcweir 				Size aNewSize;
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 	            // create a view
723cdf0e10cSrcweir 	            SdrView*		pView;
724cdf0e10cSrcweir 
725cdf0e10cSrcweir 	            if( PTR_CAST( FmFormModel, mpDoc ) )
726cdf0e10cSrcweir 	            {
727cdf0e10cSrcweir 		            pView = new FmFormView( PTR_CAST( FmFormModel, mpDoc ), &aVDev );
728cdf0e10cSrcweir 	            }
729cdf0e10cSrcweir 	            else
730cdf0e10cSrcweir 	            {
731cdf0e10cSrcweir 		            pView = new SdrView( mpDoc, &aVDev );
732cdf0e10cSrcweir 	            }
733cdf0e10cSrcweir 
734cdf0e10cSrcweir 	            pView->SetBordVisible( sal_False );
735cdf0e10cSrcweir 	            pView->SetPageVisible( sal_False );
736cdf0e10cSrcweir 	            pView->ShowSdrPage( pPage );
737cdf0e10cSrcweir 
738cdf0e10cSrcweir                 if ( pView && pPage )
739cdf0e10cSrcweir 				{
740cdf0e10cSrcweir 					pView->SetBordVisible( sal_False );
741cdf0e10cSrcweir 					pView->SetPageVisible( sal_False );
742cdf0e10cSrcweir 					pView->ShowSdrPage( pPage );
743cdf0e10cSrcweir 
744cdf0e10cSrcweir 					const Point	aNewOrg( pPage->GetLftBorder(), pPage->GetUppBorder() );
745cdf0e10cSrcweir 					aNewSize = Size( aSize.Width() - pPage->GetLftBorder() - pPage->GetRgtBorder(),
746cdf0e10cSrcweir 										  aSize.Height() - pPage->GetUppBorder() - pPage->GetLwrBorder() );
747cdf0e10cSrcweir 					const Rectangle aClipRect( aNewOrg, aNewSize );
748cdf0e10cSrcweir 					MapMode			aVMap( aMap );
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 					aVDev.Push();
751cdf0e10cSrcweir 					aVMap.SetOrigin( Point( -aNewOrg.X(), -aNewOrg.Y() ) );
752cdf0e10cSrcweir 					aVDev.SetRelativeMapMode( aVMap );
753cdf0e10cSrcweir 					aVDev.IntersectClipRegion( aClipRect );
754cdf0e10cSrcweir 
755cdf0e10cSrcweir                     // Use new StandardCheckVisisbilityRedirector
756cdf0e10cSrcweir 					ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
757cdf0e10cSrcweir 
758cdf0e10cSrcweir 					pView->CompleteRedraw(&aVDev, Region(Rectangle(Point(), aNewSize)), &aRedirector);
759cdf0e10cSrcweir 
760cdf0e10cSrcweir 					aVDev.Pop();
761cdf0e10cSrcweir 
762cdf0e10cSrcweir 					aMtf.Stop();
763cdf0e10cSrcweir 					aMtf.WindStart();
764cdf0e10cSrcweir 					aMtf.SetPrefMapMode( aMap );
765cdf0e10cSrcweir 					aMtf.SetPrefSize( aNewSize );
766cdf0e10cSrcweir 
767cdf0e10cSrcweir 					// AW: Here the current version was filtering out the META_CLIPREGION_ACTIONs
768cdf0e10cSrcweir 					// from the metafile. I asked some other developers why this was done, but no
769cdf0e10cSrcweir 					// one knew a direct reason. Since it's in for long time, it may be an old
770cdf0e10cSrcweir 					// piece of code. MetaFiles save and load ClipRegions with polygons with preserving
771cdf0e10cSrcweir 					// the polygons, so a resolution-indepent roundtrip is supported. Removed this
772cdf0e10cSrcweir 					// code since it destroys some MetaFiles where ClipRegions are used. Anyways,
773cdf0e10cSrcweir 					// just filtering them out is a hack, at least the encapsulated content would need
774cdf0e10cSrcweir 					// to be clipped geometrically.
775cdf0e10cSrcweir                     aGraphic = Graphic(aMtf);
776cdf0e10cSrcweir 				}
777cdf0e10cSrcweir 
778cdf0e10cSrcweir                 if ( pView )
779cdf0e10cSrcweir                 {
780cdf0e10cSrcweir 	                pView->HideSdrPage();
781cdf0e10cSrcweir 	                delete pView;
782cdf0e10cSrcweir                 }
783cdf0e10cSrcweir 
784cdf0e10cSrcweir                 if( rSettings.mbTranslucent )
785cdf0e10cSrcweir 				{
786cdf0e10cSrcweir 					Size aOutSize;
787cdf0e10cSrcweir 					aGraphic = GetBitmapFromMetaFile( aGraphic.GetGDIMetaFile(), sal_True, CalcSize( rSettings.mnWidth, rSettings.mnHeight, aNewSize, aOutSize ) );
788cdf0e10cSrcweir 				}
789cdf0e10cSrcweir 			}
790cdf0e10cSrcweir 		}
791cdf0e10cSrcweir 	}
792cdf0e10cSrcweir 
793cdf0e10cSrcweir 	// export only single shape or shape collection
794cdf0e10cSrcweir 	else
795cdf0e10cSrcweir 	{
796cdf0e10cSrcweir 		// build list of SdrObject
797cdf0e10cSrcweir 		if( mxShapes.is() )
798cdf0e10cSrcweir 		{
799cdf0e10cSrcweir 			Reference< XShape > xShape;
800cdf0e10cSrcweir 			const sal_Int32 nCount = mxShapes->getCount();
801cdf0e10cSrcweir 
802cdf0e10cSrcweir 			for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
803cdf0e10cSrcweir 			{
804cdf0e10cSrcweir 				mxShapes->getByIndex( nIndex ) >>= xShape;
805cdf0e10cSrcweir 				SdrObject* pObj = GetSdrObjectFromXShape( xShape );
806cdf0e10cSrcweir 				if( pObj )
807cdf0e10cSrcweir 					aShapes.push_back( pObj );
808cdf0e10cSrcweir 			}
809cdf0e10cSrcweir 		}
810cdf0e10cSrcweir 		else
811cdf0e10cSrcweir 		{
812cdf0e10cSrcweir 			// only one shape
813cdf0e10cSrcweir 			SdrObject* pObj = GetSdrObjectFromXShape( mxShape );
814cdf0e10cSrcweir 			if( pObj )
815cdf0e10cSrcweir 				aShapes.push_back( pObj );
816cdf0e10cSrcweir 		}
817cdf0e10cSrcweir 
818cdf0e10cSrcweir 		if( aShapes.empty() )
819cdf0e10cSrcweir 			bRet = false;
820cdf0e10cSrcweir 	}
821cdf0e10cSrcweir 
822cdf0e10cSrcweir 	if( bRet && !aShapes.empty() )
823cdf0e10cSrcweir 	{
824cdf0e10cSrcweir 		// special treatment for only one SdrGrafObj that has text
825cdf0e10cSrcweir 		sal_Bool bSingleGraphic = sal_False;
826cdf0e10cSrcweir 
827cdf0e10cSrcweir 		if( 1 == aShapes.size() )
828cdf0e10cSrcweir         {
829cdf0e10cSrcweir             if( !bVectorType )
830cdf0e10cSrcweir             {
831cdf0e10cSrcweir                 SdrObject* pObj = aShapes.front();
832cdf0e10cSrcweir                 if( pObj && pObj->ISA( SdrGrafObj ) && !( (SdrGrafObj*) pObj )->HasText() )
833cdf0e10cSrcweir                 {
834cdf0e10cSrcweir                     aGraphic = ( (SdrGrafObj*) pObj )->GetTransformedGraphic();
835cdf0e10cSrcweir 					if ( aGraphic.GetType() == GRAPHIC_BITMAP )
836cdf0e10cSrcweir 					{
837cdf0e10cSrcweir 						Size aSizePixel( aGraphic.GetSizePixel() );
838cdf0e10cSrcweir 						if( rSettings.mnWidth && rSettings.mnHeight &&
839cdf0e10cSrcweir                             ( ( rSettings.mnWidth != aSizePixel.Width() ) ||
840cdf0e10cSrcweir                               ( rSettings.mnHeight != aSizePixel.Height() ) ) )
841cdf0e10cSrcweir 						{
842cdf0e10cSrcweir 							BitmapEx aBmpEx( aGraphic.GetBitmapEx() );
843cdf0e10cSrcweir 							aBmpEx.Scale( Size( rSettings.mnWidth, rSettings.mnHeight ) );
844cdf0e10cSrcweir 							aGraphic = aBmpEx;
845cdf0e10cSrcweir 						}
846*90cac51fSArmin Le Grand 
847*90cac51fSArmin Le Grand                         // #118804# only accept for bitmap graphics, else the
848*90cac51fSArmin Le Grand                         // conversion to bitmap will happen anywhere without size control
849*90cac51fSArmin Le Grand                         // as evtl. defined in rSettings.mnWidth/mnHeight
850*90cac51fSArmin Le Grand                         bSingleGraphic = sal_True;
851cdf0e10cSrcweir 					}
852cdf0e10cSrcweir                 }
853cdf0e10cSrcweir             }
854cdf0e10cSrcweir             else if( rSettings.mbScrollText )
855cdf0e10cSrcweir             {
856cdf0e10cSrcweir                 SdrObject* pObj = aShapes.front();
857cdf0e10cSrcweir                 if( pObj && pObj->ISA( SdrTextObj )
858cdf0e10cSrcweir                     && ( (SdrTextObj*) pObj )->HasText() )
859cdf0e10cSrcweir                 {
860cdf0e10cSrcweir                     Rectangle aScrollRectangle;
861cdf0e10cSrcweir                     Rectangle aPaintRectangle;
862cdf0e10cSrcweir 
863cdf0e10cSrcweir                     const boost::scoped_ptr< GDIMetaFile > pMtf(
864cdf0e10cSrcweir                         ( (SdrTextObj*) pObj )->GetTextScrollMetaFileAndRectangle(
865cdf0e10cSrcweir                         aScrollRectangle, aPaintRectangle ) );
866cdf0e10cSrcweir 
867cdf0e10cSrcweir                     // take the larger one of the two rectangles (that
868cdf0e10cSrcweir                     // should be the bound rect of the retrieved
869cdf0e10cSrcweir                     // metafile)
870cdf0e10cSrcweir 					Rectangle aTextRect;
871cdf0e10cSrcweir 
872cdf0e10cSrcweir                     if( aScrollRectangle.IsInside( aPaintRectangle ) )
873cdf0e10cSrcweir                         aTextRect = aScrollRectangle;
874cdf0e10cSrcweir                     else
875cdf0e10cSrcweir                         aTextRect = aPaintRectangle;
876cdf0e10cSrcweir 
877cdf0e10cSrcweir                     // setup pref size and mapmode
878cdf0e10cSrcweir                     pMtf->SetPrefSize( aTextRect.GetSize() );
879cdf0e10cSrcweir 
880cdf0e10cSrcweir                     // set actual origin (mtf is at actual shape
881cdf0e10cSrcweir                     // output position)
882cdf0e10cSrcweir                     MapMode aLocalMapMode( aMap );
883cdf0e10cSrcweir                     aLocalMapMode.SetOrigin(
884cdf0e10cSrcweir                         Point( -aPaintRectangle.Left(),
885cdf0e10cSrcweir                                -aPaintRectangle.Top() ) );
886cdf0e10cSrcweir                     pMtf->SetPrefMapMode( aLocalMapMode );
887cdf0e10cSrcweir 
888cdf0e10cSrcweir                     pMtf->AddAction( new MetaCommentAction(
889cdf0e10cSrcweir                                          "XTEXT_SCROLLRECT", 0,
890cdf0e10cSrcweir                                          reinterpret_cast<sal_uInt8 const*>(&aScrollRectangle),
891cdf0e10cSrcweir                                          sizeof( Rectangle ) ) );
892cdf0e10cSrcweir                     pMtf->AddAction( new MetaCommentAction(
893cdf0e10cSrcweir                                          "XTEXT_PAINTRECT", 0,
894cdf0e10cSrcweir                                          reinterpret_cast<sal_uInt8 const*>(&aPaintRectangle),
895cdf0e10cSrcweir                                          sizeof( Rectangle ) ) );
896cdf0e10cSrcweir 
897cdf0e10cSrcweir                     aGraphic = Graphic( *pMtf );
898cdf0e10cSrcweir 
899cdf0e10cSrcweir                     bSingleGraphic = sal_True;
900cdf0e10cSrcweir                 }
901cdf0e10cSrcweir             }
902cdf0e10cSrcweir         }
903cdf0e10cSrcweir 
904cdf0e10cSrcweir         if( !bSingleGraphic )
905cdf0e10cSrcweir 		{
906cdf0e10cSrcweir 			// create a metafile for all shapes
907cdf0e10cSrcweir 			VirtualDevice	aOut;
908cdf0e10cSrcweir 
909cdf0e10cSrcweir 			// calculate bound rect for all shapes
910cdf0e10cSrcweir 			Rectangle aBound;
911cdf0e10cSrcweir 
912cdf0e10cSrcweir             {
913cdf0e10cSrcweir 			    std::vector< SdrObject* >::iterator aIter = aShapes.begin();
914cdf0e10cSrcweir 			    const std::vector< SdrObject* >::iterator aEnd = aShapes.end();
915cdf0e10cSrcweir 
916cdf0e10cSrcweir 			    while( aIter != aEnd )
917cdf0e10cSrcweir 			    {
918cdf0e10cSrcweir 				    SdrObject* pObj = (*aIter++);
919cdf0e10cSrcweir 				    Rectangle aR1(pObj->GetCurrentBoundRect());
920cdf0e10cSrcweir 				    if (aBound.IsEmpty())
921cdf0e10cSrcweir 					    aBound=aR1;
922cdf0e10cSrcweir 				    else
923cdf0e10cSrcweir 					    aBound.Union(aR1);
924cdf0e10cSrcweir 			    }
925cdf0e10cSrcweir             }
926cdf0e10cSrcweir 
927cdf0e10cSrcweir 			aOut.EnableOutput( sal_False );
928cdf0e10cSrcweir 			aOut.SetMapMode( aMap );
929cdf0e10cSrcweir             if( rSettings.mbUseHighContrast )
930cdf0e10cSrcweir                 aOut.SetDrawMode( aVDev.GetDrawMode() | DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT );
931cdf0e10cSrcweir 
932cdf0e10cSrcweir 			GDIMetaFile aMtf;
933cdf0e10cSrcweir 			aMtf.Clear();
934cdf0e10cSrcweir 			aMtf.Record( &aOut );
935cdf0e10cSrcweir 
936cdf0e10cSrcweir 			MapMode aOutMap( aMap );
937cdf0e10cSrcweir 			aOutMap.SetOrigin( Point( -aBound.TopLeft().X(), -aBound.TopLeft().Y() ) );
938cdf0e10cSrcweir 			aOut.SetRelativeMapMode( aOutMap );
939cdf0e10cSrcweir 
940cdf0e10cSrcweir 			sdr::contact::DisplayInfo aDisplayInfo;
941cdf0e10cSrcweir 
942cdf0e10cSrcweir             if(mpCurrentPage)
943cdf0e10cSrcweir             {
944cdf0e10cSrcweir 				if(mpCurrentPage->TRG_HasMasterPage() && pPage->IsMasterPage())
945cdf0e10cSrcweir 				{
946cdf0e10cSrcweir 					// MasterPage is processed as another page's SubContent
947cdf0e10cSrcweir 					aDisplayInfo.SetProcessLayers(mpCurrentPage->TRG_GetMasterPageVisibleLayers());
948cdf0e10cSrcweir 					aDisplayInfo.SetSubContentActive(true);
949cdf0e10cSrcweir 				}
950cdf0e10cSrcweir             }
951cdf0e10cSrcweir 
952cdf0e10cSrcweir 			if(!aShapes.empty())
953cdf0e10cSrcweir 			{
954cdf0e10cSrcweir 				// more effective way to paint a vector of SdrObjects. Hand over the processed page
955cdf0e10cSrcweir                 // to have it in the
956cdf0e10cSrcweir 				sdr::contact::ObjectContactOfObjListPainter aMultiObjectPainter(aOut, aShapes, mpCurrentPage);
957cdf0e10cSrcweir 				ImplExportCheckVisisbilityRedirector aCheckVisibilityRedirector(mpCurrentPage);
958cdf0e10cSrcweir 				aMultiObjectPainter.SetViewObjectContactRedirector(&aCheckVisibilityRedirector);
959cdf0e10cSrcweir 
960cdf0e10cSrcweir 				aMultiObjectPainter.ProcessDisplay(aDisplayInfo);
961cdf0e10cSrcweir 			}
962cdf0e10cSrcweir 
963cdf0e10cSrcweir 			aMtf.Stop();
964cdf0e10cSrcweir 			aMtf.WindStart();
965cdf0e10cSrcweir 
966cdf0e10cSrcweir 			const Size	aExtSize( aOut.PixelToLogic( Size( 0, 0  ) ) );
967cdf0e10cSrcweir 			Size		aBoundSize( aBound.GetWidth() + ( aExtSize.Width() ),
968cdf0e10cSrcweir 									aBound.GetHeight() + ( aExtSize.Height() ) );
969cdf0e10cSrcweir 
970cdf0e10cSrcweir 			aMtf.SetPrefMapMode( aMap );
971cdf0e10cSrcweir 			aMtf.SetPrefSize( aBoundSize );
972cdf0e10cSrcweir 
973cdf0e10cSrcweir 			if( !bVectorType )
974cdf0e10cSrcweir 			{
975cdf0e10cSrcweir 				Size aOutSize;
976cdf0e10cSrcweir 				aGraphic = GetBitmapFromMetaFile( aMtf, rSettings.mbTranslucent, CalcSize( rSettings.mnWidth, rSettings.mnHeight, aBoundSize, aOutSize ) );
977cdf0e10cSrcweir 			}
978cdf0e10cSrcweir 			else
979cdf0e10cSrcweir 			{
980cdf0e10cSrcweir 				aGraphic = aMtf;
981cdf0e10cSrcweir 			}
982cdf0e10cSrcweir 		}
983cdf0e10cSrcweir 	}
984cdf0e10cSrcweir 
985cdf0e10cSrcweir     if(pTempBackgroundShape)
986cdf0e10cSrcweir     {
987cdf0e10cSrcweir         SdrObject::Free(pTempBackgroundShape);
988cdf0e10cSrcweir     }
989cdf0e10cSrcweir 
990cdf0e10cSrcweir     rOutl.SetCalcFieldValueHdl( maOldCalcFieldValueHdl );
991cdf0e10cSrcweir 
992cdf0e10cSrcweir 	// #i102251#
993cdf0e10cSrcweir     rOutl.SetControlWord(nOldCntrl);
994cdf0e10cSrcweir 
995cdf0e10cSrcweir 	return bRet;
996cdf0e10cSrcweir 
997cdf0e10cSrcweir }
998cdf0e10cSrcweir 
999cdf0e10cSrcweir // XFilter
1000cdf0e10cSrcweir sal_Bool SAL_CALL GraphicExporter::filter( const Sequence< PropertyValue >& aDescriptor )
1001cdf0e10cSrcweir 	throw(RuntimeException)
1002cdf0e10cSrcweir {
1003cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
1004cdf0e10cSrcweir 
1005cdf0e10cSrcweir 	if( NULL == mpUnoPage )
1006cdf0e10cSrcweir 		return sal_False;
1007cdf0e10cSrcweir 
1008cdf0e10cSrcweir 	GraphicFilter*				pFilter = GraphicFilter::GetGraphicFilter();
1009cdf0e10cSrcweir 
1010cdf0e10cSrcweir 	if( NULL == pFilter || NULL == mpUnoPage->GetSdrPage() || NULL == mpDoc )
1011cdf0e10cSrcweir 		return sal_False;
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir 	// get the arguments from the descriptor
1014cdf0e10cSrcweir 	ExportSettings aSettings( mpDoc );
1015cdf0e10cSrcweir 	ParseSettings( aDescriptor, aSettings );
1016cdf0e10cSrcweir 
1017cdf0e10cSrcweir 	const sal_uInt16	nFilter = aSettings.maMediaType.getLength()
1018cdf0e10cSrcweir 							? pFilter->GetExportFormatNumberForMediaType( aSettings.maMediaType )
1019cdf0e10cSrcweir 							: pFilter->GetExportFormatNumberForShortName( aSettings.maFilterName );
1020cdf0e10cSrcweir 	sal_Bool			bVectorType = !pFilter->IsExportPixelFormat( nFilter );
1021cdf0e10cSrcweir 
1022cdf0e10cSrcweir 	// create the output stuff
1023cdf0e10cSrcweir 	Graphic aGraphic;
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir 	sal_uInt16 nStatus = GetGraphic( aSettings, aGraphic, bVectorType ) ? GRFILTER_OK : GRFILTER_FILTERERROR;
1026cdf0e10cSrcweir 
1027cdf0e10cSrcweir 	if( nStatus == GRFILTER_OK )
1028cdf0e10cSrcweir 	{
1029cdf0e10cSrcweir 		// export graphic only if it has a size
1030cdf0e10cSrcweir 		const Size aGraphSize( aGraphic.GetPrefSize() );
1031cdf0e10cSrcweir 		if ( ( aGraphSize.Width() == 0 ) || ( aGraphSize.Height() == 0 ) )
1032cdf0e10cSrcweir 		{
1033cdf0e10cSrcweir 			nStatus = GRFILTER_FILTERERROR;
1034cdf0e10cSrcweir 		}
1035cdf0e10cSrcweir 		else
1036cdf0e10cSrcweir 		{
1037cdf0e10cSrcweir 			// now we have a graphic, so export it
1038cdf0e10cSrcweir             if( aSettings.mxGraphicRenderer.is() )
1039cdf0e10cSrcweir             {
1040cdf0e10cSrcweir                 // render graphic directly into given renderer
1041cdf0e10cSrcweir                 aSettings.mxGraphicRenderer->render( aGraphic.GetXGraphic() );
1042cdf0e10cSrcweir             }
1043cdf0e10cSrcweir 			else if( aSettings.mxOutputStream.is() )
1044cdf0e10cSrcweir 			{
1045cdf0e10cSrcweir                 // TODO: Either utilize optional XSeekable functionality for the
1046cdf0e10cSrcweir                 // SvOutputStream, or adapt the graphic filter to not seek anymore.
1047cdf0e10cSrcweir                 SvMemoryStream aStream( 1024, 1024 );
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir 				nStatus = pFilter->ExportGraphic( aGraphic, String(), aStream, nFilter, &aSettings.maFilterData );
1050cdf0e10cSrcweir 
1051cdf0e10cSrcweir                 // copy temp stream to XOutputStream
1052cdf0e10cSrcweir 				SvOutputStream aOutputStream( aSettings.mxOutputStream );
1053cdf0e10cSrcweir                 aStream.Seek(0);
1054cdf0e10cSrcweir                 aOutputStream << aStream;
1055cdf0e10cSrcweir 			}
1056cdf0e10cSrcweir 			else
1057cdf0e10cSrcweir 			{
1058cdf0e10cSrcweir                 INetURLObject aURLObject( aSettings.maURL.Complete );
1059cdf0e10cSrcweir                 DBG_ASSERT( aURLObject.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir 				nStatus = XOutBitmap::ExportGraphic( aGraphic, aURLObject, *pFilter, nFilter, &aSettings.maFilterData );
1062cdf0e10cSrcweir 			}
1063cdf0e10cSrcweir 		}
1064cdf0e10cSrcweir 	}
1065cdf0e10cSrcweir 
1066cdf0e10cSrcweir 	if ( aSettings.mxInteractionHandler.is() && ( nStatus != GRFILTER_OK ) )
1067cdf0e10cSrcweir 	{
1068cdf0e10cSrcweir         Any aInteraction;
1069cdf0e10cSrcweir         Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > > lContinuations(1);
1070cdf0e10cSrcweir         ::comphelper::OInteractionApprove* pApprove = new ::comphelper::OInteractionApprove();
1071cdf0e10cSrcweir         lContinuations[0] = Reference< XInteractionContinuation >(static_cast< XInteractionContinuation* >(pApprove), UNO_QUERY);
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir 		GraphicFilterRequest aErrorCode;
1074cdf0e10cSrcweir 		aErrorCode.ErrCode = nStatus;
1075cdf0e10cSrcweir 		aInteraction <<= aErrorCode;
1076cdf0e10cSrcweir         aSettings.mxInteractionHandler->handle( framework::InteractionRequest::CreateRequest( aInteraction, lContinuations ) );
1077cdf0e10cSrcweir 	}
1078cdf0e10cSrcweir 	return nStatus == GRFILTER_OK;
1079cdf0e10cSrcweir }
1080cdf0e10cSrcweir 
1081cdf0e10cSrcweir void SAL_CALL GraphicExporter::cancel()
1082cdf0e10cSrcweir 	throw(RuntimeException)
1083cdf0e10cSrcweir {
1084cdf0e10cSrcweir }
1085cdf0e10cSrcweir 
1086cdf0e10cSrcweir // XExporter
1087cdf0e10cSrcweir 
1088cdf0e10cSrcweir /** the source 'document' could be a XDrawPage, a XShape or a generic XShapes */
1089cdf0e10cSrcweir void SAL_CALL GraphicExporter::setSourceDocument( const Reference< lang::XComponent >& xComponent )
1090cdf0e10cSrcweir 	throw(IllegalArgumentException, RuntimeException)
1091cdf0e10cSrcweir {
1092cdf0e10cSrcweir 	OGuard aGuard( Application::GetSolarMutex() );
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir 	mxShapes = NULL;
1095cdf0e10cSrcweir 	mpUnoPage = NULL;
1096cdf0e10cSrcweir 
1097cdf0e10cSrcweir 	try
1098cdf0e10cSrcweir 	{
1099cdf0e10cSrcweir 	// any break inside this one loop while will throw a IllegalArgumentException
1100cdf0e10cSrcweir 	do
1101cdf0e10cSrcweir 	{
1102cdf0e10cSrcweir 		mxPage = Reference< XDrawPage >::query( xComponent );
1103cdf0e10cSrcweir 		mxShapes = Reference< XShapes >::query( xComponent );
1104cdf0e10cSrcweir 		mxShape = Reference< XShape >::query( xComponent );
1105cdf0e10cSrcweir 
1106cdf0e10cSrcweir 		// Step 1: try a generic XShapes
1107cdf0e10cSrcweir 		if( !mxPage.is() && !mxShape.is() && mxShapes.is() )
1108cdf0e10cSrcweir 		{
1109cdf0e10cSrcweir 			// we do not support empty shape collections
1110cdf0e10cSrcweir 			if( 0 == mxShapes->getCount() )
1111cdf0e10cSrcweir 				break;
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir 			// get first shape to detect corresponding page and model
1114cdf0e10cSrcweir 			mxShapes->getByIndex(0) >>= mxShape;
1115cdf0e10cSrcweir 		}
1116cdf0e10cSrcweir 		else
1117cdf0e10cSrcweir 		{
1118cdf0e10cSrcweir 			mxShapes = NULL;
1119cdf0e10cSrcweir 		}
1120cdf0e10cSrcweir 
1121cdf0e10cSrcweir 		// Step 2: try a shape
1122cdf0e10cSrcweir 		if( mxShape.is() )
1123cdf0e10cSrcweir 		{
1124cdf0e10cSrcweir 			if( NULL == GetSdrObjectFromXShape( mxShape ) )
1125cdf0e10cSrcweir 				break;
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir 			// get page for this shape
1128cdf0e10cSrcweir 			Reference< XChild > xChild( mxShape, UNO_QUERY );
1129cdf0e10cSrcweir 			if( !xChild.is() )
1130cdf0e10cSrcweir 				break;
1131cdf0e10cSrcweir 
1132cdf0e10cSrcweir 			Reference< XInterface > xInt;
1133cdf0e10cSrcweir 			do
1134cdf0e10cSrcweir 			{
1135cdf0e10cSrcweir 				xInt = xChild->getParent();
1136cdf0e10cSrcweir 				mxPage = Reference< XDrawPage >::query( xInt );
1137cdf0e10cSrcweir 				if( !mxPage.is() )
1138cdf0e10cSrcweir 					xChild = Reference< XChild >::query( xInt );
1139cdf0e10cSrcweir 			}
1140cdf0e10cSrcweir 			while( !mxPage.is() && xChild.is() );
1141cdf0e10cSrcweir 
1142cdf0e10cSrcweir 			if( !mxPage.is() )
1143cdf0e10cSrcweir 				break;
1144cdf0e10cSrcweir 		}
1145cdf0e10cSrcweir 
1146cdf0e10cSrcweir 		// Step 3: check the page
1147cdf0e10cSrcweir 		if( !mxPage.is() )
1148cdf0e10cSrcweir 			break;
1149cdf0e10cSrcweir 
1150cdf0e10cSrcweir 		mpUnoPage = SvxDrawPage::getImplementation( mxPage );
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir 		if( NULL == mpUnoPage || NULL == mpUnoPage->GetSdrPage() )
1153cdf0e10cSrcweir 			break;
1154cdf0e10cSrcweir 
1155cdf0e10cSrcweir 		mpDoc = mpUnoPage->GetSdrPage()->GetModel();
1156cdf0e10cSrcweir 
1157cdf0e10cSrcweir 		// Step 4:  If we got a generic XShapes test all contained shapes
1158cdf0e10cSrcweir 		//			if they belong to the same XDrawPage
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir 		if( mxShapes.is() )
1161cdf0e10cSrcweir 		{
1162cdf0e10cSrcweir 			SdrPage* pPage = mpUnoPage->GetSdrPage();
1163cdf0e10cSrcweir 			SdrObject* pObj;
1164cdf0e10cSrcweir 			Reference< XShape > xShape;
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir 			sal_Bool bOk = sal_True;
1167cdf0e10cSrcweir 
1168cdf0e10cSrcweir 			const sal_Int32 nCount = mxShapes->getCount();
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir 			// test all but the first shape if they have the same page than
1171cdf0e10cSrcweir 			// the first shape
1172cdf0e10cSrcweir 			for( sal_Int32 nIndex = 1; bOk && ( nIndex < nCount ); nIndex++ )
1173cdf0e10cSrcweir 			{
1174cdf0e10cSrcweir 				mxShapes->getByIndex( nIndex ) >>= xShape;
1175cdf0e10cSrcweir 				pObj = GetSdrObjectFromXShape( xShape );
1176cdf0e10cSrcweir 				bOk = pObj && pObj->GetPage() == pPage;
1177cdf0e10cSrcweir 			}
1178cdf0e10cSrcweir 
1179cdf0e10cSrcweir 			if( !bOk )
1180cdf0e10cSrcweir 				break;
1181cdf0e10cSrcweir 		}
1182cdf0e10cSrcweir 
1183cdf0e10cSrcweir 		// no errors so far
1184cdf0e10cSrcweir 		return;
1185cdf0e10cSrcweir 	}
1186cdf0e10cSrcweir 	while( 0 );
1187cdf0e10cSrcweir 	}
1188cdf0e10cSrcweir 	catch( Exception& )
1189cdf0e10cSrcweir 	{
1190cdf0e10cSrcweir 	}
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 	throw IllegalArgumentException();
1193cdf0e10cSrcweir }
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir // XServiceInfo
1196cdf0e10cSrcweir OUString SAL_CALL GraphicExporter::getImplementationName(  )
1197cdf0e10cSrcweir 	throw(RuntimeException)
1198cdf0e10cSrcweir {
1199cdf0e10cSrcweir 	return GraphicExporter_getImplementationName();
1200cdf0e10cSrcweir }
1201cdf0e10cSrcweir 
1202cdf0e10cSrcweir sal_Bool SAL_CALL GraphicExporter::supportsService( const OUString& ServiceName )
1203cdf0e10cSrcweir 	throw(RuntimeException)
1204cdf0e10cSrcweir {
1205cdf0e10cSrcweir 	Sequence< OUString > aSeq( GraphicExporter_getSupportedServiceNames() );
1206cdf0e10cSrcweir 	sal_Int32 nArgs = aSeq.getLength();
1207cdf0e10cSrcweir 	const OUString* pService = aSeq.getConstArray();
1208cdf0e10cSrcweir 	while( nArgs-- )
1209cdf0e10cSrcweir 		if( *pService++ == ServiceName )
1210cdf0e10cSrcweir 			return sal_True;
1211cdf0e10cSrcweir 
1212cdf0e10cSrcweir 	return sal_False;
1213cdf0e10cSrcweir }
1214cdf0e10cSrcweir 
1215cdf0e10cSrcweir Sequence< OUString > SAL_CALL GraphicExporter::getSupportedServiceNames(  )
1216cdf0e10cSrcweir 	throw(RuntimeException)
1217cdf0e10cSrcweir {
1218cdf0e10cSrcweir 	return GraphicExporter_getSupportedServiceNames();
1219cdf0e10cSrcweir }
1220cdf0e10cSrcweir 
1221cdf0e10cSrcweir // XMimeTypeInfo
1222cdf0e10cSrcweir sal_Bool SAL_CALL GraphicExporter::supportsMimeType( const OUString& MimeTypeName ) throw (RuntimeException)
1223cdf0e10cSrcweir {
1224cdf0e10cSrcweir 	const String aMimeTypeName( MimeTypeName );
1225cdf0e10cSrcweir 
1226cdf0e10cSrcweir 	GraphicFilter*	pFilter = GraphicFilter::GetGraphicFilter();
1227cdf0e10cSrcweir 	sal_uInt16 nCount = pFilter->GetExportFormatCount();
1228cdf0e10cSrcweir 	sal_uInt16 nFilter;
1229cdf0e10cSrcweir 	for( nFilter = 0; nFilter < nCount; nFilter++ )
1230cdf0e10cSrcweir 	{
1231cdf0e10cSrcweir 		if( aMimeTypeName.Equals( pFilter->GetExportFormatMediaType( nFilter ) ) )
1232cdf0e10cSrcweir 		{
1233cdf0e10cSrcweir 			return sal_True;
1234cdf0e10cSrcweir 		}
1235cdf0e10cSrcweir 	}
1236cdf0e10cSrcweir 
1237cdf0e10cSrcweir 	return sal_False;
1238cdf0e10cSrcweir }
1239cdf0e10cSrcweir 
1240cdf0e10cSrcweir Sequence< OUString > SAL_CALL GraphicExporter::getSupportedMimeTypeNames(  ) throw (RuntimeException)
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir 	GraphicFilter*	pFilter = GraphicFilter::GetGraphicFilter();
1243cdf0e10cSrcweir 	sal_uInt16 nCount = pFilter->GetExportFormatCount();
1244cdf0e10cSrcweir 	sal_uInt16 nFilter;
1245cdf0e10cSrcweir 	sal_uInt16 nFound = 0;
1246cdf0e10cSrcweir 
1247cdf0e10cSrcweir 	Sequence< OUString > aSeq( nCount );
1248cdf0e10cSrcweir 	OUString* pStr = aSeq.getArray();
1249cdf0e10cSrcweir 
1250cdf0e10cSrcweir 	for( nFilter = 0; nFilter < nCount; nFilter++ )
1251cdf0e10cSrcweir 	{
1252cdf0e10cSrcweir 		OUString aMimeType( pFilter->GetExportFormatMediaType( nFilter ) );
1253cdf0e10cSrcweir 		if( aMimeType.getLength() )
1254cdf0e10cSrcweir 		{
1255cdf0e10cSrcweir 			*pStr++ = aMimeType;
1256cdf0e10cSrcweir 			nFound++;
1257cdf0e10cSrcweir 		}
1258cdf0e10cSrcweir 	}
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir 	if( nFound < nCount )
1261cdf0e10cSrcweir 		aSeq.realloc( nFound );
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir 	return aSeq;
1264cdf0e10cSrcweir }
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir Graphic SvxGetGraphicForShape( SdrObject& rShape, bool bVector )
1267cdf0e10cSrcweir {
1268cdf0e10cSrcweir 	Graphic aGraphic;
1269cdf0e10cSrcweir 	try
1270cdf0e10cSrcweir 	{
1271cdf0e10cSrcweir 		rtl::Reference< GraphicExporter > xExporter( new GraphicExporter() );
1272cdf0e10cSrcweir 		Reference< XComponent > xComp( rShape.getUnoShape(), UNO_QUERY_THROW );
1273cdf0e10cSrcweir 		xExporter->setSourceDocument( xComp );
1274cdf0e10cSrcweir 		ExportSettings aSettings( rShape.GetModel() );
1275cdf0e10cSrcweir 		xExporter->GetGraphic( aSettings, aGraphic, bVector );
1276cdf0e10cSrcweir 	}
1277cdf0e10cSrcweir 	catch( Exception& )
1278cdf0e10cSrcweir 	{
1279cdf0e10cSrcweir 		DBG_ERROR("SvxGetGraphicForShape(), exception caught!");
1280cdf0e10cSrcweir 	}
1281cdf0e10cSrcweir 	return aGraphic;
1282cdf0e10cSrcweir }
1283cdf0e10cSrcweir 
1284