xref: /trunk/main/sfx2/source/doc/graphhelp.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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