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