xref: /trunk/main/sfx2/source/doc/graphhelp.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sfx2.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #ifdef WNT
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #undef WB_LEFT
34*cdf0e10cSrcweir #undef WB_RIGHT
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #define UINT64 USE_WIN_UINT64
37*cdf0e10cSrcweir #define INT64 USE_WIN_INT64
38*cdf0e10cSrcweir #define UINT32 USE_WIN_UINT32
39*cdf0e10cSrcweir #define INT32 USE_WIN_INT32
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir #include <tools/presys.h>
42*cdf0e10cSrcweir #if defined _MSC_VER
43*cdf0e10cSrcweir #pragma warning(push, 1)
44*cdf0e10cSrcweir #endif
45*cdf0e10cSrcweir #include <windows.h>
46*cdf0e10cSrcweir #if defined _MSC_VER
47*cdf0e10cSrcweir #pragma warning(pop)
48*cdf0e10cSrcweir #endif
49*cdf0e10cSrcweir #include <tools/postsys.h>
50*cdf0e10cSrcweir 
51*cdf0e10cSrcweir #undef UINT64
52*cdf0e10cSrcweir #undef INT64
53*cdf0e10cSrcweir #undef UINT32
54*cdf0e10cSrcweir #undef INT32
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir #endif
57*cdf0e10cSrcweir #include <com/sun/star/uno/Exception.hpp>
58*cdf0e10cSrcweir #include <com/sun/star/datatransfer/XTransferable.hpp>
59*cdf0e10cSrcweir #include <com/sun/star/lang/XMultiServiceFactory.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/graphic/XGraphicProvider.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/graphic/XGraphic.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/io/XStream.hpp>
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir #include <osl/thread.h>
66*cdf0e10cSrcweir #include <vcl/gdimtf.hxx>
67*cdf0e10cSrcweir #include <vcl/graph.hxx>
68*cdf0e10cSrcweir #include <vcl/cvtgrf.hxx>
69*cdf0e10cSrcweir #include <vcl/outdev.hxx>
70*cdf0e10cSrcweir #include <vcl/virdev.hxx>
71*cdf0e10cSrcweir #include <vcl/bitmapex.hxx>
72*cdf0e10cSrcweir #include <vcl/salbtype.hxx>
73*cdf0e10cSrcweir 
74*cdf0e10cSrcweir #include <tools/stream.hxx>
75*cdf0e10cSrcweir #include <unotools/tempfile.hxx>
76*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
77*cdf0e10cSrcweir #include <unotools/streamwrap.hxx>
78*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir #include "sfx2/sfxresid.hxx"
82*cdf0e10cSrcweir #include "graphhelp.hxx"
83*cdf0e10cSrcweir #include "doc.hrc"
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir using namespace ::com::sun::star;
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir #define THUMBNAIL_RESOLUTION 256
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir //---------------------------------------------------------------
90*cdf0e10cSrcweir // static
91*cdf0e10cSrcweir SvMemoryStream* GraphicHelper::getFormatStrFromGDI_Impl( const GDIMetaFile* pGDIMeta, sal_uInt32 nFormat )
92*cdf0e10cSrcweir {
93*cdf0e10cSrcweir 	SvMemoryStream* pResult = NULL;
94*cdf0e10cSrcweir 	if ( pGDIMeta )
95*cdf0e10cSrcweir 	{
96*cdf0e10cSrcweir 		SvMemoryStream* pStream = new SvMemoryStream( 65535, 65535 );
97*cdf0e10cSrcweir 		if ( pStream )
98*cdf0e10cSrcweir 		{
99*cdf0e10cSrcweir 			Graphic aGraph( *pGDIMeta );
100*cdf0e10cSrcweir 			if ( GraphicConverter::Export( *pStream, aGraph, nFormat ) == 0 )
101*cdf0e10cSrcweir 				pResult = pStream;
102*cdf0e10cSrcweir 			else
103*cdf0e10cSrcweir 				delete pStream;
104*cdf0e10cSrcweir 		}
105*cdf0e10cSrcweir 	}
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir 	return pResult;
108*cdf0e10cSrcweir }
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir //---------------------------------------------------------------
111*cdf0e10cSrcweir // static
112*cdf0e10cSrcweir void* GraphicHelper::getEnhMetaFileFromGDI_Impl( const GDIMetaFile* pGDIMeta )
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir     (void)pGDIMeta;  // unused
115*cdf0e10cSrcweir 	void* pResult = NULL;
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir #ifdef WNT
118*cdf0e10cSrcweir 	if ( pGDIMeta )
119*cdf0e10cSrcweir 	{
120*cdf0e10cSrcweir 		String aStr = ::rtl::OUString::createFromAscii( ".emf" );
121*cdf0e10cSrcweir 		::utl::TempFile aTempFile( ::rtl::OUString(),
122*cdf0e10cSrcweir 								   &aStr,
123*cdf0e10cSrcweir 								   NULL,
124*cdf0e10cSrcweir 								   sal_False );
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir 		::rtl::OUString aMetaFile = aTempFile.GetFileName();
127*cdf0e10cSrcweir 		::rtl::OUString aMetaURL = aTempFile.GetURL();
128*cdf0e10cSrcweir 		::rtl::OString aWinFile = ::rtl::OUStringToOString( aMetaFile, osl_getThreadTextEncoding() );
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir 		SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( aMetaURL, STREAM_STD_READWRITE );
131*cdf0e10cSrcweir 		if ( pStream )
132*cdf0e10cSrcweir 		{
133*cdf0e10cSrcweir 			Graphic aGraph( *pGDIMeta );
134*cdf0e10cSrcweir 			sal_Bool bFailed = (sal_Bool)GraphicConverter::Export( *pStream, aGraph, CVT_EMF );
135*cdf0e10cSrcweir 			pStream->Flush();
136*cdf0e10cSrcweir 			delete pStream;
137*cdf0e10cSrcweir 
138*cdf0e10cSrcweir 			if ( !bFailed )
139*cdf0e10cSrcweir 				pResult = GetEnhMetaFileA( aWinFile.getStr() );
140*cdf0e10cSrcweir 		}
141*cdf0e10cSrcweir 	}
142*cdf0e10cSrcweir #endif
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 	return pResult;
145*cdf0e10cSrcweir }
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir //---------------------------------------------------------------
148*cdf0e10cSrcweir // static
149*cdf0e10cSrcweir void* GraphicHelper::getWinMetaFileFromGDI_Impl( const GDIMetaFile* pGDIMeta, const Size& aMetaSize )
150*cdf0e10cSrcweir {
151*cdf0e10cSrcweir     (void)pGDIMeta;  // unused
152*cdf0e10cSrcweir     (void)aMetaSize; // unused
153*cdf0e10cSrcweir     void* pResult = NULL;
154*cdf0e10cSrcweir 
155*cdf0e10cSrcweir #ifdef WNT
156*cdf0e10cSrcweir 	if ( pGDIMeta )
157*cdf0e10cSrcweir 	{
158*cdf0e10cSrcweir 		SvMemoryStream* pStream = new SvMemoryStream( 65535, 65535 );
159*cdf0e10cSrcweir 		if ( pStream )
160*cdf0e10cSrcweir 		{
161*cdf0e10cSrcweir 			Graphic aGraph( *pGDIMeta );
162*cdf0e10cSrcweir 			sal_Bool bFailed = (sal_Bool)GraphicConverter::Export( *pStream, aGraph, CVT_WMF );
163*cdf0e10cSrcweir 			pStream->Flush();
164*cdf0e10cSrcweir 			if ( !bFailed )
165*cdf0e10cSrcweir 			{
166*cdf0e10cSrcweir 				sal_Int32 nLength = pStream->Seek( STREAM_SEEK_TO_END );
167*cdf0e10cSrcweir 				if ( nLength > 22 )
168*cdf0e10cSrcweir 				{
169*cdf0e10cSrcweir 					HMETAFILE hMeta = SetMetaFileBitsEx( nLength - 22,
170*cdf0e10cSrcweir 									( reinterpret_cast< const sal_uChar*>( pStream->GetData() ) ) + 22 );
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir 					if ( hMeta )
173*cdf0e10cSrcweir 					{
174*cdf0e10cSrcweir 						HGLOBAL hMemory = GlobalAlloc( GMEM_DDESHARE | GMEM_MOVEABLE, sizeof( METAFILEPICT ) );
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir 						if ( hMemory )
177*cdf0e10cSrcweir 						{
178*cdf0e10cSrcweir    							METAFILEPICT* pMF = (METAFILEPICT*)GlobalLock( hMemory );
179*cdf0e10cSrcweir 
180*cdf0e10cSrcweir    							pMF->hMF = hMeta;
181*cdf0e10cSrcweir    							pMF->mm = MM_ANISOTROPIC;
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 							MapMode aMetaMode = pGDIMeta->GetPrefMapMode();
184*cdf0e10cSrcweir 							MapMode aWinMode( MAP_100TH_MM );
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir 							if ( aWinMode == pGDIMeta->GetPrefMapMode() )
187*cdf0e10cSrcweir 							{
188*cdf0e10cSrcweir 								pMF->xExt = aMetaSize.Width();
189*cdf0e10cSrcweir 								pMF->yExt = aMetaSize.Height();
190*cdf0e10cSrcweir 							}
191*cdf0e10cSrcweir 							else
192*cdf0e10cSrcweir 							{
193*cdf0e10cSrcweir 								Size aWinSize = OutputDevice::LogicToLogic( Size( aMetaSize.Width(), aMetaSize.Height() ),
194*cdf0e10cSrcweir 																			pGDIMeta->GetPrefMapMode(),
195*cdf0e10cSrcweir 																			aWinMode );
196*cdf0e10cSrcweir 								pMF->xExt = aWinSize.Width();
197*cdf0e10cSrcweir 								pMF->yExt = aWinSize.Height();
198*cdf0e10cSrcweir 							}
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir 							GlobalUnlock( hMemory );
201*cdf0e10cSrcweir 							pResult = (void*)hMemory;
202*cdf0e10cSrcweir 						}
203*cdf0e10cSrcweir 						else
204*cdf0e10cSrcweir    							DeleteMetaFile( hMeta );
205*cdf0e10cSrcweir 					}
206*cdf0e10cSrcweir 				}
207*cdf0e10cSrcweir 			}
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir 			delete pStream;
210*cdf0e10cSrcweir 		}
211*cdf0e10cSrcweir 	}
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir #endif
214*cdf0e10cSrcweir 
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir 	return pResult;
217*cdf0e10cSrcweir }
218*cdf0e10cSrcweir 
219*cdf0e10cSrcweir //---------------------------------------------------------------
220*cdf0e10cSrcweir // static
221*cdf0e10cSrcweir sal_Bool GraphicHelper::supportsMetaFileHandle_Impl()
222*cdf0e10cSrcweir {
223*cdf0e10cSrcweir #ifdef WNT
224*cdf0e10cSrcweir 	return sal_True;
225*cdf0e10cSrcweir #else
226*cdf0e10cSrcweir 	return sal_False;
227*cdf0e10cSrcweir #endif
228*cdf0e10cSrcweir }
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir //---------------------------------------------------------------
231*cdf0e10cSrcweir // static
232*cdf0e10cSrcweir sal_Bool GraphicHelper::mergeBitmaps_Impl( const BitmapEx& rBmpEx, const BitmapEx& rOverlay,
233*cdf0e10cSrcweir 				   const Rectangle& rOverlayRect, BitmapEx& rReturn )
234*cdf0e10cSrcweir {
235*cdf0e10cSrcweir 	// the implementation is provided by KA
236*cdf0e10cSrcweir 
237*cdf0e10cSrcweir 	Point			aNullPt;
238*cdf0e10cSrcweir 	Rectangle		aBmpRect( aNullPt, rBmpEx.GetSizePixel() );
239*cdf0e10cSrcweir 	VirtualDevice	aVDev;
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir 	if( !rReturn.IsEmpty() )
242*cdf0e10cSrcweir 		rReturn.SetEmpty();
243*cdf0e10cSrcweir 
244*cdf0e10cSrcweir 	if( !rBmpEx.IsEmpty() && aVDev.SetOutputSizePixel( aBmpRect.GetSize() ) )
245*cdf0e10cSrcweir 	{
246*cdf0e10cSrcweir 		Rectangle aOverlayRect( rOverlayRect );
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir 		aOverlayRect.Intersection( aBmpRect );
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir 		if( rOverlay.IsEmpty() || rOverlayRect.IsEmpty() )
251*cdf0e10cSrcweir 			rReturn = rBmpEx;
252*cdf0e10cSrcweir 		else
253*cdf0e10cSrcweir 		{
254*cdf0e10cSrcweir 			aVDev.DrawBitmap( aNullPt, aVDev.GetOutputSizePixel(), rBmpEx.GetBitmap() );
255*cdf0e10cSrcweir 			aVDev.DrawBitmapEx( aOverlayRect.TopLeft(), aOverlayRect.GetSize(), rOverlay );
256*cdf0e10cSrcweir 
257*cdf0e10cSrcweir 			Bitmap aBmp( aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ) );
258*cdf0e10cSrcweir 			aBmp.Convert( BMP_CONVERSION_24BIT );
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir 			if( !rBmpEx.IsTransparent() )
261*cdf0e10cSrcweir 				rReturn = aBmp;
262*cdf0e10cSrcweir 			else
263*cdf0e10cSrcweir 			{
264*cdf0e10cSrcweir 				aVDev.DrawBitmap( aNullPt, aVDev.GetOutputSizePixel(), rBmpEx.GetMask() );
265*cdf0e10cSrcweir 				Bitmap aOverlayMergeBmp( aVDev.GetBitmap( aOverlayRect.TopLeft(), aOverlayRect.GetSize() ) );
266*cdf0e10cSrcweir 
267*cdf0e10cSrcweir 				if( rOverlay.IsTransparent() )
268*cdf0e10cSrcweir 					aVDev.DrawBitmap( aOverlayRect.TopLeft(), aOverlayRect.GetSize(), rOverlay.GetMask() );
269*cdf0e10cSrcweir 				else
270*cdf0e10cSrcweir 				{
271*cdf0e10cSrcweir 					aVDev.SetLineColor( COL_BLACK );
272*cdf0e10cSrcweir 					aVDev.SetFillColor( COL_BLACK );
273*cdf0e10cSrcweir 					aVDev.DrawRect( aOverlayRect);
274*cdf0e10cSrcweir 				}
275*cdf0e10cSrcweir 
276*cdf0e10cSrcweir 				aOverlayMergeBmp.CombineSimple( aVDev.GetBitmap( aOverlayRect.TopLeft(), aOverlayRect.GetSize() ), BMP_COMBINE_AND );
277*cdf0e10cSrcweir 				aVDev.DrawBitmap( aOverlayRect.TopLeft(), aOverlayRect.GetSize(), aOverlayMergeBmp );
278*cdf0e10cSrcweir 				rReturn = BitmapEx( aBmp, aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ) );
279*cdf0e10cSrcweir 			}
280*cdf0e10cSrcweir 		}
281*cdf0e10cSrcweir 	}
282*cdf0e10cSrcweir 
283*cdf0e10cSrcweir 	return !rReturn.IsEmpty();
284*cdf0e10cSrcweir }
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir //---------------------------------------------------------------
288*cdf0e10cSrcweir // static
289*cdf0e10cSrcweir sal_Bool GraphicHelper::createThumb_Impl( const GDIMetaFile& rMtf,
290*cdf0e10cSrcweir 				       sal_uInt32 nMaximumExtent,
291*cdf0e10cSrcweir 				       BitmapEx& rBmpEx,
292*cdf0e10cSrcweir 				       const BitmapEx* pOverlay,
293*cdf0e10cSrcweir 				       const Rectangle* pOverlayRect )
294*cdf0e10cSrcweir {
295*cdf0e10cSrcweir 	// the implementation is provided by KA
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir 	// initialization seems to be complicated but is used to avoid rounding errors
298*cdf0e10cSrcweir 	VirtualDevice	aVDev;
299*cdf0e10cSrcweir 	const Point     aNullPt;
300*cdf0e10cSrcweir 	const Point     aTLPix( aVDev.LogicToPixel( aNullPt, rMtf.GetPrefMapMode() ) );
301*cdf0e10cSrcweir 	const Point     aBRPix( aVDev.LogicToPixel( Point( rMtf.GetPrefSize().Width() - 1, rMtf.GetPrefSize().Height() - 1 ), rMtf.GetPrefMapMode() ) );
302*cdf0e10cSrcweir 	Size            aDrawSize( aVDev.LogicToPixel( rMtf.GetPrefSize(), rMtf.GetPrefMapMode() ) );
303*cdf0e10cSrcweir 	Size			aSizePix( labs( aBRPix.X() - aTLPix.X() ) + 1, labs( aBRPix.Y() - aTLPix.Y() ) + 1 );
304*cdf0e10cSrcweir 	Point			aPosPix;
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir 	if ( !rBmpEx.IsEmpty() )
307*cdf0e10cSrcweir 		rBmpEx.SetEmpty();
308*cdf0e10cSrcweir 
309*cdf0e10cSrcweir 	// determine size that has the same aspect ratio as image size and
310*cdf0e10cSrcweir 	// fits into the rectangle determined by nMaximumExtent
311*cdf0e10cSrcweir 	if ( aSizePix.Width() && aSizePix.Height() &&
312*cdf0e10cSrcweir             ( sal::static_int_cast<sal_uInt32>(aSizePix.Width()) > nMaximumExtent ||
313*cdf0e10cSrcweir               sal::static_int_cast<sal_uInt32>(aSizePix.Height()) > nMaximumExtent ) )
314*cdf0e10cSrcweir 	{
315*cdf0e10cSrcweir 		const Size  aOldSizePix( aSizePix );
316*cdf0e10cSrcweir 		double      fWH = static_cast< double >( aSizePix.Width() ) / aSizePix.Height();
317*cdf0e10cSrcweir 
318*cdf0e10cSrcweir 		if ( fWH <= 1.0 )
319*cdf0e10cSrcweir 		{
320*cdf0e10cSrcweir 			aSizePix.Width() = FRound( nMaximumExtent * fWH );
321*cdf0e10cSrcweir 			aSizePix.Height() = nMaximumExtent;
322*cdf0e10cSrcweir 		}
323*cdf0e10cSrcweir 		else
324*cdf0e10cSrcweir 		{
325*cdf0e10cSrcweir 			aSizePix.Width() = nMaximumExtent;
326*cdf0e10cSrcweir 			aSizePix.Height() = FRound(  nMaximumExtent / fWH );
327*cdf0e10cSrcweir 		}
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir 		aDrawSize.Width() = FRound( ( static_cast< double >( aDrawSize.Width() ) * aSizePix.Width() ) / aOldSizePix.Width() );
330*cdf0e10cSrcweir 		aDrawSize.Height() = FRound( ( static_cast< double >( aDrawSize.Height() ) * aSizePix.Height() ) / aOldSizePix.Height() );
331*cdf0e10cSrcweir 	}
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir 	Size 		aFullSize;
334*cdf0e10cSrcweir 	Point		aBackPosPix;
335*cdf0e10cSrcweir 	Rectangle 	aOverlayRect;
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir 	// calculate addigtional positions and sizes if an overlay image is used
338*cdf0e10cSrcweir 	if (  pOverlay )
339*cdf0e10cSrcweir 	{
340*cdf0e10cSrcweir 		aFullSize = Size( nMaximumExtent, nMaximumExtent );
341*cdf0e10cSrcweir 		aOverlayRect = Rectangle( aNullPt, aFullSize  );
342*cdf0e10cSrcweir 
343*cdf0e10cSrcweir 		aOverlayRect.Intersection( pOverlayRect ? *pOverlayRect : Rectangle( aNullPt, pOverlay->GetSizePixel() ) );
344*cdf0e10cSrcweir 
345*cdf0e10cSrcweir 		if ( !aOverlayRect.IsEmpty() )
346*cdf0e10cSrcweir 			aBackPosPix = Point( ( nMaximumExtent - aSizePix.Width() ) >> 1, ( nMaximumExtent - aSizePix.Height() ) >> 1 );
347*cdf0e10cSrcweir 		else
348*cdf0e10cSrcweir 			pOverlay = NULL;
349*cdf0e10cSrcweir 	}
350*cdf0e10cSrcweir 	else
351*cdf0e10cSrcweir 	{
352*cdf0e10cSrcweir 		aFullSize = aSizePix;
353*cdf0e10cSrcweir 		pOverlay = NULL;
354*cdf0e10cSrcweir 	}
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir 	// draw image(s) into VDev and get resulting image
357*cdf0e10cSrcweir 	if ( aVDev.SetOutputSizePixel( aFullSize ) )
358*cdf0e10cSrcweir 	{
359*cdf0e10cSrcweir 		// draw metafile into VDev
360*cdf0e10cSrcweir 		const_cast< GDIMetaFile& >( rMtf ).WindStart();
361*cdf0e10cSrcweir 		const_cast< GDIMetaFile& >( rMtf ).Play( &aVDev, aBackPosPix, aDrawSize );
362*cdf0e10cSrcweir 
363*cdf0e10cSrcweir 		// draw overlay if neccessary
364*cdf0e10cSrcweir 		if ( pOverlay )
365*cdf0e10cSrcweir 			aVDev.DrawBitmapEx( aOverlayRect.TopLeft(), aOverlayRect.GetSize(), *pOverlay );
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir 		// get paint bitmap
368*cdf0e10cSrcweir 		Bitmap aBmp( aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ) );
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir 		// assure that we have a true color image
371*cdf0e10cSrcweir 		if ( aBmp.GetBitCount() != 24 )
372*cdf0e10cSrcweir 			aBmp.Convert( BMP_CONVERSION_24BIT );
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir 		rBmpEx = BitmapEx( aBmp );
375*cdf0e10cSrcweir 	}
376*cdf0e10cSrcweir 
377*cdf0e10cSrcweir 	return !rBmpEx.IsEmpty();
378*cdf0e10cSrcweir }
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir //---------------------------------------------------------------
381*cdf0e10cSrcweir // static
382*cdf0e10cSrcweir sal_Bool GraphicHelper::getThumbnailFormatFromGDI_Impl( GDIMetaFile* pMetaFile,
383*cdf0e10cSrcweir 														sal_Bool bSigned,
384*cdf0e10cSrcweir 														const uno::Reference< io::XStream >& xStream )
385*cdf0e10cSrcweir {
386*cdf0e10cSrcweir 	sal_Bool bResult = sal_False;
387*cdf0e10cSrcweir 	SvStream* pStream = NULL;
388*cdf0e10cSrcweir 
389*cdf0e10cSrcweir 	if ( xStream.is() )
390*cdf0e10cSrcweir 		pStream = ::utl::UcbStreamHelper::CreateStream( xStream );
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 	if ( pMetaFile && pStream && !pStream->GetError() )
393*cdf0e10cSrcweir 	{
394*cdf0e10cSrcweir 		BitmapEx aResultBitmap;
395*cdf0e10cSrcweir 		BitmapEx* pSignatureBitmap = NULL;
396*cdf0e10cSrcweir 
397*cdf0e10cSrcweir 		if ( bSigned )
398*cdf0e10cSrcweir 			pSignatureBitmap = new BitmapEx( SfxResId( BMP_SIGNATURE ) );
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir 		bResult = createThumb_Impl( *pMetaFile,
401*cdf0e10cSrcweir 			       				    THUMBNAIL_RESOLUTION,
402*cdf0e10cSrcweir 			       				    aResultBitmap,
403*cdf0e10cSrcweir 								    pSignatureBitmap );
404*cdf0e10cSrcweir 		if ( bResult )
405*cdf0e10cSrcweir 			bResult = ( !aResultBitmap.IsEmpty()
406*cdf0e10cSrcweir 						&& GraphicConverter::Export( *pStream, aResultBitmap, CVT_PNG ) == 0
407*cdf0e10cSrcweir 						&& ( pStream->Flush(), !pStream->GetError() ) );
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir 		if ( pSignatureBitmap )
410*cdf0e10cSrcweir 			delete pSignatureBitmap;
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir 		delete pStream;
413*cdf0e10cSrcweir 	}
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir 	return bResult;
416*cdf0e10cSrcweir }
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir //---------------------------------------------------------------
419*cdf0e10cSrcweir // static
420*cdf0e10cSrcweir sal_Bool GraphicHelper::getSignedThumbnailFormatFromBitmap_Impl( const BitmapEx& aBitmap,
421*cdf0e10cSrcweir 																 const uno::Reference< io::XStream >& xStream )
422*cdf0e10cSrcweir {
423*cdf0e10cSrcweir 	sal_Bool bResult = sal_False;
424*cdf0e10cSrcweir 	SvStream* pStream = NULL;
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir 	if ( xStream.is() )
427*cdf0e10cSrcweir 		pStream = ::utl::UcbStreamHelper::CreateStream( xStream );
428*cdf0e10cSrcweir 
429*cdf0e10cSrcweir 	if ( pStream && !pStream->GetError() )
430*cdf0e10cSrcweir 	{
431*cdf0e10cSrcweir 		BitmapEx aResultBitmap;
432*cdf0e10cSrcweir 		BitmapEx aSignatureBitmap( SfxResId( BMP_SIGNATURE ) );
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir 		bResult = mergeBitmaps_Impl( aBitmap,
435*cdf0e10cSrcweir 									aSignatureBitmap,
436*cdf0e10cSrcweir 									Rectangle( Point(), aBitmap.GetSizePixel() ),
437*cdf0e10cSrcweir 									aResultBitmap );
438*cdf0e10cSrcweir 
439*cdf0e10cSrcweir 		if ( bResult )
440*cdf0e10cSrcweir 		{
441*cdf0e10cSrcweir 			bResult = ( !aResultBitmap.IsEmpty()
442*cdf0e10cSrcweir 						&& GraphicConverter::Export( *pStream, aResultBitmap, CVT_PNG ) == 0
443*cdf0e10cSrcweir 						&& ( pStream->Flush(), !pStream->GetError() ) );
444*cdf0e10cSrcweir 		}
445*cdf0e10cSrcweir 
446*cdf0e10cSrcweir 		delete pStream;
447*cdf0e10cSrcweir 	}
448*cdf0e10cSrcweir 
449*cdf0e10cSrcweir 	return bResult;
450*cdf0e10cSrcweir }
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir //---------------------------------------------------------------
453*cdf0e10cSrcweir // static
454*cdf0e10cSrcweir sal_Bool GraphicHelper::getThumbnailReplacement_Impl( sal_Int32 nResID, const uno::Reference< io::XStream >& xStream )
455*cdf0e10cSrcweir {
456*cdf0e10cSrcweir 	sal_Bool bResult = sal_False;
457*cdf0e10cSrcweir 	if ( nResID && xStream.is() )
458*cdf0e10cSrcweir 	{
459*cdf0e10cSrcweir     	uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
460*cdf0e10cSrcweir 		if ( xServiceManager.is() )
461*cdf0e10cSrcweir 		{
462*cdf0e10cSrcweir 			try
463*cdf0e10cSrcweir 			{
464*cdf0e10cSrcweir 				uno::Reference< graphic::XGraphicProvider > xGraphProvider(
465*cdf0e10cSrcweir 					xServiceManager->createInstance(
466*cdf0e10cSrcweir 						::rtl::OUString::createFromAscii( "com.sun.star.graphic.GraphicProvider" ) ),
467*cdf0e10cSrcweir 					uno::UNO_QUERY );
468*cdf0e10cSrcweir 				if ( xGraphProvider.is() )
469*cdf0e10cSrcweir 				{
470*cdf0e10cSrcweir 					::rtl::OUString aURL = ::rtl::OUString::createFromAscii( "private:resource/sfx/bitmapex/" );
471*cdf0e10cSrcweir 					aURL += ::rtl::OUString::valueOf( nResID );
472*cdf0e10cSrcweir 
473*cdf0e10cSrcweir 					uno::Sequence< beans::PropertyValue > aMediaProps( 1 );
474*cdf0e10cSrcweir 					aMediaProps[0].Name = ::rtl::OUString::createFromAscii( "URL" );
475*cdf0e10cSrcweir 					aMediaProps[0].Value <<= aURL;
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir 					uno::Reference< graphic::XGraphic > xGraphic = xGraphProvider->queryGraphic( aMediaProps );
478*cdf0e10cSrcweir 					if ( xGraphic.is() )
479*cdf0e10cSrcweir 					{
480*cdf0e10cSrcweir 						uno::Sequence< beans::PropertyValue > aStoreProps( 2 );
481*cdf0e10cSrcweir 						aStoreProps[0].Name = ::rtl::OUString::createFromAscii( "OutputStream" );
482*cdf0e10cSrcweir 						aStoreProps[0].Value <<= xStream;
483*cdf0e10cSrcweir 						aStoreProps[1].Name = ::rtl::OUString::createFromAscii( "MimeType" );
484*cdf0e10cSrcweir 						aStoreProps[1].Value <<= ::rtl::OUString::createFromAscii( "image/png" );
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir 						xGraphProvider->storeGraphic( xGraphic, aStoreProps );
487*cdf0e10cSrcweir 						bResult = sal_True;
488*cdf0e10cSrcweir 					}
489*cdf0e10cSrcweir 				}
490*cdf0e10cSrcweir 			}
491*cdf0e10cSrcweir 			catch( uno::Exception& )
492*cdf0e10cSrcweir 			{
493*cdf0e10cSrcweir 			}
494*cdf0e10cSrcweir 		}
495*cdf0e10cSrcweir 	}
496*cdf0e10cSrcweir 
497*cdf0e10cSrcweir 	return bResult;
498*cdf0e10cSrcweir }
499*cdf0e10cSrcweir 
500*cdf0e10cSrcweir //---------------------------------------------------------------
501*cdf0e10cSrcweir // static
502*cdf0e10cSrcweir sal_uInt16 GraphicHelper::getThumbnailReplacementIDByFactoryName_Impl( const ::rtl::OUString& aFactoryShortName, sal_Bool /*bIsTemplate*/ )
503*cdf0e10cSrcweir {
504*cdf0e10cSrcweir 	sal_uInt16 nResult = 0;
505*cdf0e10cSrcweir 
506*cdf0e10cSrcweir 	if ( aFactoryShortName.equalsAscii( "scalc" ) )
507*cdf0e10cSrcweir 	{
508*cdf0e10cSrcweir 		nResult = BMP_128X128_CALC_DOC;
509*cdf0e10cSrcweir 	}
510*cdf0e10cSrcweir 	else if ( aFactoryShortName.equalsAscii( "sdraw" ) )
511*cdf0e10cSrcweir 	{
512*cdf0e10cSrcweir 		nResult = BMP_128X128_DRAW_DOC;
513*cdf0e10cSrcweir 	}
514*cdf0e10cSrcweir 	else if ( aFactoryShortName.equalsAscii( "simpress" ) )
515*cdf0e10cSrcweir 	{
516*cdf0e10cSrcweir 		nResult = BMP_128X128_IMPRESS_DOC;
517*cdf0e10cSrcweir 	}
518*cdf0e10cSrcweir 	else if ( aFactoryShortName.equalsAscii( "smath" ) )
519*cdf0e10cSrcweir 	{
520*cdf0e10cSrcweir 		nResult = BMP_128X128_MATH_DOC;
521*cdf0e10cSrcweir 	}
522*cdf0e10cSrcweir 	else if ( aFactoryShortName.equalsAscii( "swriter" ) || aFactoryShortName.compareToAscii( "swriter/", 8 ) == 0 )
523*cdf0e10cSrcweir 	{
524*cdf0e10cSrcweir 		nResult = BMP_128X128_WRITER_DOC;
525*cdf0e10cSrcweir 	}
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir 	return nResult;
528*cdf0e10cSrcweir }
529*cdf0e10cSrcweir 
530