19f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 59f62ea84SAndrew Rist * distributed with this work for additional information 69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 149f62ea84SAndrew Rist * software distributed under the License is distributed on an 159f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 179f62ea84SAndrew Rist * specific language governing permissions and limitations 189f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209f62ea84SAndrew Rist *************************************************************/ 219f62ea84SAndrew Rist 22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 23cdf0e10cSrcweir #include "precompiled_vcl.hxx" 24cdf0e10cSrcweir 25cdf0e10cSrcweir #include <tools/vcompat.hxx> 26cdf0e10cSrcweir #include <tools/urlobj.hxx> 27cdf0e10cSrcweir #include <tools/debug.hxx> 28cdf0e10cSrcweir #include <tools/stream.hxx> 29cdf0e10cSrcweir #include <ucbhelper/content.hxx> 30cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx> 31cdf0e10cSrcweir #include <unotools/tempfile.hxx> 32cdf0e10cSrcweir #include <vcl/outdev.hxx> 33cdf0e10cSrcweir #include <vcl/virdev.hxx> 34cdf0e10cSrcweir #include <vcl/gfxlink.hxx> 35cdf0e10cSrcweir #include <vcl/cvtgrf.hxx> 36cdf0e10cSrcweir #include <vcl/salbtype.hxx> 37cdf0e10cSrcweir #include <vcl/graph.hxx> 38cdf0e10cSrcweir #include <vcl/metaact.hxx> 39cdf0e10cSrcweir #include <impgraph.hxx> 40cdf0e10cSrcweir #include <com/sun/star/ucb/CommandAbortedException.hpp> 41*45fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx> 42cdf0e10cSrcweir 43cdf0e10cSrcweir // ----------- 44cdf0e10cSrcweir // - Defines - 45cdf0e10cSrcweir // ----------- 46cdf0e10cSrcweir 47cdf0e10cSrcweir #define GRAPHIC_MAXPARTLEN 256000L 48cdf0e10cSrcweir #define GRAPHIC_MTFTOBMP_MAXEXT 2048 49cdf0e10cSrcweir #define GRAPHIC_STREAMBUFSIZE 8192UL 50cdf0e10cSrcweir 51cdf0e10cSrcweir #define SYS_WINMETAFILE 0x00000003L 52cdf0e10cSrcweir #define SYS_WNTMETAFILE 0x00000004L 53cdf0e10cSrcweir #define SYS_OS2METAFILE 0x00000005L 54cdf0e10cSrcweir #define SYS_MACMETAFILE 0x00000006L 55cdf0e10cSrcweir 56cdf0e10cSrcweir #define GRAPHIC_FORMAT_50 static_cast<sal_uInt32>(COMPAT_FORMAT( 'G', 'R', 'F', '5' )) 57cdf0e10cSrcweir #define NATIVE_FORMAT_50 static_cast<sal_uInt32>(COMPAT_FORMAT( 'N', 'A', 'T', '5' )) 58cdf0e10cSrcweir 59cdf0e10cSrcweir // --------------- 60cdf0e10cSrcweir // - ImpSwapFile - 61cdf0e10cSrcweir // --------------- 62cdf0e10cSrcweir 63cdf0e10cSrcweir struct ImpSwapFile 64cdf0e10cSrcweir { 65cdf0e10cSrcweir INetURLObject aSwapURL; 66cdf0e10cSrcweir sal_uLong nRefCount; 67cdf0e10cSrcweir }; 68cdf0e10cSrcweir 69cdf0e10cSrcweir // ----------------- 70cdf0e10cSrcweir // - Graphicreader - 71cdf0e10cSrcweir // ----------------- 72cdf0e10cSrcweir 73cdf0e10cSrcweir class ReaderData 74cdf0e10cSrcweir { 75cdf0e10cSrcweir public: 76cdf0e10cSrcweir Size maPreviewSize; 77cdf0e10cSrcweir }; 78cdf0e10cSrcweir 79cdf0e10cSrcweir GraphicReader::~GraphicReader() 80cdf0e10cSrcweir { 81cdf0e10cSrcweir delete mpReaderData; 82cdf0e10cSrcweir } 83cdf0e10cSrcweir 84cdf0e10cSrcweir // ------------------------------------------------------------------------ 85cdf0e10cSrcweir 86cdf0e10cSrcweir sal_Bool GraphicReader::IsPreviewModeEnabled() const 87cdf0e10cSrcweir { 88cdf0e10cSrcweir if( !mpReaderData ) 89cdf0e10cSrcweir return sal_False; 90cdf0e10cSrcweir if( mpReaderData->maPreviewSize.Width() ) 91cdf0e10cSrcweir return sal_True; 92cdf0e10cSrcweir if( mpReaderData->maPreviewSize.Height() ) 93cdf0e10cSrcweir return sal_True; 94cdf0e10cSrcweir return sal_False; 95cdf0e10cSrcweir } 96cdf0e10cSrcweir 97cdf0e10cSrcweir // ------------------------------------------------------------------------ 98cdf0e10cSrcweir 99cdf0e10cSrcweir void GraphicReader::DisablePreviewMode() 100cdf0e10cSrcweir { 101cdf0e10cSrcweir if( mpReaderData ) 102cdf0e10cSrcweir mpReaderData->maPreviewSize = Size( 0, 0 ); 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir // ------------------------------------------------------------------------ 106cdf0e10cSrcweir 107cdf0e10cSrcweir void GraphicReader::SetPreviewSize( const Size& rSize ) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir if( !mpReaderData ) 110cdf0e10cSrcweir mpReaderData = new ReaderData; 111cdf0e10cSrcweir mpReaderData->maPreviewSize = rSize; 112cdf0e10cSrcweir } 113cdf0e10cSrcweir 114cdf0e10cSrcweir // ------------------------------------------------------------------------ 115cdf0e10cSrcweir 116cdf0e10cSrcweir Size GraphicReader::GetPreviewSize() const 117cdf0e10cSrcweir { 118cdf0e10cSrcweir Size aSize( 0, 0 ); 119cdf0e10cSrcweir if( mpReaderData ) 120cdf0e10cSrcweir aSize = mpReaderData->maPreviewSize; 121cdf0e10cSrcweir return aSize; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir // -------------- 125cdf0e10cSrcweir // - ImpGraphic - 126cdf0e10cSrcweir // -------------- 127cdf0e10cSrcweir 128cdf0e10cSrcweir ImpGraphic::ImpGraphic() : 129cdf0e10cSrcweir mpAnimation ( NULL ), 130cdf0e10cSrcweir mpContext ( NULL ), 131cdf0e10cSrcweir mpSwapFile ( NULL ), 132cdf0e10cSrcweir mpGfxLink ( NULL ), 133cdf0e10cSrcweir meType ( GRAPHIC_NONE ), 134cdf0e10cSrcweir mnDocFilePos ( 0UL ), 135cdf0e10cSrcweir mnSizeBytes ( 0UL ), 136cdf0e10cSrcweir mnRefCount ( 1UL ), 137cdf0e10cSrcweir mbSwapOut ( sal_False ), 138cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 139cdf0e10cSrcweir { 140cdf0e10cSrcweir } 141cdf0e10cSrcweir 142cdf0e10cSrcweir // ------------------------------------------------------------------------ 143cdf0e10cSrcweir 144cdf0e10cSrcweir ImpGraphic::ImpGraphic( const ImpGraphic& rImpGraphic ) : 145cdf0e10cSrcweir maMetaFile ( rImpGraphic.maMetaFile ), 146cdf0e10cSrcweir maEx ( rImpGraphic.maEx ), 147cdf0e10cSrcweir mpContext ( NULL ), 148cdf0e10cSrcweir mpSwapFile ( rImpGraphic.mpSwapFile ), 149cdf0e10cSrcweir meType ( rImpGraphic.meType ), 150cdf0e10cSrcweir maDocFileURLStr ( rImpGraphic.maDocFileURLStr ), 151cdf0e10cSrcweir mnDocFilePos ( rImpGraphic.mnDocFilePos ), 152cdf0e10cSrcweir mnSizeBytes ( rImpGraphic.mnSizeBytes ), 153cdf0e10cSrcweir mnRefCount ( 1UL ), 154cdf0e10cSrcweir mbSwapOut ( rImpGraphic.mbSwapOut ), 155cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 156cdf0e10cSrcweir { 157cdf0e10cSrcweir if( mpSwapFile ) 158cdf0e10cSrcweir mpSwapFile->nRefCount++; 159cdf0e10cSrcweir 160cdf0e10cSrcweir if( rImpGraphic.mpGfxLink ) 161cdf0e10cSrcweir mpGfxLink = new GfxLink( *rImpGraphic.mpGfxLink ); 162cdf0e10cSrcweir else 163cdf0e10cSrcweir mpGfxLink = NULL; 164cdf0e10cSrcweir 165cdf0e10cSrcweir if( rImpGraphic.mpAnimation ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir mpAnimation = new Animation( *rImpGraphic.mpAnimation ); 168cdf0e10cSrcweir maEx = mpAnimation->GetBitmapEx(); 169cdf0e10cSrcweir } 170cdf0e10cSrcweir else 171cdf0e10cSrcweir mpAnimation = NULL; 172ddde725dSArmin Le Grand 173ddde725dSArmin Le Grand maSvgData = rImpGraphic.maSvgData; 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir // ------------------------------------------------------------------------ 177cdf0e10cSrcweir 178cdf0e10cSrcweir ImpGraphic::ImpGraphic( const Bitmap& rBitmap ) : 179cdf0e10cSrcweir maEx ( rBitmap ), 180cdf0e10cSrcweir mpAnimation ( NULL ), 181cdf0e10cSrcweir mpContext ( NULL ), 182cdf0e10cSrcweir mpSwapFile ( NULL ), 183cdf0e10cSrcweir mpGfxLink ( NULL ), 184cdf0e10cSrcweir meType ( !rBitmap ? GRAPHIC_NONE : GRAPHIC_BITMAP ), 185cdf0e10cSrcweir mnDocFilePos ( 0UL ), 186cdf0e10cSrcweir mnSizeBytes ( 0UL ), 187cdf0e10cSrcweir mnRefCount ( 1UL ), 188cdf0e10cSrcweir mbSwapOut ( sal_False ), 189cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir } 192cdf0e10cSrcweir 193cdf0e10cSrcweir // ------------------------------------------------------------------------ 194cdf0e10cSrcweir 195cdf0e10cSrcweir ImpGraphic::ImpGraphic( const BitmapEx& rBitmapEx ) : 196cdf0e10cSrcweir maEx ( rBitmapEx ), 197cdf0e10cSrcweir mpAnimation ( NULL ), 198cdf0e10cSrcweir mpContext ( NULL ), 199cdf0e10cSrcweir mpSwapFile ( NULL ), 200cdf0e10cSrcweir mpGfxLink ( NULL ), 201cdf0e10cSrcweir meType ( !rBitmapEx ? GRAPHIC_NONE : GRAPHIC_BITMAP ), 202cdf0e10cSrcweir mnDocFilePos ( 0UL ), 203cdf0e10cSrcweir mnSizeBytes ( 0UL ), 204cdf0e10cSrcweir mnRefCount ( 1UL ), 205cdf0e10cSrcweir mbSwapOut ( sal_False ), 206cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir } 209cdf0e10cSrcweir 210cdf0e10cSrcweir // ------------------------------------------------------------------------ 211cdf0e10cSrcweir 212ddde725dSArmin Le Grand ImpGraphic::ImpGraphic(const SvgDataPtr& rSvgDataPtr) 213ddde725dSArmin Le Grand : mpAnimation( NULL ), 214ddde725dSArmin Le Grand mpContext( NULL ), 215ddde725dSArmin Le Grand mpSwapFile( NULL ), 216ddde725dSArmin Le Grand mpGfxLink( NULL ), 217ddde725dSArmin Le Grand meType( rSvgDataPtr.get() ? GRAPHIC_BITMAP : GRAPHIC_NONE ), 218ddde725dSArmin Le Grand mnDocFilePos( 0UL ), 219ddde725dSArmin Le Grand mnSizeBytes( 0UL ), 220ddde725dSArmin Le Grand mnRefCount( 1UL ), 221ddde725dSArmin Le Grand mbSwapOut( sal_False ), 222ddde725dSArmin Le Grand mbSwapUnderway( sal_False ), 223ddde725dSArmin Le Grand maSvgData(rSvgDataPtr) 224ddde725dSArmin Le Grand { 225ddde725dSArmin Le Grand } 226ddde725dSArmin Le Grand 227ddde725dSArmin Le Grand // ------------------------------------------------------------------------ 228ddde725dSArmin Le Grand 229cdf0e10cSrcweir ImpGraphic::ImpGraphic( const Animation& rAnimation ) : 230cdf0e10cSrcweir maEx ( rAnimation.GetBitmapEx() ), 231cdf0e10cSrcweir mpAnimation ( new Animation( rAnimation ) ), 232cdf0e10cSrcweir mpContext ( NULL ), 233cdf0e10cSrcweir mpSwapFile ( NULL ), 234cdf0e10cSrcweir mpGfxLink ( NULL ), 235cdf0e10cSrcweir meType ( GRAPHIC_BITMAP ), 236cdf0e10cSrcweir mnDocFilePos ( 0UL ), 237cdf0e10cSrcweir mnSizeBytes ( 0UL ), 238cdf0e10cSrcweir mnRefCount ( 1UL ), 239cdf0e10cSrcweir mbSwapOut ( sal_False ), 240cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir // ------------------------------------------------------------------------ 245cdf0e10cSrcweir 246cdf0e10cSrcweir ImpGraphic::ImpGraphic( const GDIMetaFile& rMtf ) : 247cdf0e10cSrcweir maMetaFile ( rMtf ), 248cdf0e10cSrcweir mpAnimation ( NULL ), 249cdf0e10cSrcweir mpContext ( NULL ), 250cdf0e10cSrcweir mpSwapFile ( NULL ), 251cdf0e10cSrcweir mpGfxLink ( NULL ), 252cdf0e10cSrcweir meType ( GRAPHIC_GDIMETAFILE ), 253cdf0e10cSrcweir mnDocFilePos ( 0UL ), 254cdf0e10cSrcweir mnSizeBytes ( 0UL ), 255cdf0e10cSrcweir mnRefCount ( 1UL ), 256cdf0e10cSrcweir mbSwapOut ( sal_False ), 257cdf0e10cSrcweir mbSwapUnderway ( sal_False ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir } 260cdf0e10cSrcweir 261cdf0e10cSrcweir // ------------------------------------------------------------------------ 262cdf0e10cSrcweir 263cdf0e10cSrcweir ImpGraphic::~ImpGraphic() 264cdf0e10cSrcweir { 265cdf0e10cSrcweir ImplClear(); 266cdf0e10cSrcweir 267cdf0e10cSrcweir if( (sal_uLong) mpContext > 1UL ) 268cdf0e10cSrcweir delete mpContext; 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir // ------------------------------------------------------------------------ 272cdf0e10cSrcweir 273cdf0e10cSrcweir ImpGraphic& ImpGraphic::operator=( const ImpGraphic& rImpGraphic ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir if( &rImpGraphic != this ) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir if( !mbSwapUnderway ) 278cdf0e10cSrcweir ImplClear(); 279cdf0e10cSrcweir 280cdf0e10cSrcweir maMetaFile = rImpGraphic.maMetaFile; 281cdf0e10cSrcweir meType = rImpGraphic.meType; 282cdf0e10cSrcweir mnSizeBytes = rImpGraphic.mnSizeBytes; 283cdf0e10cSrcweir 284cdf0e10cSrcweir delete mpAnimation; 285cdf0e10cSrcweir 286cdf0e10cSrcweir if ( rImpGraphic.mpAnimation ) 287cdf0e10cSrcweir { 288cdf0e10cSrcweir mpAnimation = new Animation( *rImpGraphic.mpAnimation ); 289cdf0e10cSrcweir maEx = mpAnimation->GetBitmapEx(); 290cdf0e10cSrcweir } 291cdf0e10cSrcweir else 292cdf0e10cSrcweir { 293cdf0e10cSrcweir mpAnimation = NULL; 294cdf0e10cSrcweir maEx = rImpGraphic.maEx; 295cdf0e10cSrcweir } 296cdf0e10cSrcweir 297cdf0e10cSrcweir if( !mbSwapUnderway ) 298cdf0e10cSrcweir { 299cdf0e10cSrcweir maDocFileURLStr = rImpGraphic.maDocFileURLStr; 300cdf0e10cSrcweir mnDocFilePos = rImpGraphic.mnDocFilePos; 301cdf0e10cSrcweir mbSwapOut = rImpGraphic.mbSwapOut; 302cdf0e10cSrcweir mpSwapFile = rImpGraphic.mpSwapFile; 303cdf0e10cSrcweir 304cdf0e10cSrcweir if( mpSwapFile ) 305cdf0e10cSrcweir mpSwapFile->nRefCount++; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir delete mpGfxLink; 309cdf0e10cSrcweir 310cdf0e10cSrcweir if( rImpGraphic.mpGfxLink ) 311cdf0e10cSrcweir mpGfxLink = new GfxLink( *rImpGraphic.mpGfxLink ); 312cdf0e10cSrcweir else 313cdf0e10cSrcweir mpGfxLink = NULL; 314ddde725dSArmin Le Grand 315ddde725dSArmin Le Grand maSvgData = rImpGraphic.maSvgData; 316cdf0e10cSrcweir } 317cdf0e10cSrcweir 318cdf0e10cSrcweir return *this; 319cdf0e10cSrcweir } 320cdf0e10cSrcweir 321cdf0e10cSrcweir // ------------------------------------------------------------------------ 322cdf0e10cSrcweir 323cdf0e10cSrcweir sal_Bool ImpGraphic::operator==( const ImpGraphic& rImpGraphic ) const 324cdf0e10cSrcweir { 325cdf0e10cSrcweir sal_Bool bRet = sal_False; 326cdf0e10cSrcweir 327cdf0e10cSrcweir if( this == &rImpGraphic ) 328cdf0e10cSrcweir bRet = sal_True; 329cdf0e10cSrcweir else if( !ImplIsSwapOut() && ( rImpGraphic.meType == meType ) ) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir switch( meType ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir case( GRAPHIC_NONE ): 334cdf0e10cSrcweir bRet = sal_True; 335cdf0e10cSrcweir break; 336cdf0e10cSrcweir 337cdf0e10cSrcweir case( GRAPHIC_GDIMETAFILE ): 338cdf0e10cSrcweir { 339cdf0e10cSrcweir if( rImpGraphic.maMetaFile == maMetaFile ) 340cdf0e10cSrcweir bRet = sal_True; 341cdf0e10cSrcweir } 342cdf0e10cSrcweir break; 343cdf0e10cSrcweir 344cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 345cdf0e10cSrcweir { 346ddde725dSArmin Le Grand if(maSvgData.get()) 347ddde725dSArmin Le Grand { 348ddde725dSArmin Le Grand if(maSvgData == rImpGraphic.maSvgData) 349ddde725dSArmin Le Grand { 350ddde725dSArmin Le Grand bRet = sal_True; 351ddde725dSArmin Le Grand } 352ddde725dSArmin Le Grand else if(rImpGraphic.maSvgData) 353ddde725dSArmin Le Grand { 354ddde725dSArmin Le Grand if(maSvgData->getSvgDataArrayLength() == rImpGraphic.maSvgData->getSvgDataArrayLength()) 355ddde725dSArmin Le Grand { 356ddde725dSArmin Le Grand if(0 == memcmp( 357ddde725dSArmin Le Grand maSvgData->getSvgDataArray().get(), 358ddde725dSArmin Le Grand rImpGraphic.maSvgData->getSvgDataArray().get(), 359ddde725dSArmin Le Grand maSvgData->getSvgDataArrayLength())) 360ddde725dSArmin Le Grand { 361ddde725dSArmin Le Grand bRet = sal_True; 362ddde725dSArmin Le Grand } 363ddde725dSArmin Le Grand } 364ddde725dSArmin Le Grand } 365ddde725dSArmin Le Grand } 366ddde725dSArmin Le Grand else if( mpAnimation ) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir if( rImpGraphic.mpAnimation && ( *rImpGraphic.mpAnimation == *mpAnimation ) ) 369cdf0e10cSrcweir bRet = sal_True; 370cdf0e10cSrcweir } 371cdf0e10cSrcweir else if( !rImpGraphic.mpAnimation && ( rImpGraphic.maEx == maEx ) ) 372ddde725dSArmin Le Grand { 373cdf0e10cSrcweir bRet = sal_True; 374cdf0e10cSrcweir } 375ddde725dSArmin Le Grand } 376cdf0e10cSrcweir break; 377cdf0e10cSrcweir 378cdf0e10cSrcweir default: 379cdf0e10cSrcweir break; 380cdf0e10cSrcweir } 381cdf0e10cSrcweir } 382cdf0e10cSrcweir 383cdf0e10cSrcweir return bRet; 384cdf0e10cSrcweir } 385cdf0e10cSrcweir 386cdf0e10cSrcweir // ------------------------------------------------------------------------ 387cdf0e10cSrcweir 388cdf0e10cSrcweir void ImpGraphic::ImplClearGraphics( sal_Bool bCreateSwapInfo ) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir if( bCreateSwapInfo && !ImplIsSwapOut() ) 391cdf0e10cSrcweir { 392cdf0e10cSrcweir maSwapInfo.maPrefMapMode = ImplGetPrefMapMode(); 393cdf0e10cSrcweir maSwapInfo.maPrefSize = ImplGetPrefSize(); 394cdf0e10cSrcweir } 395cdf0e10cSrcweir 396cdf0e10cSrcweir maEx.Clear(); 397cdf0e10cSrcweir maMetaFile.Clear(); 398cdf0e10cSrcweir 399cdf0e10cSrcweir if( mpAnimation ) 400cdf0e10cSrcweir { 401cdf0e10cSrcweir mpAnimation->Clear(); 402cdf0e10cSrcweir delete mpAnimation; 403cdf0e10cSrcweir mpAnimation = NULL; 404cdf0e10cSrcweir } 405cdf0e10cSrcweir 406cdf0e10cSrcweir if( mpGfxLink ) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir delete mpGfxLink; 409cdf0e10cSrcweir mpGfxLink = NULL; 410cdf0e10cSrcweir } 411ddde725dSArmin Le Grand 412ddde725dSArmin Le Grand maSvgData.reset(); 413cdf0e10cSrcweir } 414cdf0e10cSrcweir 415cdf0e10cSrcweir // ------------------------------------------------------------------------ 416cdf0e10cSrcweir 417cdf0e10cSrcweir void ImpGraphic::ImplClear() 418cdf0e10cSrcweir { 419cdf0e10cSrcweir if( mpSwapFile ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir if( mpSwapFile->nRefCount > 1 ) 422cdf0e10cSrcweir mpSwapFile->nRefCount--; 423cdf0e10cSrcweir else 424cdf0e10cSrcweir { 425cdf0e10cSrcweir try 426cdf0e10cSrcweir { 427cdf0e10cSrcweir ::ucbhelper::Content aCnt( mpSwapFile->aSwapURL.GetMainURL( INetURLObject::NO_DECODE ), 428cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() ); 429cdf0e10cSrcweir 430cdf0e10cSrcweir aCnt.executeCommand( ::rtl::OUString::createFromAscii( "delete" ), 431cdf0e10cSrcweir ::com::sun::star::uno::makeAny( sal_Bool( sal_True ) ) ); 432cdf0e10cSrcweir } 433cdf0e10cSrcweir catch( const ::com::sun::star::ucb::ContentCreationException& ) 434cdf0e10cSrcweir { 435cdf0e10cSrcweir } 436cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir } 439cdf0e10cSrcweir catch( const ::com::sun::star::ucb::CommandAbortedException& ) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir } 442cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 443cdf0e10cSrcweir { 444cdf0e10cSrcweir } 445cdf0e10cSrcweir 446cdf0e10cSrcweir delete mpSwapFile; 447cdf0e10cSrcweir } 448cdf0e10cSrcweir 449cdf0e10cSrcweir mpSwapFile = NULL; 450cdf0e10cSrcweir } 451cdf0e10cSrcweir 452cdf0e10cSrcweir mbSwapOut = sal_False; 453cdf0e10cSrcweir mnDocFilePos = 0UL; 454cdf0e10cSrcweir maDocFileURLStr.Erase(); 455cdf0e10cSrcweir 456cdf0e10cSrcweir // cleanup 457cdf0e10cSrcweir ImplClearGraphics( sal_False ); 458cdf0e10cSrcweir meType = GRAPHIC_NONE; 459cdf0e10cSrcweir mnSizeBytes = 0; 460cdf0e10cSrcweir } 461cdf0e10cSrcweir 462cdf0e10cSrcweir // ------------------------------------------------------------------------ 463cdf0e10cSrcweir 464cdf0e10cSrcweir GraphicType ImpGraphic::ImplGetType() const 465cdf0e10cSrcweir { 466cdf0e10cSrcweir return meType; 467cdf0e10cSrcweir } 468cdf0e10cSrcweir 469cdf0e10cSrcweir // ------------------------------------------------------------------------ 470cdf0e10cSrcweir 471cdf0e10cSrcweir void ImpGraphic::ImplSetDefaultType() 472cdf0e10cSrcweir { 473cdf0e10cSrcweir ImplClear(); 474cdf0e10cSrcweir meType = GRAPHIC_DEFAULT; 475cdf0e10cSrcweir } 476cdf0e10cSrcweir 477cdf0e10cSrcweir // ------------------------------------------------------------------------ 478cdf0e10cSrcweir 479cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsSupportedGraphic() const 480cdf0e10cSrcweir { 481cdf0e10cSrcweir return( meType != GRAPHIC_NONE ); 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir // ------------------------------------------------------------------------ 485cdf0e10cSrcweir 486cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsTransparent() const 487cdf0e10cSrcweir { 488ddde725dSArmin Le Grand sal_Bool bRet(sal_True); 489cdf0e10cSrcweir 490ddde725dSArmin Le Grand if( meType == GRAPHIC_BITMAP && !maSvgData.get()) 491ddde725dSArmin Le Grand { 492cdf0e10cSrcweir bRet = ( mpAnimation ? mpAnimation->IsTransparent() : maEx.IsTransparent() ); 493ddde725dSArmin Le Grand } 494cdf0e10cSrcweir 495cdf0e10cSrcweir return bRet; 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir // ------------------------------------------------------------------------ 499cdf0e10cSrcweir 500cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsAlpha() const 501cdf0e10cSrcweir { 502ddde725dSArmin Le Grand sal_Bool bRet(sal_False); 503cdf0e10cSrcweir 504ddde725dSArmin Le Grand if(maSvgData.get()) 505ddde725dSArmin Le Grand { 506ddde725dSArmin Le Grand bRet = sal_True; 507ddde725dSArmin Le Grand } 508ddde725dSArmin Le Grand else if( meType == GRAPHIC_BITMAP ) 509ddde725dSArmin Le Grand { 510cdf0e10cSrcweir bRet = ( NULL == mpAnimation ) && maEx.IsAlpha(); 511ddde725dSArmin Le Grand } 512cdf0e10cSrcweir 513cdf0e10cSrcweir return bRet; 514cdf0e10cSrcweir } 515cdf0e10cSrcweir 516cdf0e10cSrcweir // ------------------------------------------------------------------------ 517cdf0e10cSrcweir 518cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsAnimated() const 519cdf0e10cSrcweir { 520cdf0e10cSrcweir return( mpAnimation != NULL ); 521cdf0e10cSrcweir } 522cdf0e10cSrcweir 523cdf0e10cSrcweir // ------------------------------------------------------------------------ 524cdf0e10cSrcweir 525cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsEPS() const 526cdf0e10cSrcweir { 527cdf0e10cSrcweir return( ( meType == GRAPHIC_GDIMETAFILE ) && 528cdf0e10cSrcweir ( maMetaFile.GetActionCount() > 0 ) && 529cdf0e10cSrcweir ( maMetaFile.GetAction( 0 )->GetType() == META_EPS_ACTION ) ); 530cdf0e10cSrcweir } 531cdf0e10cSrcweir 532cdf0e10cSrcweir // ------------------------------------------------------------------------ 533cdf0e10cSrcweir 534cdf0e10cSrcweir Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) const 535cdf0e10cSrcweir { 536cdf0e10cSrcweir Bitmap aRetBmp; 537cdf0e10cSrcweir 538cdf0e10cSrcweir if( meType == GRAPHIC_BITMAP ) 539cdf0e10cSrcweir { 540ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 541ddde725dSArmin Le Grand { 542ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 543ddde725dSArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = maSvgData->getReplacement(); 544ddde725dSArmin Le Grand } 545ddde725dSArmin Le Grand 546cdf0e10cSrcweir const BitmapEx& rRetBmpEx = ( mpAnimation ? mpAnimation->GetBitmapEx() : maEx ); 547cdf0e10cSrcweir const Color aReplaceColor( COL_WHITE ); 548cdf0e10cSrcweir 549cdf0e10cSrcweir aRetBmp = rRetBmpEx.GetBitmap( &aReplaceColor ); 550cdf0e10cSrcweir 551cdf0e10cSrcweir if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height()) 552cdf0e10cSrcweir aRetBmp.Scale(rParameters.getSizePixel()); 553cdf0e10cSrcweir } 554cdf0e10cSrcweir else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() ) 555cdf0e10cSrcweir { 556ff494be3SArmin Le Grand if(maEx.IsEmpty()) 557ff494be3SArmin Le Grand { 558bb18ee55SArmin Le Grand // calculate size 559cdf0e10cSrcweir VirtualDevice aVDev; 560cdf0e10cSrcweir Size aDrawSize(aVDev.LogicToPixel(maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode())); 561cdf0e10cSrcweir 562cdf0e10cSrcweir if(rParameters.getSizePixel().Width() && rParameters.getSizePixel().Height()) 563cdf0e10cSrcweir { 564bb18ee55SArmin Le Grand // apply given size if exists 565bb18ee55SArmin Le Grand aDrawSize = rParameters.getSizePixel(); 566cdf0e10cSrcweir } 567cdf0e10cSrcweir 568bb18ee55SArmin Le Grand if(aDrawSize.Width() && aDrawSize.Height() && !rParameters.getUnlimitedSize() 569bb18ee55SArmin Le Grand && (aDrawSize.Width() > GRAPHIC_MTFTOBMP_MAXEXT || aDrawSize.Height() > GRAPHIC_MTFTOBMP_MAXEXT)) 570cdf0e10cSrcweir { 571bb18ee55SArmin Le Grand // limit bitmap size to a maximum of GRAPHIC_MTFTOBMP_MAXEXT x GRAPHIC_MTFTOBMP_MAXEXT 572bb18ee55SArmin Le Grand double fWH((double)aDrawSize.Width() / (double)aDrawSize.Height()); 573cdf0e10cSrcweir 574cdf0e10cSrcweir if(fWH <= 1.0) 575bb18ee55SArmin Le Grand { 576bb18ee55SArmin Le Grand aDrawSize.setWidth(basegfx::fround(GRAPHIC_MTFTOBMP_MAXEXT * fWH)); 577bb18ee55SArmin Le Grand aDrawSize.setHeight(GRAPHIC_MTFTOBMP_MAXEXT); 578bb18ee55SArmin Le Grand } 579cdf0e10cSrcweir else 580bb18ee55SArmin Le Grand { 581bb18ee55SArmin Le Grand aDrawSize.setWidth(GRAPHIC_MTFTOBMP_MAXEXT); 582bb18ee55SArmin Le Grand aDrawSize.setHeight(basegfx::fround(GRAPHIC_MTFTOBMP_MAXEXT / fWH)); 583bb18ee55SArmin Le Grand } 584cdf0e10cSrcweir } 585cdf0e10cSrcweir 586bb18ee55SArmin Le Grand // calculate pixel size. Normally, it's the same as aDrawSize, but may 587bb18ee55SArmin Le Grand // need to be extended when hairlines are on the right or bottom edge 588bb18ee55SArmin Le Grand Size aPixelSize(aDrawSize); 589bb18ee55SArmin Le Grand 590bb18ee55SArmin Le Grand if(GRAPHIC_GDIMETAFILE == ImplGetType()) 591bb18ee55SArmin Le Grand { 592bb18ee55SArmin Le Grand // get hairline and full bound rect 593bb18ee55SArmin Le Grand Rectangle aHairlineRect; 594bb18ee55SArmin Le Grand const Rectangle aRect(maMetaFile.GetBoundRect(aVDev, &aHairlineRect)); 595bb18ee55SArmin Le Grand 596bb18ee55SArmin Le Grand if(!aRect.IsEmpty() && !aHairlineRect.IsEmpty()) 597bb18ee55SArmin Le Grand { 598bb18ee55SArmin Le Grand // expand if needed to allow bottom and right hairlines to be added 599bb18ee55SArmin Le Grand if(aRect.Right() == aHairlineRect.Right()) 600bb18ee55SArmin Le Grand { 601bb18ee55SArmin Le Grand aPixelSize.setWidth(aPixelSize.getWidth() + 1); 602bb18ee55SArmin Le Grand } 603bb18ee55SArmin Le Grand 604bb18ee55SArmin Le Grand if(aRect.Bottom() == aHairlineRect.Bottom()) 605bb18ee55SArmin Le Grand { 606bb18ee55SArmin Le Grand aPixelSize.setHeight(aPixelSize.getHeight() + 1); 607bb18ee55SArmin Le Grand } 608bb18ee55SArmin Le Grand } 609bb18ee55SArmin Le Grand } 610bb18ee55SArmin Le Grand 611bb18ee55SArmin Le Grand if(aVDev.SetOutputSizePixel(aPixelSize)) 612cdf0e10cSrcweir { 613cdf0e10cSrcweir if(rParameters.getAntiAliase()) 614cdf0e10cSrcweir { 615cdf0e10cSrcweir aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW); 616cdf0e10cSrcweir } 617cdf0e10cSrcweir 618cdf0e10cSrcweir if(rParameters.getSnapHorVerLines()) 619cdf0e10cSrcweir { 620cdf0e10cSrcweir aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_PIXELSNAPHAIRLINE); 621cdf0e10cSrcweir } 622cdf0e10cSrcweir 623bb18ee55SArmin Le Grand ImplDraw( &aVDev, Point(), aDrawSize ); 624ff494be3SArmin Le Grand 625ff494be3SArmin Le Grand // use maEx as local buffer for rendered metafile 626ff494be3SArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = aVDev.GetBitmap( Point(), aVDev.GetOutputSizePixel() ); 627cdf0e10cSrcweir } 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630ff494be3SArmin Le Grand aRetBmp = maEx.GetBitmap(); 631ff494be3SArmin Le Grand } 632ff494be3SArmin Le Grand 633cdf0e10cSrcweir if( !!aRetBmp ) 634cdf0e10cSrcweir { 635cdf0e10cSrcweir aRetBmp.SetPrefMapMode( ImplGetPrefMapMode() ); 636cdf0e10cSrcweir aRetBmp.SetPrefSize( ImplGetPrefSize() ); 637cdf0e10cSrcweir } 638cdf0e10cSrcweir 639cdf0e10cSrcweir return aRetBmp; 640cdf0e10cSrcweir } 641cdf0e10cSrcweir 642cdf0e10cSrcweir // ------------------------------------------------------------------------ 643cdf0e10cSrcweir 644cdf0e10cSrcweir BitmapEx ImpGraphic::ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const 645cdf0e10cSrcweir { 646cdf0e10cSrcweir BitmapEx aRetBmpEx; 647cdf0e10cSrcweir 648cdf0e10cSrcweir if( meType == GRAPHIC_BITMAP ) 649cdf0e10cSrcweir { 650ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 651ddde725dSArmin Le Grand { 652ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 653ddde725dSArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = maSvgData->getReplacement(); 654ddde725dSArmin Le Grand } 655ddde725dSArmin Le Grand 656cdf0e10cSrcweir aRetBmpEx = ( mpAnimation ? mpAnimation->GetBitmapEx() : maEx ); 657cdf0e10cSrcweir 658cdf0e10cSrcweir if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height()) 659035a2f44SArmin Le Grand { 660035a2f44SArmin Le Grand aRetBmpEx.Scale( 661035a2f44SArmin Le Grand rParameters.getSizePixel(), 66237ab0f2dSArmin Le Grand rParameters.getScaleHighQuality() ? BMP_SCALE_BESTQUALITY : BMP_SCALE_FASTESTINTERPOLATE); 663035a2f44SArmin Le Grand } 664cdf0e10cSrcweir } 665cdf0e10cSrcweir else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() ) 666cdf0e10cSrcweir { 667ff494be3SArmin Le Grand if(maEx.IsEmpty()) 668ff494be3SArmin Le Grand { 669cdf0e10cSrcweir const ImpGraphic aMonoMask( maMetaFile.GetMonochromeMtf( COL_BLACK ) ); 670ff494be3SArmin Le Grand 671ff494be3SArmin Le Grand // use maEx as local buffer for rendered metafile 672ff494be3SArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = BitmapEx(ImplGetBitmap(rParameters), aMonoMask.ImplGetBitmap(rParameters)); 673ff494be3SArmin Le Grand } 674ff494be3SArmin Le Grand 675ff494be3SArmin Le Grand aRetBmpEx = maEx; 676cdf0e10cSrcweir } 677cdf0e10cSrcweir 678cdf0e10cSrcweir return aRetBmpEx; 679cdf0e10cSrcweir } 680cdf0e10cSrcweir 681cdf0e10cSrcweir // ------------------------------------------------------------------------ 682cdf0e10cSrcweir 683cdf0e10cSrcweir Animation ImpGraphic::ImplGetAnimation() const 684cdf0e10cSrcweir { 685cdf0e10cSrcweir Animation aAnimation; 686cdf0e10cSrcweir 687cdf0e10cSrcweir if( mpAnimation ) 688cdf0e10cSrcweir aAnimation = *mpAnimation; 689cdf0e10cSrcweir 690cdf0e10cSrcweir return aAnimation; 691cdf0e10cSrcweir } 692cdf0e10cSrcweir 693cdf0e10cSrcweir // ------------------------------------------------------------------------ 694cdf0e10cSrcweir 695cdf0e10cSrcweir const GDIMetaFile& ImpGraphic::ImplGetGDIMetaFile() const 696cdf0e10cSrcweir { 697cb0a2370SArmin Le Grand if(GRAPHIC_BITMAP == meType && !maMetaFile.GetActionCount()) 698cb0a2370SArmin Le Grand { 699cb0a2370SArmin Le Grand // #119735# 700cb0a2370SArmin Le Grand // Use the local maMetaFile as container for a metafile-representation 701cb0a2370SArmin Le Grand // of the bitmap graphic. This will be done only once, thus be buffered. 702cb0a2370SArmin Le Grand // I checked all usages of maMetaFile, it is only used when type is not 703cb0a2370SArmin Le Grand // GRAPHIC_BITMAP. In operator= it will get copied, thus buffering will 704cb0a2370SArmin Le Grand // survive copying (change this if not wanted) 705cb0a2370SArmin Le Grand ImpGraphic* pThat = const_cast< ImpGraphic* >(this); 706cb0a2370SArmin Le Grand 707cb0a2370SArmin Le Grand if(maSvgData.get() && !maEx) 708cb0a2370SArmin Le Grand { 709cb0a2370SArmin Le Grand // use maEx as local buffer for rendered svg 710cb0a2370SArmin Le Grand pThat->maEx = maSvgData->getReplacement(); 711cb0a2370SArmin Le Grand } 712cb0a2370SArmin Le Grand 713cb0a2370SArmin Le Grand VirtualDevice aVirDev; 714cb0a2370SArmin Le Grand const Size aSizePixel(maEx.GetSizePixel()); 715cb0a2370SArmin Le Grand 716cb0a2370SArmin Le Grand pThat->maMetaFile.Record(&aVirDev); 717cb0a2370SArmin Le Grand 718cb0a2370SArmin Le Grand if(maEx.IsTransparent()) 719cb0a2370SArmin Le Grand { 720cb0a2370SArmin Le Grand aVirDev.DrawBitmapEx(Point(), maEx); 721cb0a2370SArmin Le Grand } 722cb0a2370SArmin Le Grand else 723cb0a2370SArmin Le Grand { 724cb0a2370SArmin Le Grand aVirDev.DrawBitmap(Point(), maEx.GetBitmap()); 725cb0a2370SArmin Le Grand } 726cb0a2370SArmin Le Grand 727cb0a2370SArmin Le Grand pThat->maMetaFile.Stop(); 728cb0a2370SArmin Le Grand pThat->maMetaFile.SetPrefSize(aSizePixel); 729cb0a2370SArmin Le Grand } 730cb0a2370SArmin Le Grand 731cdf0e10cSrcweir return maMetaFile; 732cdf0e10cSrcweir } 733cdf0e10cSrcweir 734cdf0e10cSrcweir // ------------------------------------------------------------------------ 735cdf0e10cSrcweir 736cdf0e10cSrcweir Size ImpGraphic::ImplGetPrefSize() const 737cdf0e10cSrcweir { 738cdf0e10cSrcweir Size aSize; 739cdf0e10cSrcweir 740cdf0e10cSrcweir if( ImplIsSwapOut() ) 741cdf0e10cSrcweir aSize = maSwapInfo.maPrefSize; 742cdf0e10cSrcweir else 743cdf0e10cSrcweir { 744cdf0e10cSrcweir switch( meType ) 745cdf0e10cSrcweir { 746cdf0e10cSrcweir case( GRAPHIC_NONE ): 747cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 748cdf0e10cSrcweir break; 749cdf0e10cSrcweir 750cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 751cdf0e10cSrcweir { 752ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 753ddde725dSArmin Le Grand { 754ddde725dSArmin Le Grand // svg not yet buffered in maEx, return size derived from range 755ddde725dSArmin Le Grand const basegfx::B2DRange& rRange = maSvgData->getRange(); 756ddde725dSArmin Le Grand 757ddde725dSArmin Le Grand aSize = Size(basegfx::fround(rRange.getWidth()), basegfx::fround(rRange.getHeight())); 758ddde725dSArmin Le Grand } 759ddde725dSArmin Le Grand else 760ddde725dSArmin Le Grand { 761cdf0e10cSrcweir aSize = maEx.GetPrefSize(); 762cdf0e10cSrcweir 763cdf0e10cSrcweir if( !aSize.Width() || !aSize.Height() ) 764ddde725dSArmin Le Grand { 765cdf0e10cSrcweir aSize = maEx.GetSizePixel(); 766cdf0e10cSrcweir } 767ddde725dSArmin Le Grand } 768ddde725dSArmin Le Grand } 769cdf0e10cSrcweir break; 770cdf0e10cSrcweir 771cdf0e10cSrcweir default: 772cdf0e10cSrcweir { 773cdf0e10cSrcweir if( ImplIsSupportedGraphic() ) 774cdf0e10cSrcweir aSize = maMetaFile.GetPrefSize(); 775cdf0e10cSrcweir } 776cdf0e10cSrcweir break; 777cdf0e10cSrcweir } 778cdf0e10cSrcweir } 779cdf0e10cSrcweir 780cdf0e10cSrcweir return aSize; 781cdf0e10cSrcweir } 782cdf0e10cSrcweir 783cdf0e10cSrcweir // ------------------------------------------------------------------------ 784cdf0e10cSrcweir 785cdf0e10cSrcweir void ImpGraphic::ImplSetPrefSize( const Size& rPrefSize ) 786cdf0e10cSrcweir { 787cdf0e10cSrcweir switch( meType ) 788cdf0e10cSrcweir { 789cdf0e10cSrcweir case( GRAPHIC_NONE ): 790cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 791cdf0e10cSrcweir break; 792cdf0e10cSrcweir 793cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 794ddde725dSArmin Le Grand { 795cdf0e10cSrcweir // #108077# Push through pref size to animation object, 796cdf0e10cSrcweir // will be lost on copy otherwise 797ddde725dSArmin Le Grand if(maSvgData.get()) 798ddde725dSArmin Le Grand { 799ddde725dSArmin Le Grand // ignore for Svg. If this is really used (except the grfcache) 800ddde725dSArmin Le Grand // it can be extended by using maEx as buffer for maSvgData->getReplacement() 801ddde725dSArmin Le Grand } 802ddde725dSArmin Le Grand else 803ddde725dSArmin Le Grand { 804cdf0e10cSrcweir if( ImplIsAnimated() ) 805ddde725dSArmin Le Grand { 806cdf0e10cSrcweir const_cast< BitmapEx& >(mpAnimation->GetBitmapEx()).SetPrefSize( rPrefSize ); 807ddde725dSArmin Le Grand } 808cdf0e10cSrcweir 809cdf0e10cSrcweir maEx.SetPrefSize( rPrefSize ); 810ddde725dSArmin Le Grand } 811ddde725dSArmin Le Grand } 812cdf0e10cSrcweir break; 813cdf0e10cSrcweir 814cdf0e10cSrcweir default: 815cdf0e10cSrcweir { 816cdf0e10cSrcweir if( ImplIsSupportedGraphic() ) 817cdf0e10cSrcweir maMetaFile.SetPrefSize( rPrefSize ); 818cdf0e10cSrcweir } 819cdf0e10cSrcweir break; 820cdf0e10cSrcweir } 821cdf0e10cSrcweir } 822cdf0e10cSrcweir 823cdf0e10cSrcweir // ------------------------------------------------------------------------ 824cdf0e10cSrcweir 825cdf0e10cSrcweir MapMode ImpGraphic::ImplGetPrefMapMode() const 826cdf0e10cSrcweir { 827cdf0e10cSrcweir MapMode aMapMode; 828cdf0e10cSrcweir 829cdf0e10cSrcweir if( ImplIsSwapOut() ) 830cdf0e10cSrcweir aMapMode = maSwapInfo.maPrefMapMode; 831cdf0e10cSrcweir else 832cdf0e10cSrcweir { 833cdf0e10cSrcweir switch( meType ) 834cdf0e10cSrcweir { 835cdf0e10cSrcweir case( GRAPHIC_NONE ): 836cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 837cdf0e10cSrcweir break; 838cdf0e10cSrcweir 839cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 840cdf0e10cSrcweir { 841ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 842ddde725dSArmin Le Grand { 843ddde725dSArmin Le Grand // svg not yet buffered in maEx, return default PrefMapMode 844ddde725dSArmin Le Grand aMapMode = MapMode(MAP_100TH_MM); 845ddde725dSArmin Le Grand } 846ddde725dSArmin Le Grand else 847ddde725dSArmin Le Grand { 848cdf0e10cSrcweir const Size aSize( maEx.GetPrefSize() ); 849cdf0e10cSrcweir 850cdf0e10cSrcweir if ( aSize.Width() && aSize.Height() ) 851cdf0e10cSrcweir aMapMode = maEx.GetPrefMapMode(); 852cdf0e10cSrcweir } 853ddde725dSArmin Le Grand } 854cdf0e10cSrcweir break; 855cdf0e10cSrcweir 856cdf0e10cSrcweir default: 857cdf0e10cSrcweir { 858cdf0e10cSrcweir if( ImplIsSupportedGraphic() ) 859cdf0e10cSrcweir return maMetaFile.GetPrefMapMode(); 860cdf0e10cSrcweir } 861cdf0e10cSrcweir break; 862cdf0e10cSrcweir } 863cdf0e10cSrcweir } 864cdf0e10cSrcweir 865cdf0e10cSrcweir return aMapMode; 866cdf0e10cSrcweir } 867cdf0e10cSrcweir 868cdf0e10cSrcweir // ------------------------------------------------------------------------ 869cdf0e10cSrcweir 870cdf0e10cSrcweir void ImpGraphic::ImplSetPrefMapMode( const MapMode& rPrefMapMode ) 871cdf0e10cSrcweir { 872cdf0e10cSrcweir switch( meType ) 873cdf0e10cSrcweir { 874cdf0e10cSrcweir case( GRAPHIC_NONE ): 875cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 876cdf0e10cSrcweir break; 877cdf0e10cSrcweir 878cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 879ddde725dSArmin Le Grand { 880ddde725dSArmin Le Grand if(maSvgData.get()) 881ddde725dSArmin Le Grand { 882ddde725dSArmin Le Grand // ignore for Svg. If this is really used (except the grfcache) 883ddde725dSArmin Le Grand // it can be extended by using maEx as buffer for maSvgData->getReplacement() 884ddde725dSArmin Le Grand } 885ddde725dSArmin Le Grand else 886ddde725dSArmin Le Grand { 887cdf0e10cSrcweir // #108077# Push through pref mapmode to animation object, 888cdf0e10cSrcweir // will be lost on copy otherwise 889cdf0e10cSrcweir if( ImplIsAnimated() ) 890ddde725dSArmin Le Grand { 891cdf0e10cSrcweir const_cast< BitmapEx& >(mpAnimation->GetBitmapEx()).SetPrefMapMode( rPrefMapMode ); 892ddde725dSArmin Le Grand } 893cdf0e10cSrcweir 894cdf0e10cSrcweir maEx.SetPrefMapMode( rPrefMapMode ); 895ddde725dSArmin Le Grand } 896ddde725dSArmin Le Grand } 897cdf0e10cSrcweir break; 898cdf0e10cSrcweir 899cdf0e10cSrcweir default: 900cdf0e10cSrcweir { 901cdf0e10cSrcweir if( ImplIsSupportedGraphic() ) 902cdf0e10cSrcweir maMetaFile.SetPrefMapMode( rPrefMapMode ); 903cdf0e10cSrcweir } 904cdf0e10cSrcweir break; 905cdf0e10cSrcweir } 906cdf0e10cSrcweir } 907cdf0e10cSrcweir 908cdf0e10cSrcweir // ------------------------------------------------------------------------ 909cdf0e10cSrcweir 910cdf0e10cSrcweir sal_uLong ImpGraphic::ImplGetSizeBytes() const 911cdf0e10cSrcweir { 912cdf0e10cSrcweir if( 0 == mnSizeBytes ) 913cdf0e10cSrcweir { 914cdf0e10cSrcweir if( meType == GRAPHIC_BITMAP ) 915cdf0e10cSrcweir { 916ddde725dSArmin Le Grand if(maSvgData.get()) 917ddde725dSArmin Le Grand { 918ddde725dSArmin Le Grand mnSizeBytes = maSvgData->getSvgDataArrayLength(); 919ddde725dSArmin Le Grand } 920ddde725dSArmin Le Grand else 921ddde725dSArmin Le Grand { 922cdf0e10cSrcweir mnSizeBytes = mpAnimation ? mpAnimation->GetSizeBytes() : maEx.GetSizeBytes(); 923cdf0e10cSrcweir } 924ddde725dSArmin Le Grand } 925cdf0e10cSrcweir else if( meType == GRAPHIC_GDIMETAFILE ) 926cdf0e10cSrcweir { 927cdf0e10cSrcweir mnSizeBytes = maMetaFile.GetSizeBytes(); 928cdf0e10cSrcweir } 929cdf0e10cSrcweir } 930cdf0e10cSrcweir 931cdf0e10cSrcweir return( mnSizeBytes ); 932cdf0e10cSrcweir } 933cdf0e10cSrcweir 934cdf0e10cSrcweir // ------------------------------------------------------------------------ 935cdf0e10cSrcweir 936cdf0e10cSrcweir void ImpGraphic::ImplDraw( OutputDevice* pOutDev, const Point& rDestPt ) const 937cdf0e10cSrcweir { 938cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() ) 939cdf0e10cSrcweir { 940cdf0e10cSrcweir switch( meType ) 941cdf0e10cSrcweir { 942cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 943cdf0e10cSrcweir break; 944cdf0e10cSrcweir 945cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 946cdf0e10cSrcweir { 947ddde725dSArmin Le Grand if(maSvgData.get() && !maEx) 948ddde725dSArmin Le Grand { 949ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 950ddde725dSArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = maSvgData->getReplacement(); 951ddde725dSArmin Le Grand } 952ddde725dSArmin Le Grand 953cdf0e10cSrcweir if ( mpAnimation ) 954ddde725dSArmin Le Grand { 955cdf0e10cSrcweir mpAnimation->Draw( pOutDev, rDestPt ); 956ddde725dSArmin Le Grand } 957cdf0e10cSrcweir else 958ddde725dSArmin Le Grand { 959cdf0e10cSrcweir maEx.Draw( pOutDev, rDestPt ); 960cdf0e10cSrcweir } 961ddde725dSArmin Le Grand } 962cdf0e10cSrcweir break; 963cdf0e10cSrcweir 964cdf0e10cSrcweir default: 965cdf0e10cSrcweir ImplDraw( pOutDev, rDestPt, maMetaFile.GetPrefSize() ); 966cdf0e10cSrcweir break; 967cdf0e10cSrcweir } 968cdf0e10cSrcweir } 969cdf0e10cSrcweir } 970cdf0e10cSrcweir 971cdf0e10cSrcweir // ------------------------------------------------------------------------ 972cdf0e10cSrcweir 973cdf0e10cSrcweir void ImpGraphic::ImplDraw( OutputDevice* pOutDev, 974cdf0e10cSrcweir const Point& rDestPt, const Size& rDestSize ) const 975cdf0e10cSrcweir { 976cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() ) 977cdf0e10cSrcweir { 978cdf0e10cSrcweir switch( meType ) 979cdf0e10cSrcweir { 980cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 981cdf0e10cSrcweir break; 982cdf0e10cSrcweir 983cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 984cdf0e10cSrcweir { 985ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 986ddde725dSArmin Le Grand { 987ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 988ddde725dSArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = maSvgData->getReplacement(); 989ddde725dSArmin Le Grand } 990ddde725dSArmin Le Grand 991cdf0e10cSrcweir if( mpAnimation ) 992ddde725dSArmin Le Grand { 993cdf0e10cSrcweir mpAnimation->Draw( pOutDev, rDestPt, rDestSize ); 994ddde725dSArmin Le Grand } 995cdf0e10cSrcweir else 996ddde725dSArmin Le Grand { 997cdf0e10cSrcweir maEx.Draw( pOutDev, rDestPt, rDestSize ); 998cdf0e10cSrcweir } 999ddde725dSArmin Le Grand } 1000cdf0e10cSrcweir break; 1001cdf0e10cSrcweir 1002cdf0e10cSrcweir default: 1003cdf0e10cSrcweir { 1004cdf0e10cSrcweir ( (ImpGraphic*) this )->maMetaFile.WindStart(); 1005cdf0e10cSrcweir ( (ImpGraphic*) this )->maMetaFile.Play( pOutDev, rDestPt, rDestSize ); 1006cdf0e10cSrcweir ( (ImpGraphic*) this )->maMetaFile.WindStart(); 1007cdf0e10cSrcweir } 1008cdf0e10cSrcweir break; 1009cdf0e10cSrcweir } 1010cdf0e10cSrcweir } 1011cdf0e10cSrcweir } 1012cdf0e10cSrcweir 1013cdf0e10cSrcweir // ------------------------------------------------------------------------ 1014cdf0e10cSrcweir 1015cdf0e10cSrcweir void ImpGraphic::ImplStartAnimation( OutputDevice* pOutDev, 1016cdf0e10cSrcweir const Point& rDestPt, 1017cdf0e10cSrcweir long nExtraData, 1018cdf0e10cSrcweir OutputDevice* pFirstFrameOutDev ) 1019cdf0e10cSrcweir { 1020cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() && mpAnimation ) 1021cdf0e10cSrcweir mpAnimation->Start( pOutDev, rDestPt, nExtraData, pFirstFrameOutDev ); 1022cdf0e10cSrcweir } 1023cdf0e10cSrcweir 1024cdf0e10cSrcweir // ------------------------------------------------------------------------ 1025cdf0e10cSrcweir 1026cdf0e10cSrcweir void ImpGraphic::ImplStartAnimation( OutputDevice* pOutDev, const Point& rDestPt, 1027cdf0e10cSrcweir const Size& rDestSize, long nExtraData, 1028cdf0e10cSrcweir OutputDevice* pFirstFrameOutDev ) 1029cdf0e10cSrcweir { 1030cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() && mpAnimation ) 1031cdf0e10cSrcweir mpAnimation->Start( pOutDev, rDestPt, rDestSize, nExtraData, pFirstFrameOutDev ); 1032cdf0e10cSrcweir } 1033cdf0e10cSrcweir 1034cdf0e10cSrcweir // ------------------------------------------------------------------------ 1035cdf0e10cSrcweir 1036cdf0e10cSrcweir void ImpGraphic::ImplStopAnimation( OutputDevice* pOutDev, long nExtraData ) 1037cdf0e10cSrcweir { 1038cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() && mpAnimation ) 1039cdf0e10cSrcweir mpAnimation->Stop( pOutDev, nExtraData ); 1040cdf0e10cSrcweir } 1041cdf0e10cSrcweir 1042cdf0e10cSrcweir // ------------------------------------------------------------------------ 1043cdf0e10cSrcweir 1044cdf0e10cSrcweir void ImpGraphic::ImplSetAnimationNotifyHdl( const Link& rLink ) 1045cdf0e10cSrcweir { 1046cdf0e10cSrcweir if( mpAnimation ) 1047cdf0e10cSrcweir mpAnimation->SetNotifyHdl( rLink ); 1048cdf0e10cSrcweir } 1049cdf0e10cSrcweir 1050cdf0e10cSrcweir // ------------------------------------------------------------------------ 1051cdf0e10cSrcweir 1052cdf0e10cSrcweir Link ImpGraphic::ImplGetAnimationNotifyHdl() const 1053cdf0e10cSrcweir { 1054cdf0e10cSrcweir Link aLink; 1055cdf0e10cSrcweir 1056cdf0e10cSrcweir if( mpAnimation ) 1057cdf0e10cSrcweir aLink = mpAnimation->GetNotifyHdl(); 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir return aLink; 1060cdf0e10cSrcweir } 1061cdf0e10cSrcweir 1062cdf0e10cSrcweir // ------------------------------------------------------------------------ 1063cdf0e10cSrcweir 1064cdf0e10cSrcweir sal_uLong ImpGraphic::ImplGetAnimationLoopCount() const 1065cdf0e10cSrcweir { 1066cdf0e10cSrcweir return( mpAnimation ? mpAnimation->GetLoopCount() : 0UL ); 1067cdf0e10cSrcweir } 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir // ------------------------------------------------------------------------ 1070cdf0e10cSrcweir 1071cdf0e10cSrcweir void ImpGraphic::ImplResetAnimationLoopCount() 1072cdf0e10cSrcweir { 1073cdf0e10cSrcweir if( mpAnimation ) 1074cdf0e10cSrcweir mpAnimation->ResetLoopCount(); 1075cdf0e10cSrcweir } 1076cdf0e10cSrcweir 1077cdf0e10cSrcweir // ------------------------------------------------------------------------ 1078cdf0e10cSrcweir 1079cdf0e10cSrcweir List* ImpGraphic::ImplGetAnimationInfoList() const 1080cdf0e10cSrcweir { 1081cdf0e10cSrcweir return( mpAnimation ? mpAnimation->GetAInfoList() : NULL ); 1082cdf0e10cSrcweir } 1083cdf0e10cSrcweir 1084cdf0e10cSrcweir // ------------------------------------------------------------------------ 1085cdf0e10cSrcweir 1086cdf0e10cSrcweir GraphicReader* ImpGraphic::ImplGetContext() 1087cdf0e10cSrcweir { 1088cdf0e10cSrcweir return mpContext; 1089cdf0e10cSrcweir } 1090cdf0e10cSrcweir 1091cdf0e10cSrcweir // ------------------------------------------------------------------------ 1092cdf0e10cSrcweir 1093cdf0e10cSrcweir void ImpGraphic::ImplSetContext( GraphicReader* pReader ) 1094cdf0e10cSrcweir { 1095cdf0e10cSrcweir mpContext = pReader; 1096cdf0e10cSrcweir } 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir // ------------------------------------------------------------------------ 1099cdf0e10cSrcweir 1100cdf0e10cSrcweir void ImpGraphic::ImplSetDocFileName( const String& rName, sal_uLong nFilePos ) 1101cdf0e10cSrcweir { 1102cdf0e10cSrcweir const INetURLObject aURL( rName ); 1103cdf0e10cSrcweir 1104cdf0e10cSrcweir DBG_ASSERT( !rName.Len() || ( aURL.GetProtocol() != INET_PROT_NOT_VALID ), "Graphic::SetDocFileName(...): invalid URL" ); 1105cdf0e10cSrcweir 1106cdf0e10cSrcweir maDocFileURLStr = aURL.GetMainURL( INetURLObject::NO_DECODE ); 1107cdf0e10cSrcweir mnDocFilePos = nFilePos; 1108cdf0e10cSrcweir } 1109cdf0e10cSrcweir 1110cdf0e10cSrcweir // ------------------------------------------------------------------------ 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir const String& ImpGraphic::ImplGetDocFileName() const 1113cdf0e10cSrcweir { 1114cdf0e10cSrcweir return maDocFileURLStr; 1115cdf0e10cSrcweir } 1116cdf0e10cSrcweir 1117cdf0e10cSrcweir // ------------------------------------------------------------------------ 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir sal_uLong ImpGraphic::ImplGetDocFilePos() const 1120cdf0e10cSrcweir { 1121cdf0e10cSrcweir return mnDocFilePos; 1122cdf0e10cSrcweir } 1123cdf0e10cSrcweir 1124cdf0e10cSrcweir // ------------------------------------------------------------------------ 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir sal_Bool ImpGraphic::ImplReadEmbedded( SvStream& rIStm, sal_Bool bSwap ) 1127cdf0e10cSrcweir { 1128cdf0e10cSrcweir MapMode aMapMode; 1129cdf0e10cSrcweir Size aSize; 1130cdf0e10cSrcweir const sal_uLong nStartPos = rIStm.Tell(); 1131cdf0e10cSrcweir sal_uInt32 nId; 1132cdf0e10cSrcweir sal_uLong nHeaderLen; 1133cdf0e10cSrcweir long nType; 1134cdf0e10cSrcweir long nLen; 1135cdf0e10cSrcweir const sal_uInt16 nOldFormat = rIStm.GetNumberFormatInt(); 1136cdf0e10cSrcweir sal_Bool bRet = sal_False; 1137cdf0e10cSrcweir 1138cdf0e10cSrcweir if( !mbSwapUnderway ) 1139cdf0e10cSrcweir { 1140cdf0e10cSrcweir const String aTempURLStr( maDocFileURLStr ); 1141cdf0e10cSrcweir const sal_uLong nTempPos = mnDocFilePos; 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir ImplClear(); 1144cdf0e10cSrcweir 1145cdf0e10cSrcweir maDocFileURLStr = aTempURLStr; 1146cdf0e10cSrcweir mnDocFilePos = nTempPos; 1147cdf0e10cSrcweir } 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir rIStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 1150cdf0e10cSrcweir rIStm >> nId; 1151cdf0e10cSrcweir 1152cdf0e10cSrcweir // check version 1153cdf0e10cSrcweir if( GRAPHIC_FORMAT_50 == nId ) 1154cdf0e10cSrcweir { 1155cdf0e10cSrcweir // read new style header 1156cdf0e10cSrcweir VersionCompat* pCompat = new VersionCompat( rIStm, STREAM_READ ); 1157cdf0e10cSrcweir 1158cdf0e10cSrcweir rIStm >> nType; 1159cdf0e10cSrcweir rIStm >> nLen; 1160cdf0e10cSrcweir rIStm >> aSize; 1161cdf0e10cSrcweir rIStm >> aMapMode; 1162cdf0e10cSrcweir 1163cdf0e10cSrcweir delete pCompat; 1164cdf0e10cSrcweir } 1165cdf0e10cSrcweir else 1166cdf0e10cSrcweir { 1167cdf0e10cSrcweir // read old style header 1168cdf0e10cSrcweir long nWidth, nHeight; 1169cdf0e10cSrcweir long nMapMode, nScaleNumX, nScaleDenomX; 1170cdf0e10cSrcweir long nScaleNumY, nScaleDenomY, nOffsX, nOffsY; 1171cdf0e10cSrcweir 1172cdf0e10cSrcweir rIStm.SeekRel( -4L ); 1173cdf0e10cSrcweir 1174cdf0e10cSrcweir rIStm >> nType >> nLen >> nWidth >> nHeight; 1175cdf0e10cSrcweir rIStm >> nMapMode >> nScaleNumX >> nScaleDenomX >> nScaleNumY; 1176cdf0e10cSrcweir rIStm >> nScaleDenomY >> nOffsX >> nOffsY; 1177cdf0e10cSrcweir 1178cdf0e10cSrcweir // swapped 1179cdf0e10cSrcweir if( nType > 100L ) 1180cdf0e10cSrcweir { 1181cdf0e10cSrcweir nType = SWAPLONG( nType ); 1182cdf0e10cSrcweir nLen = SWAPLONG( nLen ); 1183cdf0e10cSrcweir nWidth = SWAPLONG( nWidth ); 1184cdf0e10cSrcweir nHeight = SWAPLONG( nHeight ); 1185cdf0e10cSrcweir nMapMode = SWAPLONG( nMapMode ); 1186cdf0e10cSrcweir nScaleNumX = SWAPLONG( nScaleNumX ); 1187cdf0e10cSrcweir nScaleDenomX = SWAPLONG( nScaleDenomX ); 1188cdf0e10cSrcweir nScaleNumY = SWAPLONG( nScaleNumY ); 1189cdf0e10cSrcweir nScaleDenomY = SWAPLONG( nScaleDenomY ); 1190cdf0e10cSrcweir nOffsX = SWAPLONG( nOffsX ); 1191cdf0e10cSrcweir nOffsY = SWAPLONG( nOffsY ); 1192cdf0e10cSrcweir } 1193cdf0e10cSrcweir 1194cdf0e10cSrcweir aSize = Size( nWidth, nHeight ); 1195cdf0e10cSrcweir aMapMode = MapMode( (MapUnit) nMapMode, Point( nOffsX, nOffsY ), 1196cdf0e10cSrcweir Fraction( nScaleNumX, nScaleDenomX ), 1197cdf0e10cSrcweir Fraction( nScaleNumY, nScaleDenomY ) ); 1198cdf0e10cSrcweir } 1199cdf0e10cSrcweir 1200cdf0e10cSrcweir nHeaderLen = rIStm.Tell() - nStartPos; 1201cdf0e10cSrcweir meType = (GraphicType) nType; 1202cdf0e10cSrcweir 1203cdf0e10cSrcweir if( meType ) 1204cdf0e10cSrcweir { 1205cdf0e10cSrcweir if( meType == GRAPHIC_BITMAP ) 1206cdf0e10cSrcweir { 1207ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 1208ddde725dSArmin Le Grand { 1209ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 1210ddde725dSArmin Le Grand maEx = maSvgData->getReplacement(); 1211ddde725dSArmin Le Grand } 1212ddde725dSArmin Le Grand 1213cdf0e10cSrcweir maEx.aBitmapSize = aSize; 1214cdf0e10cSrcweir 1215cdf0e10cSrcweir if( aMapMode != MapMode() ) 1216cdf0e10cSrcweir { 1217cdf0e10cSrcweir maEx.SetPrefMapMode( aMapMode ); 1218cdf0e10cSrcweir maEx.SetPrefSize( aSize ); 1219cdf0e10cSrcweir } 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir else 1222cdf0e10cSrcweir { 1223cdf0e10cSrcweir maMetaFile.SetPrefMapMode( aMapMode ); 1224cdf0e10cSrcweir maMetaFile.SetPrefSize( aSize ); 1225cdf0e10cSrcweir } 1226cdf0e10cSrcweir 1227cdf0e10cSrcweir if( bSwap ) 1228cdf0e10cSrcweir { 1229cdf0e10cSrcweir if( maDocFileURLStr.Len() ) 1230cdf0e10cSrcweir { 1231cdf0e10cSrcweir rIStm.Seek( nStartPos + nHeaderLen + nLen ); 1232cdf0e10cSrcweir bRet = mbSwapOut = sal_True; 1233cdf0e10cSrcweir } 1234cdf0e10cSrcweir else 1235cdf0e10cSrcweir { 1236cdf0e10cSrcweir ::utl::TempFile aTempFile; 1237cdf0e10cSrcweir const INetURLObject aTmpURL( aTempFile.GetURL() ); 1238cdf0e10cSrcweir 1239cdf0e10cSrcweir if( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) 1240cdf0e10cSrcweir { 1241cdf0e10cSrcweir SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READWRITE | STREAM_SHARE_DENYWRITE ); 1242cdf0e10cSrcweir 1243cdf0e10cSrcweir if( pOStm ) 1244cdf0e10cSrcweir { 1245cdf0e10cSrcweir sal_uLong nFullLen = nHeaderLen + nLen; 1246cdf0e10cSrcweir sal_uLong nPartLen = Min( nFullLen, (sal_uLong) GRAPHIC_MAXPARTLEN ); 1247cdf0e10cSrcweir sal_uInt8* pBuffer = (sal_uInt8*) rtl_allocateMemory( nPartLen ); 1248cdf0e10cSrcweir 1249cdf0e10cSrcweir pOStm->SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 1250cdf0e10cSrcweir 1251cdf0e10cSrcweir if( pBuffer ) 1252cdf0e10cSrcweir { 1253cdf0e10cSrcweir rIStm.Seek( nStartPos ); 1254cdf0e10cSrcweir 1255cdf0e10cSrcweir while( nFullLen ) 1256cdf0e10cSrcweir { 1257cdf0e10cSrcweir rIStm.Read( (char*) pBuffer, nPartLen ); 1258cdf0e10cSrcweir pOStm->Write( (char*) pBuffer, nPartLen ); 1259cdf0e10cSrcweir 1260cdf0e10cSrcweir nFullLen -= nPartLen; 1261cdf0e10cSrcweir 1262cdf0e10cSrcweir if( nFullLen < GRAPHIC_MAXPARTLEN ) 1263cdf0e10cSrcweir nPartLen = nFullLen; 1264cdf0e10cSrcweir } 1265cdf0e10cSrcweir 1266cdf0e10cSrcweir rtl_freeMemory( pBuffer ); 1267cdf0e10cSrcweir sal_uLong nReadErr = rIStm.GetError(), nWriteErr = pOStm->GetError(); 1268cdf0e10cSrcweir delete pOStm, pOStm = NULL; 1269cdf0e10cSrcweir 1270cdf0e10cSrcweir if( !nReadErr && !nWriteErr ) 1271cdf0e10cSrcweir { 1272cdf0e10cSrcweir bRet = mbSwapOut = sal_True; 1273cdf0e10cSrcweir mpSwapFile = new ImpSwapFile; 1274cdf0e10cSrcweir mpSwapFile->nRefCount = 1; 1275cdf0e10cSrcweir mpSwapFile->aSwapURL = aTmpURL; 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir else 1278cdf0e10cSrcweir { 1279cdf0e10cSrcweir try 1280cdf0e10cSrcweir { 1281cdf0e10cSrcweir ::ucbhelper::Content aCnt( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), 1282cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() ); 1283cdf0e10cSrcweir 1284cdf0e10cSrcweir aCnt.executeCommand( ::rtl::OUString::createFromAscii( "delete" ), 1285cdf0e10cSrcweir ::com::sun::star::uno::makeAny( sal_Bool( sal_True ) ) ); 1286cdf0e10cSrcweir } 1287cdf0e10cSrcweir catch( const ::com::sun::star::ucb::ContentCreationException& ) 1288cdf0e10cSrcweir { 1289cdf0e10cSrcweir } 1290cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 1291cdf0e10cSrcweir { 1292cdf0e10cSrcweir } 1293cdf0e10cSrcweir catch( const ::com::sun::star::ucb::CommandAbortedException& ) 1294cdf0e10cSrcweir { 1295cdf0e10cSrcweir } 1296cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1297cdf0e10cSrcweir { 1298cdf0e10cSrcweir } 1299cdf0e10cSrcweir } 1300cdf0e10cSrcweir } 1301cdf0e10cSrcweir 1302cdf0e10cSrcweir delete pOStm; 1303cdf0e10cSrcweir } 1304cdf0e10cSrcweir } 1305cdf0e10cSrcweir } 1306cdf0e10cSrcweir } 1307cdf0e10cSrcweir else if( meType == GRAPHIC_BITMAP || meType == GRAPHIC_GDIMETAFILE ) 1308cdf0e10cSrcweir { 1309cdf0e10cSrcweir rIStm >> *this; 1310cdf0e10cSrcweir bRet = ( rIStm.GetError() == 0UL ); 1311cdf0e10cSrcweir } 1312cdf0e10cSrcweir else if( meType >= SYS_WINMETAFILE && meType <= SYS_MACMETAFILE ) 1313cdf0e10cSrcweir { 1314cdf0e10cSrcweir Graphic aSysGraphic; 1315cdf0e10cSrcweir sal_uLong nCvtType; 1316cdf0e10cSrcweir 1317cdf0e10cSrcweir switch( sal::static_int_cast<sal_uLong>(meType) ) 1318cdf0e10cSrcweir { 1319cdf0e10cSrcweir case( SYS_WINMETAFILE ): 1320cdf0e10cSrcweir case( SYS_WNTMETAFILE ): nCvtType = CVT_WMF; break; 1321cdf0e10cSrcweir case( SYS_OS2METAFILE ): nCvtType = CVT_MET; break; 1322cdf0e10cSrcweir case( SYS_MACMETAFILE ): nCvtType = CVT_PCT; break; 1323cdf0e10cSrcweir 1324cdf0e10cSrcweir default: 1325cdf0e10cSrcweir nCvtType = CVT_UNKNOWN; 1326cdf0e10cSrcweir break; 1327cdf0e10cSrcweir } 1328cdf0e10cSrcweir 1329cdf0e10cSrcweir if( nType && GraphicConverter::Import( rIStm, aSysGraphic, nCvtType ) == ERRCODE_NONE ) 1330cdf0e10cSrcweir { 1331cdf0e10cSrcweir *this = ImpGraphic( aSysGraphic.GetGDIMetaFile() ); 1332cdf0e10cSrcweir bRet = ( rIStm.GetError() == 0UL ); 1333cdf0e10cSrcweir } 1334cdf0e10cSrcweir else 1335cdf0e10cSrcweir meType = GRAPHIC_DEFAULT; 1336cdf0e10cSrcweir } 1337cdf0e10cSrcweir 1338cdf0e10cSrcweir if( bRet ) 1339cdf0e10cSrcweir { 1340cdf0e10cSrcweir ImplSetPrefMapMode( aMapMode ); 1341cdf0e10cSrcweir ImplSetPrefSize( aSize ); 1342cdf0e10cSrcweir } 1343cdf0e10cSrcweir } 1344cdf0e10cSrcweir else 1345cdf0e10cSrcweir bRet = sal_True; 1346cdf0e10cSrcweir 1347cdf0e10cSrcweir rIStm.SetNumberFormatInt( nOldFormat ); 1348cdf0e10cSrcweir 1349cdf0e10cSrcweir return bRet; 1350cdf0e10cSrcweir } 1351cdf0e10cSrcweir 1352cdf0e10cSrcweir // ------------------------------------------------------------------------ 1353cdf0e10cSrcweir 1354cdf0e10cSrcweir sal_Bool ImpGraphic::ImplWriteEmbedded( SvStream& rOStm ) 1355cdf0e10cSrcweir { 1356cdf0e10cSrcweir sal_Bool bRet = sal_False; 1357cdf0e10cSrcweir 1358cdf0e10cSrcweir if( ( meType != GRAPHIC_NONE ) && ( meType != GRAPHIC_DEFAULT ) && !ImplIsSwapOut() ) 1359cdf0e10cSrcweir { 1360cdf0e10cSrcweir const MapMode aMapMode( ImplGetPrefMapMode() ); 1361cdf0e10cSrcweir const Size aSize( ImplGetPrefSize() ); 1362cdf0e10cSrcweir const sal_uInt16 nOldFormat = rOStm.GetNumberFormatInt(); 1363cdf0e10cSrcweir sal_uLong nDataFieldPos; 1364cdf0e10cSrcweir 1365cdf0e10cSrcweir rOStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 1366cdf0e10cSrcweir 1367cdf0e10cSrcweir // write correct version ( old style/new style header ) 1368cdf0e10cSrcweir if( rOStm.GetVersion() >= SOFFICE_FILEFORMAT_50 ) 1369cdf0e10cSrcweir { 1370cdf0e10cSrcweir // write ID for new format (5.0) 1371cdf0e10cSrcweir rOStm << GRAPHIC_FORMAT_50; 1372cdf0e10cSrcweir 1373cdf0e10cSrcweir // write new style header 1374cdf0e10cSrcweir VersionCompat* pCompat = new VersionCompat( rOStm, STREAM_WRITE, 1 ); 1375cdf0e10cSrcweir 1376cdf0e10cSrcweir rOStm << (long) meType; 1377cdf0e10cSrcweir 1378cdf0e10cSrcweir // data size is updated later 1379cdf0e10cSrcweir nDataFieldPos = rOStm.Tell(); 1380cdf0e10cSrcweir rOStm << (long) 0; 1381cdf0e10cSrcweir 1382cdf0e10cSrcweir rOStm << aSize; 1383cdf0e10cSrcweir rOStm << aMapMode; 1384cdf0e10cSrcweir 1385cdf0e10cSrcweir delete pCompat; 1386cdf0e10cSrcweir } 1387cdf0e10cSrcweir else 1388cdf0e10cSrcweir { 1389cdf0e10cSrcweir // write old style (<=4.0) header 1390cdf0e10cSrcweir rOStm << (long) meType; 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir // data size is updated later 1393cdf0e10cSrcweir nDataFieldPos = rOStm.Tell(); 1394cdf0e10cSrcweir rOStm << (long) 0; 1395cdf0e10cSrcweir 1396cdf0e10cSrcweir rOStm << (long) aSize.Width(); 1397cdf0e10cSrcweir rOStm << (long) aSize.Height(); 1398cdf0e10cSrcweir rOStm << (long) aMapMode.GetMapUnit(); 1399cdf0e10cSrcweir rOStm << (long) aMapMode.GetScaleX().GetNumerator(); 1400cdf0e10cSrcweir rOStm << (long) aMapMode.GetScaleX().GetDenominator(); 1401cdf0e10cSrcweir rOStm << (long) aMapMode.GetScaleY().GetNumerator(); 1402cdf0e10cSrcweir rOStm << (long) aMapMode.GetScaleY().GetDenominator(); 1403cdf0e10cSrcweir rOStm << (long) aMapMode.GetOrigin().X(); 1404cdf0e10cSrcweir rOStm << (long) aMapMode.GetOrigin().Y(); 1405cdf0e10cSrcweir } 1406cdf0e10cSrcweir 1407cdf0e10cSrcweir // write data block 1408cdf0e10cSrcweir if( !rOStm.GetError() ) 1409cdf0e10cSrcweir { 1410cdf0e10cSrcweir const sal_uLong nDataStart = rOStm.Tell(); 1411cdf0e10cSrcweir 1412cdf0e10cSrcweir if( ImplIsSupportedGraphic() ) 1413cdf0e10cSrcweir rOStm << *this; 1414cdf0e10cSrcweir 1415cdf0e10cSrcweir if( !rOStm.GetError() ) 1416cdf0e10cSrcweir { 1417cdf0e10cSrcweir const sal_uLong nStmPos2 = rOStm.Tell(); 1418cdf0e10cSrcweir rOStm.Seek( nDataFieldPos ); 1419cdf0e10cSrcweir rOStm << (long) ( nStmPos2 - nDataStart ); 1420cdf0e10cSrcweir rOStm.Seek( nStmPos2 ); 1421cdf0e10cSrcweir bRet = sal_True; 1422cdf0e10cSrcweir } 1423cdf0e10cSrcweir } 1424cdf0e10cSrcweir 1425cdf0e10cSrcweir rOStm.SetNumberFormatInt( nOldFormat ); 1426cdf0e10cSrcweir } 1427cdf0e10cSrcweir 1428cdf0e10cSrcweir return bRet; 1429cdf0e10cSrcweir } 1430cdf0e10cSrcweir 1431cdf0e10cSrcweir // ------------------------------------------------------------------------ 1432cdf0e10cSrcweir 1433cdf0e10cSrcweir sal_Bool ImpGraphic::ImplSwapOut() 1434cdf0e10cSrcweir { 1435cdf0e10cSrcweir sal_Bool bRet = sal_False; 1436cdf0e10cSrcweir 1437cdf0e10cSrcweir if( !ImplIsSwapOut() ) 1438cdf0e10cSrcweir { 1439cdf0e10cSrcweir if( !maDocFileURLStr.Len() ) 1440cdf0e10cSrcweir { 1441cdf0e10cSrcweir ::utl::TempFile aTempFile; 1442cdf0e10cSrcweir const INetURLObject aTmpURL( aTempFile.GetURL() ); 1443cdf0e10cSrcweir 1444cdf0e10cSrcweir if( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) 1445cdf0e10cSrcweir { 1446cdf0e10cSrcweir SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READWRITE | STREAM_SHARE_DENYWRITE ); 1447cdf0e10cSrcweir 1448cdf0e10cSrcweir if( pOStm ) 1449cdf0e10cSrcweir { 1450cdf0e10cSrcweir pOStm->SetVersion( SOFFICE_FILEFORMAT_50 ); 1451cdf0e10cSrcweir pOStm->SetCompressMode( COMPRESSMODE_NATIVE ); 1452cdf0e10cSrcweir 1453cdf0e10cSrcweir if( ( bRet = ImplSwapOut( pOStm ) ) == sal_True ) 1454cdf0e10cSrcweir { 1455cdf0e10cSrcweir mpSwapFile = new ImpSwapFile; 1456cdf0e10cSrcweir mpSwapFile->nRefCount = 1; 1457cdf0e10cSrcweir mpSwapFile->aSwapURL = aTmpURL; 1458cdf0e10cSrcweir } 1459cdf0e10cSrcweir else 1460cdf0e10cSrcweir { 1461cdf0e10cSrcweir delete pOStm, pOStm = NULL; 1462cdf0e10cSrcweir 1463cdf0e10cSrcweir try 1464cdf0e10cSrcweir { 1465cdf0e10cSrcweir ::ucbhelper::Content aCnt( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), 1466cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() ); 1467cdf0e10cSrcweir 1468cdf0e10cSrcweir aCnt.executeCommand( ::rtl::OUString::createFromAscii( "delete" ), 1469cdf0e10cSrcweir ::com::sun::star::uno::makeAny( sal_Bool( sal_True ) ) ); 1470cdf0e10cSrcweir } 1471cdf0e10cSrcweir catch( const ::com::sun::star::ucb::ContentCreationException& ) 1472cdf0e10cSrcweir { 1473cdf0e10cSrcweir } 1474cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 1475cdf0e10cSrcweir { 1476cdf0e10cSrcweir } 1477cdf0e10cSrcweir catch( const ::com::sun::star::ucb::CommandAbortedException& ) 1478cdf0e10cSrcweir { 1479cdf0e10cSrcweir } 1480cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1481cdf0e10cSrcweir { 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir } 1484cdf0e10cSrcweir 1485cdf0e10cSrcweir delete pOStm; 1486cdf0e10cSrcweir } 1487cdf0e10cSrcweir } 1488cdf0e10cSrcweir } 1489cdf0e10cSrcweir else 1490cdf0e10cSrcweir { 1491cdf0e10cSrcweir ImplClearGraphics( sal_True ); 1492cdf0e10cSrcweir bRet = mbSwapOut = sal_True; 1493cdf0e10cSrcweir } 1494cdf0e10cSrcweir } 1495cdf0e10cSrcweir 1496cdf0e10cSrcweir return bRet; 1497cdf0e10cSrcweir } 1498cdf0e10cSrcweir 1499cdf0e10cSrcweir // ------------------------------------------------------------------------ 1500cdf0e10cSrcweir 1501cdf0e10cSrcweir sal_Bool ImpGraphic::ImplSwapOut( SvStream* pOStm ) 1502cdf0e10cSrcweir { 1503cdf0e10cSrcweir sal_Bool bRet = sal_False; 1504cdf0e10cSrcweir 1505cdf0e10cSrcweir if( pOStm ) 1506cdf0e10cSrcweir { 1507cdf0e10cSrcweir pOStm->SetBufferSize( GRAPHIC_STREAMBUFSIZE ); 1508cdf0e10cSrcweir 1509cdf0e10cSrcweir if( !pOStm->GetError() && ImplWriteEmbedded( *pOStm ) ) 1510cdf0e10cSrcweir { 1511cdf0e10cSrcweir pOStm->Flush(); 1512cdf0e10cSrcweir 1513cdf0e10cSrcweir if( !pOStm->GetError() ) 1514cdf0e10cSrcweir { 1515cdf0e10cSrcweir ImplClearGraphics( sal_True ); 1516cdf0e10cSrcweir bRet = mbSwapOut = sal_True; 1517cdf0e10cSrcweir } 1518cdf0e10cSrcweir } 1519cdf0e10cSrcweir } 1520cdf0e10cSrcweir else 1521cdf0e10cSrcweir { 1522cdf0e10cSrcweir ImplClearGraphics( sal_True ); 1523cdf0e10cSrcweir bRet = mbSwapOut = sal_True; 1524cdf0e10cSrcweir } 1525cdf0e10cSrcweir 1526cdf0e10cSrcweir return bRet; 1527cdf0e10cSrcweir } 1528cdf0e10cSrcweir 1529cdf0e10cSrcweir // ------------------------------------------------------------------------ 1530cdf0e10cSrcweir 1531cdf0e10cSrcweir sal_Bool ImpGraphic::ImplSwapIn() 1532cdf0e10cSrcweir { 1533cdf0e10cSrcweir sal_Bool bRet = sal_False; 1534cdf0e10cSrcweir 1535cdf0e10cSrcweir if( ImplIsSwapOut() ) 1536cdf0e10cSrcweir { 1537cdf0e10cSrcweir String aSwapURL; 1538cdf0e10cSrcweir 1539cdf0e10cSrcweir if( mpSwapFile ) 1540cdf0e10cSrcweir aSwapURL = mpSwapFile->aSwapURL.GetMainURL( INetURLObject::NO_DECODE ); 1541cdf0e10cSrcweir else 1542cdf0e10cSrcweir aSwapURL = maDocFileURLStr; 1543cdf0e10cSrcweir 1544cdf0e10cSrcweir if( aSwapURL.Len() ) 1545cdf0e10cSrcweir { 1546cdf0e10cSrcweir SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aSwapURL, STREAM_READWRITE | STREAM_SHARE_DENYWRITE ); 1547cdf0e10cSrcweir 1548cdf0e10cSrcweir if( pIStm ) 1549cdf0e10cSrcweir { 1550cdf0e10cSrcweir pIStm->SetVersion( SOFFICE_FILEFORMAT_50 ); 1551cdf0e10cSrcweir pIStm->SetCompressMode( COMPRESSMODE_NATIVE ); 1552cdf0e10cSrcweir 1553cdf0e10cSrcweir if( !mpSwapFile ) 1554cdf0e10cSrcweir pIStm->Seek( mnDocFilePos ); 1555cdf0e10cSrcweir 1556cdf0e10cSrcweir bRet = ImplSwapIn( pIStm ); 1557cdf0e10cSrcweir delete pIStm; 1558cdf0e10cSrcweir 1559cdf0e10cSrcweir if( mpSwapFile ) 1560cdf0e10cSrcweir { 1561cdf0e10cSrcweir if( mpSwapFile->nRefCount > 1 ) 1562cdf0e10cSrcweir mpSwapFile->nRefCount--; 1563cdf0e10cSrcweir else 1564cdf0e10cSrcweir { 1565cdf0e10cSrcweir try 1566cdf0e10cSrcweir { 1567cdf0e10cSrcweir ::ucbhelper::Content aCnt( aSwapURL, 1568cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() ); 1569cdf0e10cSrcweir 1570cdf0e10cSrcweir aCnt.executeCommand( ::rtl::OUString::createFromAscii( "delete" ), 1571cdf0e10cSrcweir ::com::sun::star::uno::makeAny( sal_Bool( sal_True ) ) ); 1572cdf0e10cSrcweir } 1573cdf0e10cSrcweir catch( const ::com::sun::star::ucb::ContentCreationException& ) 1574cdf0e10cSrcweir { 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir catch( const ::com::sun::star::uno::RuntimeException& ) 1577cdf0e10cSrcweir { 1578cdf0e10cSrcweir } 1579cdf0e10cSrcweir catch( const ::com::sun::star::ucb::CommandAbortedException& ) 1580cdf0e10cSrcweir { 1581cdf0e10cSrcweir } 1582cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1583cdf0e10cSrcweir { 1584cdf0e10cSrcweir } 1585cdf0e10cSrcweir 1586cdf0e10cSrcweir delete mpSwapFile; 1587cdf0e10cSrcweir } 1588cdf0e10cSrcweir 1589cdf0e10cSrcweir mpSwapFile = NULL; 1590cdf0e10cSrcweir } 1591cdf0e10cSrcweir } 1592cdf0e10cSrcweir } 1593cdf0e10cSrcweir } 1594cdf0e10cSrcweir 1595cdf0e10cSrcweir return bRet; 1596cdf0e10cSrcweir } 1597cdf0e10cSrcweir 1598cdf0e10cSrcweir // ------------------------------------------------------------------------ 1599cdf0e10cSrcweir 1600cdf0e10cSrcweir sal_Bool ImpGraphic::ImplSwapIn( SvStream* pIStm ) 1601cdf0e10cSrcweir { 1602cdf0e10cSrcweir sal_Bool bRet = sal_False; 1603cdf0e10cSrcweir 1604cdf0e10cSrcweir if( pIStm ) 1605cdf0e10cSrcweir { 1606cdf0e10cSrcweir pIStm->SetBufferSize( GRAPHIC_STREAMBUFSIZE ); 1607cdf0e10cSrcweir 1608cdf0e10cSrcweir if( !pIStm->GetError() ) 1609cdf0e10cSrcweir { 1610cdf0e10cSrcweir mbSwapUnderway = sal_True; 1611cdf0e10cSrcweir bRet = ImplReadEmbedded( *pIStm ); 1612cdf0e10cSrcweir mbSwapUnderway = sal_False; 1613cdf0e10cSrcweir 1614cdf0e10cSrcweir if( !bRet ) 1615cdf0e10cSrcweir ImplClear(); 1616cdf0e10cSrcweir else 1617cdf0e10cSrcweir mbSwapOut = sal_False; 1618cdf0e10cSrcweir } 1619cdf0e10cSrcweir } 1620cdf0e10cSrcweir 1621cdf0e10cSrcweir return bRet; 1622cdf0e10cSrcweir } 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir // ------------------------------------------------------------------------ 1625cdf0e10cSrcweir 1626cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsSwapOut() const 1627cdf0e10cSrcweir { 1628cdf0e10cSrcweir return mbSwapOut; 1629cdf0e10cSrcweir } 1630cdf0e10cSrcweir 1631cdf0e10cSrcweir // ------------------------------------------------------------------------ 1632cdf0e10cSrcweir 1633cdf0e10cSrcweir void ImpGraphic::ImplSetLink( const GfxLink& rGfxLink ) 1634cdf0e10cSrcweir { 1635cdf0e10cSrcweir delete mpGfxLink; 1636cdf0e10cSrcweir mpGfxLink = new GfxLink( rGfxLink ); 1637cdf0e10cSrcweir 1638cdf0e10cSrcweir if( mpGfxLink->IsNative() ) 1639cdf0e10cSrcweir mpGfxLink->SwapOut(); 1640cdf0e10cSrcweir } 1641cdf0e10cSrcweir 1642cdf0e10cSrcweir // ------------------------------------------------------------------------ 1643cdf0e10cSrcweir 1644cdf0e10cSrcweir GfxLink ImpGraphic::ImplGetLink() 1645cdf0e10cSrcweir { 1646cdf0e10cSrcweir return( mpGfxLink ? *mpGfxLink : GfxLink() ); 1647cdf0e10cSrcweir } 1648cdf0e10cSrcweir 1649cdf0e10cSrcweir // ------------------------------------------------------------------------ 1650cdf0e10cSrcweir 1651cdf0e10cSrcweir sal_Bool ImpGraphic::ImplIsLink() const 1652cdf0e10cSrcweir { 1653cdf0e10cSrcweir return ( mpGfxLink != NULL ) ? sal_True : sal_False; 1654cdf0e10cSrcweir } 1655cdf0e10cSrcweir 1656cdf0e10cSrcweir // ------------------------------------------------------------------------ 1657cdf0e10cSrcweir 1658cdf0e10cSrcweir sal_uLong ImpGraphic::ImplGetChecksum() const 1659cdf0e10cSrcweir { 1660cdf0e10cSrcweir sal_uLong nRet = 0; 1661cdf0e10cSrcweir 1662cdf0e10cSrcweir if( ImplIsSupportedGraphic() && !ImplIsSwapOut() ) 1663cdf0e10cSrcweir { 1664cdf0e10cSrcweir switch( meType ) 1665cdf0e10cSrcweir { 1666cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 1667cdf0e10cSrcweir break; 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir case( GRAPHIC_BITMAP ): 1670cdf0e10cSrcweir { 1671ddde725dSArmin Le Grand if(maSvgData.get() && maEx.IsEmpty()) 1672ddde725dSArmin Le Grand { 1673ddde725dSArmin Le Grand // use maEx as local buffer for rendered svg 1674ddde725dSArmin Le Grand const_cast< ImpGraphic* >(this)->maEx = maSvgData->getReplacement(); 1675ddde725dSArmin Le Grand } 1676ddde725dSArmin Le Grand 1677cdf0e10cSrcweir if( mpAnimation ) 1678ddde725dSArmin Le Grand { 1679cdf0e10cSrcweir nRet = mpAnimation->GetChecksum(); 1680ddde725dSArmin Le Grand } 1681cdf0e10cSrcweir else 1682ddde725dSArmin Le Grand { 1683cdf0e10cSrcweir nRet = maEx.GetChecksum(); 1684cdf0e10cSrcweir } 1685ddde725dSArmin Le Grand } 1686cdf0e10cSrcweir break; 1687cdf0e10cSrcweir 1688cdf0e10cSrcweir default: 1689cdf0e10cSrcweir nRet = maMetaFile.GetChecksum(); 1690cdf0e10cSrcweir break; 1691cdf0e10cSrcweir } 1692cdf0e10cSrcweir } 1693cdf0e10cSrcweir 1694cdf0e10cSrcweir return nRet; 1695cdf0e10cSrcweir } 1696cdf0e10cSrcweir 1697cdf0e10cSrcweir // ------------------------------------------------------------------------ 1698cdf0e10cSrcweir 1699cdf0e10cSrcweir sal_Bool ImpGraphic::ImplExportNative( SvStream& rOStm ) const 1700cdf0e10cSrcweir { 1701cdf0e10cSrcweir sal_Bool bResult = sal_False; 1702cdf0e10cSrcweir 1703cdf0e10cSrcweir if( !rOStm.GetError() ) 1704cdf0e10cSrcweir { 1705cdf0e10cSrcweir if( !ImplIsSwapOut() ) 1706cdf0e10cSrcweir { 1707cdf0e10cSrcweir if( mpGfxLink && mpGfxLink->IsNative() ) 1708cdf0e10cSrcweir bResult = mpGfxLink->ExportNative( rOStm ); 1709cdf0e10cSrcweir else 1710cdf0e10cSrcweir { 1711cdf0e10cSrcweir rOStm << *this; 1712cdf0e10cSrcweir bResult = ( rOStm.GetError() == ERRCODE_NONE ); 1713cdf0e10cSrcweir } 1714cdf0e10cSrcweir } 1715cdf0e10cSrcweir else 1716cdf0e10cSrcweir rOStm.SetError( SVSTREAM_GENERALERROR ); 1717cdf0e10cSrcweir } 1718cdf0e10cSrcweir 1719cdf0e10cSrcweir return bResult; 1720cdf0e10cSrcweir } 1721cdf0e10cSrcweir 1722cdf0e10cSrcweir // ------------------------------------------------------------------------ 1723cdf0e10cSrcweir 1724ddde725dSArmin Le Grand const SvgDataPtr& ImpGraphic::getSvgData() const 1725ddde725dSArmin Le Grand { 1726ddde725dSArmin Le Grand return maSvgData; 1727ddde725dSArmin Le Grand } 1728ddde725dSArmin Le Grand 1729ddde725dSArmin Le Grand // ------------------------------------------------------------------------ 1730ddde725dSArmin Le Grand 1731cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, ImpGraphic& rImpGraphic ) 1732cdf0e10cSrcweir { 1733cdf0e10cSrcweir if( !rIStm.GetError() ) 1734cdf0e10cSrcweir { 1735cdf0e10cSrcweir const sal_uLong nStmPos1 = rIStm.Tell(); 1736cdf0e10cSrcweir sal_uInt32 nTmp; 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir if ( !rImpGraphic.mbSwapUnderway ) 1739cdf0e10cSrcweir rImpGraphic.ImplClear(); 1740cdf0e10cSrcweir 1741cdf0e10cSrcweir // read Id 1742cdf0e10cSrcweir rIStm >> nTmp; 1743cdf0e10cSrcweir 1744cdf0e10cSrcweir // if there is no more data, avoid further expensive 1745cdf0e10cSrcweir // reading which will create VDevs and other stuff, just to 1746cdf0e10cSrcweir // read nothing. CAUTION: Eof is only true AFTER reading another 1747cdf0e10cSrcweir // byte, a speciality of SvMemoryStream (!) 1748cdf0e10cSrcweir if(!rIStm.GetError() && !rIStm.IsEof()) 1749cdf0e10cSrcweir { 1750cdf0e10cSrcweir if( NATIVE_FORMAT_50 == nTmp ) 1751cdf0e10cSrcweir { 1752cdf0e10cSrcweir Graphic aGraphic; 1753cdf0e10cSrcweir GfxLink aLink; 1754cdf0e10cSrcweir VersionCompat* pCompat; 1755cdf0e10cSrcweir 1756cdf0e10cSrcweir // read compat info 1757cdf0e10cSrcweir pCompat = new VersionCompat( rIStm, STREAM_READ ); 1758cdf0e10cSrcweir delete pCompat; 1759cdf0e10cSrcweir 1760cdf0e10cSrcweir rIStm >> aLink; 1761cdf0e10cSrcweir 1762cdf0e10cSrcweir // set dummy link to avoid creation of additional link after filtering; 1763cdf0e10cSrcweir // we set a default link to avoid unnecessary swapping of native data 1764cdf0e10cSrcweir aGraphic.SetLink( GfxLink() ); 1765cdf0e10cSrcweir 1766cdf0e10cSrcweir if( !rIStm.GetError() && aLink.LoadNative( aGraphic ) ) 1767cdf0e10cSrcweir { 1768cdf0e10cSrcweir // set link only, if no other link was set 1769cdf0e10cSrcweir const sal_Bool bSetLink = ( rImpGraphic.mpGfxLink == NULL ); 1770cdf0e10cSrcweir 1771cdf0e10cSrcweir // assign graphic 1772cdf0e10cSrcweir rImpGraphic = *aGraphic.ImplGetImpGraphic(); 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir if( aLink.IsPrefMapModeValid() ) 1775cdf0e10cSrcweir rImpGraphic.ImplSetPrefMapMode( aLink.GetPrefMapMode() ); 1776cdf0e10cSrcweir 1777cdf0e10cSrcweir if( aLink.IsPrefSizeValid() ) 1778cdf0e10cSrcweir rImpGraphic.ImplSetPrefSize( aLink.GetPrefSize() ); 1779cdf0e10cSrcweir 1780cdf0e10cSrcweir if( bSetLink ) 1781cdf0e10cSrcweir rImpGraphic.ImplSetLink( aLink ); 1782cdf0e10cSrcweir } 1783cdf0e10cSrcweir else 1784cdf0e10cSrcweir { 1785cdf0e10cSrcweir rIStm.Seek( nStmPos1 ); 1786cdf0e10cSrcweir rIStm.SetError( ERRCODE_IO_WRONGFORMAT ); 1787cdf0e10cSrcweir } 1788cdf0e10cSrcweir } 1789cdf0e10cSrcweir else 1790cdf0e10cSrcweir { 1791cdf0e10cSrcweir BitmapEx aBmpEx; 1792cdf0e10cSrcweir const sal_uInt16 nOldFormat = rIStm.GetNumberFormatInt(); 1793cdf0e10cSrcweir 1794cdf0e10cSrcweir rIStm.SeekRel( -4 ); 1795cdf0e10cSrcweir rIStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 1796*45fd3b9aSArmin Le Grand ReadDIBBitmapEx(aBmpEx, rIStm); 1797cdf0e10cSrcweir 1798cdf0e10cSrcweir if( !rIStm.GetError() ) 1799cdf0e10cSrcweir { 1800cdf0e10cSrcweir sal_uInt32 nMagic1(0), nMagic2(0); 1801cdf0e10cSrcweir sal_uLong nActPos = rIStm.Tell(); 1802cdf0e10cSrcweir 1803cdf0e10cSrcweir rIStm >> nMagic1 >> nMagic2; 1804cdf0e10cSrcweir rIStm.Seek( nActPos ); 1805cdf0e10cSrcweir 1806cdf0e10cSrcweir rImpGraphic = ImpGraphic( aBmpEx ); 1807cdf0e10cSrcweir 1808cdf0e10cSrcweir if( !rIStm.GetError() && ( 0x5344414e == nMagic1 ) && ( 0x494d4931 == nMagic2 ) ) 1809cdf0e10cSrcweir { 1810cdf0e10cSrcweir delete rImpGraphic.mpAnimation; 1811cdf0e10cSrcweir rImpGraphic.mpAnimation = new Animation; 1812cdf0e10cSrcweir rIStm >> *rImpGraphic.mpAnimation; 1813cdf0e10cSrcweir 1814cdf0e10cSrcweir // #108077# manually set loaded BmpEx to Animation 1815cdf0e10cSrcweir // (which skips loading its BmpEx if already done) 1816cdf0e10cSrcweir rImpGraphic.mpAnimation->SetBitmapEx(aBmpEx); 1817cdf0e10cSrcweir } 1818cdf0e10cSrcweir else 1819cdf0e10cSrcweir rIStm.ResetError(); 1820cdf0e10cSrcweir } 1821cdf0e10cSrcweir else 1822cdf0e10cSrcweir { 1823cdf0e10cSrcweir GDIMetaFile aMtf; 1824cdf0e10cSrcweir 1825cdf0e10cSrcweir rIStm.Seek( nStmPos1 ); 1826cdf0e10cSrcweir rIStm.ResetError(); 1827cdf0e10cSrcweir rIStm >> aMtf; 1828cdf0e10cSrcweir 1829cdf0e10cSrcweir if( !rIStm.GetError() ) 183070577dceSArmin Le Grand { 1831cdf0e10cSrcweir rImpGraphic = aMtf; 183270577dceSArmin Le Grand } 1833cdf0e10cSrcweir else 183470577dceSArmin Le Grand { 183570577dceSArmin Le Grand // try to stream in Svg defining data (length, byte array and evtl. path) 183670577dceSArmin Le Grand // See below (operator<<) for more information 183770577dceSArmin Le Grand const sal_uInt32 nSvgMagic((sal_uInt32('s') << 24) | (sal_uInt32('v') << 16) | (sal_uInt32('g') << 8) | sal_uInt32('0')); 183870577dceSArmin Le Grand sal_uInt32 nMagic; 1839cdf0e10cSrcweir rIStm.Seek(nStmPos1); 184070577dceSArmin Le Grand rIStm.ResetError(); 184170577dceSArmin Le Grand rIStm >> nMagic; 184270577dceSArmin Le Grand 184370577dceSArmin Le Grand if(nSvgMagic == nMagic) 184470577dceSArmin Le Grand { 184570577dceSArmin Le Grand sal_uInt32 mnSvgDataArrayLength(0); 184670577dceSArmin Le Grand rIStm >> mnSvgDataArrayLength; 184770577dceSArmin Le Grand 184870577dceSArmin Le Grand if(mnSvgDataArrayLength) 184970577dceSArmin Le Grand { 185070577dceSArmin Le Grand SvgDataArray aNewData(new sal_uInt8[mnSvgDataArrayLength]); 185170577dceSArmin Le Grand UniString aPath; 185270577dceSArmin Le Grand 185370577dceSArmin Le Grand rIStm.Read(aNewData.get(), mnSvgDataArrayLength); 185470577dceSArmin Le Grand rIStm.ReadByteString(aPath); 185570577dceSArmin Le Grand 185670577dceSArmin Le Grand if(!rIStm.GetError()) 185770577dceSArmin Le Grand { 185870577dceSArmin Le Grand SvgDataPtr aSvgDataPtr( 185970577dceSArmin Le Grand new SvgData( 186070577dceSArmin Le Grand aNewData, 186170577dceSArmin Le Grand mnSvgDataArrayLength, 186270577dceSArmin Le Grand rtl::OUString(aPath))); 186370577dceSArmin Le Grand 186470577dceSArmin Le Grand rImpGraphic = aSvgDataPtr; 186570577dceSArmin Le Grand } 186670577dceSArmin Le Grand } 186770577dceSArmin Le Grand } 186870577dceSArmin Le Grand 186970577dceSArmin Le Grand rIStm.Seek(nStmPos1); 187070577dceSArmin Le Grand } 1871cdf0e10cSrcweir } 1872cdf0e10cSrcweir 1873cdf0e10cSrcweir rIStm.SetNumberFormatInt( nOldFormat ); 1874cdf0e10cSrcweir } 1875cdf0e10cSrcweir } 1876cdf0e10cSrcweir } 1877cdf0e10cSrcweir 1878cdf0e10cSrcweir return rIStm; 1879cdf0e10cSrcweir } 1880cdf0e10cSrcweir 1881cdf0e10cSrcweir // ------------------------------------------------------------------------ 1882cdf0e10cSrcweir 1883cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const ImpGraphic& rImpGraphic ) 1884cdf0e10cSrcweir { 1885cdf0e10cSrcweir if( !rOStm.GetError() ) 1886cdf0e10cSrcweir { 1887cdf0e10cSrcweir if( !rImpGraphic.ImplIsSwapOut() ) 1888cdf0e10cSrcweir { 1889cdf0e10cSrcweir if( ( rOStm.GetVersion() >= SOFFICE_FILEFORMAT_50 ) && 1890cdf0e10cSrcweir ( rOStm.GetCompressMode() & COMPRESSMODE_NATIVE ) && 1891cdf0e10cSrcweir rImpGraphic.mpGfxLink && rImpGraphic.mpGfxLink->IsNative() ) 1892cdf0e10cSrcweir { 1893cdf0e10cSrcweir VersionCompat* pCompat; 1894cdf0e10cSrcweir 1895cdf0e10cSrcweir // native format 1896cdf0e10cSrcweir rOStm << NATIVE_FORMAT_50; 1897cdf0e10cSrcweir 1898cdf0e10cSrcweir // write compat info 1899cdf0e10cSrcweir pCompat = new VersionCompat( rOStm, STREAM_WRITE, 1 ); 1900cdf0e10cSrcweir delete pCompat; 1901cdf0e10cSrcweir 1902cdf0e10cSrcweir rImpGraphic.mpGfxLink->SetPrefMapMode( rImpGraphic.ImplGetPrefMapMode() ); 1903cdf0e10cSrcweir rImpGraphic.mpGfxLink->SetPrefSize( rImpGraphic.ImplGetPrefSize() ); 1904cdf0e10cSrcweir rOStm << *rImpGraphic.mpGfxLink; 1905cdf0e10cSrcweir } 1906cdf0e10cSrcweir else 1907cdf0e10cSrcweir { 1908cdf0e10cSrcweir // own format 1909cdf0e10cSrcweir const sal_uInt16 nOldFormat = rOStm.GetNumberFormatInt(); 1910cdf0e10cSrcweir rOStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN ); 1911cdf0e10cSrcweir 1912cdf0e10cSrcweir switch( rImpGraphic.ImplGetType() ) 1913cdf0e10cSrcweir { 1914cdf0e10cSrcweir case( GRAPHIC_NONE ): 1915cdf0e10cSrcweir case( GRAPHIC_DEFAULT ): 1916cdf0e10cSrcweir break; 1917cdf0e10cSrcweir 1918cdf0e10cSrcweir case GRAPHIC_BITMAP: 1919cdf0e10cSrcweir { 1920ddde725dSArmin Le Grand if(rImpGraphic.getSvgData().get()) 1921ddde725dSArmin Le Grand { 192270577dceSArmin Le Grand // stream out Svg defining data (length, byte array and evtl. path) 192370577dceSArmin Le Grand // this is used e.g. in swapping out graphic data and in transporting it over UNO API 192470577dceSArmin Le Grand // as sequence of bytes, but AFAIK not written anywhere to any kind of file, so it should be 192570577dceSArmin Le Grand // no problem to extend it; only used at runtime 192670577dceSArmin Le Grand const sal_uInt32 nSvgMagic((sal_uInt32('s') << 24) | (sal_uInt32('v') << 16) | (sal_uInt32('g') << 8) | sal_uInt32('0')); 192770577dceSArmin Le Grand 192870577dceSArmin Le Grand rOStm << nSvgMagic; 192970577dceSArmin Le Grand rOStm << rImpGraphic.getSvgData()->getSvgDataArrayLength(); 193070577dceSArmin Le Grand rOStm.Write(rImpGraphic.getSvgData()->getSvgDataArray().get(), rImpGraphic.getSvgData()->getSvgDataArrayLength()); 193170577dceSArmin Le Grand rOStm.WriteByteString(rImpGraphic.getSvgData()->getPath()); 1932ddde725dSArmin Le Grand } 1933ddde725dSArmin Le Grand else if( rImpGraphic.ImplIsAnimated()) 1934ddde725dSArmin Le Grand { 1935cdf0e10cSrcweir rOStm << *rImpGraphic.mpAnimation; 1936ddde725dSArmin Le Grand } 1937cdf0e10cSrcweir else 1938ddde725dSArmin Le Grand { 1939*45fd3b9aSArmin Le Grand WriteDIBBitmapEx(rImpGraphic.maEx, rOStm); 1940cdf0e10cSrcweir } 1941ddde725dSArmin Le Grand } 1942cdf0e10cSrcweir break; 1943cdf0e10cSrcweir 1944cdf0e10cSrcweir default: 1945cdf0e10cSrcweir { 1946cdf0e10cSrcweir if( rImpGraphic.ImplIsSupportedGraphic() ) 1947cdf0e10cSrcweir rOStm << rImpGraphic.maMetaFile; 1948cdf0e10cSrcweir } 1949cdf0e10cSrcweir break; 1950cdf0e10cSrcweir } 1951cdf0e10cSrcweir 1952cdf0e10cSrcweir rOStm.SetNumberFormatInt( nOldFormat ); 1953cdf0e10cSrcweir } 1954cdf0e10cSrcweir } 1955cdf0e10cSrcweir else 1956cdf0e10cSrcweir rOStm.SetError( SVSTREAM_GENERALERROR ); 1957cdf0e10cSrcweir } 1958cdf0e10cSrcweir 1959cdf0e10cSrcweir return rOStm; 1960cdf0e10cSrcweir } 1961