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