xref: /aoo41x/main/svx/source/svdraw/svdograf.cxx (revision e6693332)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #define _ANIMATION
32 #include <unotools/streamwrap.hxx>
33 
34 #include <sfx2/lnkbase.hxx>
35 #include <math.h>
36 #include <vcl/salbtype.hxx>
37 #include <sot/formats.hxx>
38 #include <sot/storage.hxx>
39 #include <unotools/ucbstreamhelper.hxx>
40 #include <unotools/localfilehelper.hxx>
41 #include <svl/style.hxx>
42 #include <svtools/filter.hxx>
43 #include <svl/urihelper.hxx>
44 #include <svtools/grfmgr.hxx>
45 #include <vcl/svapp.hxx>
46 
47 #include <sfx2/linkmgr.hxx>
48 #include <sfx2/docfile.hxx>
49 #include <svx/svdetc.hxx>
50 #include "svx/svdglob.hxx"
51 #include "svx/svdstr.hrc"
52 #include <svx/svdpool.hxx>
53 #include <svx/svdmodel.hxx>
54 #include <svx/svdpage.hxx>
55 #include <svx/svdmrkv.hxx>
56 #include <svx/svdpagv.hxx>
57 #include "svx/svdviter.hxx"
58 #include <svx/svdview.hxx>
59 #include "svtools/filter.hxx"
60 #include <svx/svdograf.hxx>
61 #include <svx/svdogrp.hxx>
62 #include <svx/xbitmap.hxx>
63 #include <svx/xbtmpit.hxx>
64 #include <svx/xflbmtit.hxx>
65 #include <svx/svdundo.hxx>
66 #include "svdfmtf.hxx"
67 #include <svx/sdgcpitm.hxx>
68 #include <editeng/eeitem.hxx>
69 #include <svx/sdr/properties/graphicproperties.hxx>
70 #include <svx/sdr/contact/viewcontactofgraphic.hxx>
71 #include <basegfx/polygon/b2dpolygon.hxx>
72 #include <basegfx/polygon/b2dpolygontools.hxx>
73 #include <osl/thread.hxx>
74 #include <vos/mutex.hxx>
75 
76 using namespace ::com::sun::star::uno;
77 using namespace ::com::sun::star::io;
78 
79 // -----------
80 // - Defines -
81 // -----------
82 
83 #define GRAFSTREAMPOS_INVALID   0xffffffff
84 #define SWAPGRAPHIC_TIMEOUT     5000
85 
86 
87 // ------------------
88 // - SdrGraphicLink	-
89 // ------------------
90 
91 
92 const Graphic ImpLoadLinkedGraphic( const String aFileName, const String aFilterName )
93 {
94 	Graphic aGraphic;
95 
96 	SfxMedium xMed( aFileName, STREAM_STD_READ, sal_True );
97 	xMed.DownLoad();
98 
99 	SvStream* pInStrm = xMed.GetInStream();
100 	if ( pInStrm )
101 	{
102 		pInStrm->Seek( STREAM_SEEK_TO_BEGIN );
103 		GraphicFilter* pGF = GraphicFilter::GetGraphicFilter();
104 
105 		const sal_uInt16 nFilter = aFilterName.Len() && pGF->GetImportFormatCount()
106 							? pGF->GetImportFormatNumber( aFilterName )
107 							: GRFILTER_FORMAT_DONTKNOW;
108 
109 		String aEmptyStr;
110 		com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue > aFilterData( 1 );
111 
112 		// Room for improvment:
113 		// As this is a linked graphic the GfxLink is not needed if saving/loading our own format.
114 		// But this link is required by some filters to access the native graphic (pdf export/ms export),
115 		// there we should create a new service to provide this data if needed
116 		aFilterData[ 0 ].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
117 		aFilterData[ 0 ].Value = Any( sal_True );
118 		pGF->ImportGraphic( aGraphic, aEmptyStr, *pInStrm, nFilter, NULL, 0, &aFilterData );
119 	}
120 	return aGraphic;
121 }
122 
123 class SdrGraphicUpdater;
124 class SdrGraphicLink : public sfx2::SvBaseLink
125 {
126 	SdrGrafObj*			pGrafObj;
127 	SdrGraphicUpdater*	pGraphicUpdater;
128 
129 public:
130 						SdrGraphicLink(SdrGrafObj* pObj);
131 	virtual				~SdrGraphicLink();
132 
133 	virtual void		Closed();
134 	virtual void		DataChanged( const String& rMimeType,
135 								const ::com::sun::star::uno::Any & rValue );
136 	void				DataChanged( const Graphic& rGraphic );
137 
138 	sal_Bool				Connect() { return 0 != GetRealObject(); }
139 	void				UpdateAsynchron();
140 	void				RemoveGraphicUpdater();
141 };
142 
143 class SdrGraphicUpdater : public ::osl::Thread
144 {
145 public:
146     SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& );
147     virtual ~SdrGraphicUpdater( void );
148 
149 	void SAL_CALL Terminate( void );
150 
151     sal_Bool GraphicLinkChanged( const String& rFileName ){ return maFileName != rFileName;	};
152 
153 protected:
154 
155 	/**	is called from the inherited create method and acts as the
156 		main function of this thread.
157 	*/
158 	virtual void SAL_CALL run(void);
159 
160     /**	Called after the thread is terminated via the terminate
161     	method.  Used to kill the thread by calling delete on this.
162     */
163     virtual void SAL_CALL onTerminated(void);
164 
165 private:
166 
167     const String	maFileName;
168 	const String	maFilterName;
169 	SdrGraphicLink& mrGraphicLink;
170 
171 	volatile bool mbIsTerminated;
172 };
173 
174 SdrGraphicUpdater::SdrGraphicUpdater( const String& rFileName, const String& rFilterName, SdrGraphicLink& rGraphicLink )
175 : maFileName( rFileName )
176 , maFilterName( rFilterName )
177 , mrGraphicLink( rGraphicLink )
178 , mbIsTerminated( sal_False )
179 {
180 	create();
181 }
182 
183 SdrGraphicUpdater::~SdrGraphicUpdater( void )
184 {
185 }
186 
187 void SdrGraphicUpdater::Terminate()
188 {
189     mbIsTerminated = sal_True;
190 }
191 
192 void SAL_CALL SdrGraphicUpdater::onTerminated(void)
193 {
194 	delete this;
195 }
196 
197 void SAL_CALL SdrGraphicUpdater::run(void)
198 {
199 	Graphic aGraphic( ImpLoadLinkedGraphic( maFileName, maFilterName ) );
200 	vos::OGuard aSolarGuard( Application::GetSolarMutex() );
201 	if ( !mbIsTerminated )
202 	{
203 		mrGraphicLink.DataChanged( aGraphic );
204 		mrGraphicLink.RemoveGraphicUpdater();
205 	}
206 }
207 
208 // -----------------------------------------------------------------------------
209 
210 SdrGraphicLink::SdrGraphicLink(SdrGrafObj* pObj)
211 : ::sfx2::SvBaseLink( ::sfx2::LINKUPDATE_ONCALL, SOT_FORMATSTR_ID_SVXB )
212 , pGrafObj( pObj )
213 , pGraphicUpdater( NULL )
214 {
215 	SetSynchron( sal_False );
216 }
217 
218 // -----------------------------------------------------------------------------
219 
220 SdrGraphicLink::~SdrGraphicLink()
221 {
222 	if ( pGraphicUpdater )
223 		pGraphicUpdater->Terminate();
224 }
225 
226 // -----------------------------------------------------------------------------
227 
228 void SdrGraphicLink::DataChanged( const Graphic& rGraphic )
229 {
230 	pGrafObj->ImpSetLinkedGraphic( rGraphic );
231 }
232 
233 // -----------------------------------------------------------------------------
234 
235 void SdrGraphicLink::RemoveGraphicUpdater()
236 {
237 	pGraphicUpdater = NULL;
238 }
239 
240 // -----------------------------------------------------------------------------
241 
242 void SdrGraphicLink::DataChanged( const String& rMimeType,
243 								const ::com::sun::star::uno::Any & rValue )
244 {
245 	SdrModel*       pModel      = pGrafObj ? pGrafObj->GetModel() : 0;
246 	sfx2::LinkManager* pLinkManager= pModel  ? pModel->GetLinkManager() : 0;
247 
248 	if( pLinkManager && rValue.hasValue() )
249 	{
250 		pLinkManager->GetDisplayNames( this, 0, &pGrafObj->aFileName, 0, &pGrafObj->aFilterName );
251 
252 		Graphic aGraphic;
253 		if( sfx2::LinkManager::GetGraphicFromAny( rMimeType, rValue, aGraphic ))
254 		{
255    			pGrafObj->NbcSetGraphic( aGraphic );
256 			pGrafObj->ActionChanged();
257 		}
258 		else if( SotExchange::GetFormatIdFromMimeType( rMimeType ) != sfx2::LinkManager::RegisterStatusInfoId() )
259 		{
260 			// broadcasting, to update slidesorter
261 			pGrafObj->BroadcastObjectChange();
262 		}
263 	}
264 }
265 
266 // -----------------------------------------------------------------------------
267 
268 void SdrGraphicLink::Closed()
269 {
270 	// Die Verbindung wird aufgehoben; pLink des Objekts auf NULL setzen, da die Link-Instanz ja gerade destruiert wird.
271 	pGrafObj->ForceSwapIn();
272 	pGrafObj->pGraphicLink=NULL;
273 	pGrafObj->ReleaseGraphicLink();
274 	SvBaseLink::Closed();
275 }
276 
277 // -----------------------------------------------------------------------------
278 
279 void SdrGraphicLink::UpdateAsynchron()
280 {
281 	if( GetObj() )
282 	{
283 		if ( pGraphicUpdater )
284 		{
285 			if ( pGraphicUpdater->GraphicLinkChanged( pGrafObj->GetFileName() ) )
286 			{
287 				pGraphicUpdater->Terminate();
288 				pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
289 			}
290 		}
291 		else
292 			pGraphicUpdater = new SdrGraphicUpdater( pGrafObj->GetFileName(), pGrafObj->GetFilterName(), *this );
293 	}
294 }
295 
296 // --------------
297 // - SdrGrafObj -
298 // --------------
299 
300 //////////////////////////////////////////////////////////////////////////////
301 // BaseProperties section
302 
303 sdr::properties::BaseProperties* SdrGrafObj::CreateObjectSpecificProperties()
304 {
305 	return new sdr::properties::GraphicProperties(*this);
306 }
307 
308 //////////////////////////////////////////////////////////////////////////////
309 // DrawContact section
310 
311 sdr::contact::ViewContact* SdrGrafObj::CreateObjectSpecificViewContact()
312 {
313 	return new sdr::contact::ViewContactOfGraphic(*this);
314 }
315 
316 //////////////////////////////////////////////////////////////////////////////
317 
318 TYPEINIT1(SdrGrafObj,SdrRectObj);
319 
320 // -----------------------------------------------------------------------------
321 
322 SdrGrafObj::SdrGrafObj()
323 :	SdrRectObj(),
324 	pGraphicLink	( NULL ),
325 	bMirrored		( sal_False )
326 {
327 	pGraphic = new GraphicObject;
328 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
329 	bNoShear = sal_True;
330 
331 	// #111096#
332 	mbGrafAnimationAllowed = sal_True;
333 
334 	// #i25616#
335 	mbLineIsOutsideGeometry = sal_True;
336 	mbInsidePaint = sal_False;
337 	mbIsPreview = sal_False;
338 
339 	// #i25616#
340 	mbSupportTextIndentingOnLineWidthChange = sal_False;
341 }
342 
343 // -----------------------------------------------------------------------------
344 
345 SdrGrafObj::SdrGrafObj(const Graphic& rGrf, const Rectangle& rRect)
346 :	SdrRectObj		( rRect ),
347 	pGraphicLink	( NULL ),
348 	bMirrored		( sal_False )
349 {
350 	pGraphic = new GraphicObject( rGrf );
351 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
352 	bNoShear = sal_True;
353 
354 	// #111096#
355 	mbGrafAnimationAllowed = sal_True;
356 
357 	// #i25616#
358 	mbLineIsOutsideGeometry = sal_True;
359 	mbInsidePaint = sal_False;
360 	mbIsPreview	= sal_False;
361 
362 	// #i25616#
363 	mbSupportTextIndentingOnLineWidthChange = sal_False;
364 }
365 
366 // -----------------------------------------------------------------------------
367 
368 SdrGrafObj::SdrGrafObj( const Graphic& rGrf )
369 :	SdrRectObj(),
370 	pGraphicLink	( NULL ),
371 	bMirrored		( sal_False )
372 {
373 	pGraphic = new GraphicObject( rGrf );
374 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
375 	bNoShear = sal_True;
376 
377 	// #111096#
378 	mbGrafAnimationAllowed = sal_True;
379 
380 	// #i25616#
381 	mbLineIsOutsideGeometry = sal_True;
382 	mbInsidePaint = sal_False;
383 	mbIsPreview	= sal_False;
384 
385 	// #i25616#
386 	mbSupportTextIndentingOnLineWidthChange = sal_False;
387 }
388 
389 // -----------------------------------------------------------------------------
390 
391 SdrGrafObj::~SdrGrafObj()
392 {
393 	delete pGraphic;
394 	ImpLinkAbmeldung();
395 }
396 
397 // -----------------------------------------------------------------------------
398 
399 void SdrGrafObj::SetGraphicObject( const GraphicObject& rGrfObj )
400 {
401 	*pGraphic = rGrfObj;
402 	pGraphic->SetSwapStreamHdl( LINK( this, SdrGrafObj, ImpSwapHdl ), SWAPGRAPHIC_TIMEOUT );
403 	pGraphic->SetUserData();
404 	mbIsPreview = sal_False;
405 	SetChanged();
406 	BroadcastObjectChange();
407 }
408 
409 // -----------------------------------------------------------------------------
410 
411 const GraphicObject& SdrGrafObj::GetGraphicObject(bool bForceSwapIn) const
412 {
413 	if(bForceSwapIn)
414 	{
415 		ForceSwapIn();
416 	}
417 
418 	return *pGraphic;
419 }
420 
421 // -----------------------------------------------------------------------------
422 
423 void SdrGrafObj::NbcSetGraphic( const Graphic& rGrf )
424 {
425 	pGraphic->SetGraphic( rGrf );
426 	pGraphic->SetUserData();
427 	mbIsPreview = sal_False;
428 }
429 
430 void SdrGrafObj::SetGraphic( const Graphic& rGrf )
431 {
432     NbcSetGraphic(rGrf);
433 	SetChanged();
434 	BroadcastObjectChange();
435 }
436 
437 // -----------------------------------------------------------------------------
438 
439 const Graphic& SdrGrafObj::GetGraphic() const
440 {
441 	ForceSwapIn();
442 	return pGraphic->GetGraphic();
443 }
444 
445 // -----------------------------------------------------------------------------
446 
447 Graphic SdrGrafObj::GetTransformedGraphic( sal_uIntPtr nTransformFlags ) const
448 {
449     // #107947# Refactored most of the code to GraphicObject, where
450     // everybody can use e.g. the cropping functionality
451 
452 	GraphicType	    eType = GetGraphicType();
453     MapMode   		aDestMap( pModel->GetScaleUnit(), Point(), pModel->GetScaleFraction(), pModel->GetScaleFraction() );
454     const Size      aDestSize( GetLogicRect().GetSize() );
455     const sal_Bool      bMirror = ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_MIRROR ) != 0;
456     const sal_Bool      bRotate = ( ( nTransformFlags & SDRGRAFOBJ_TRANSFORMATTR_ROTATE ) != 0 ) &&
457         ( aGeo.nDrehWink && aGeo.nDrehWink != 18000 ) && ( GRAPHIC_NONE != eType );
458 
459     // #104115# Need cropping info earlier
460     ( (SdrGrafObj*) this )->ImpSetAttrToGrafInfo();
461     GraphicAttr aActAttr;
462 
463 	if( SDRGRAFOBJ_TRANSFORMATTR_NONE != nTransformFlags &&
464         GRAPHIC_NONE != eType )
465 	{
466         // actually transform the graphic only in this case. On the
467         // other hand, cropping will always happen
468         aActAttr = aGrafInfo;
469 
470         if( bMirror )
471 		{
472 			sal_uInt16		nMirrorCase = ( aGeo.nDrehWink == 18000 ) ? ( bMirrored ? 3 : 4 ) : ( bMirrored ? 2 : 1 );
473 			FASTBOOL	bHMirr = nMirrorCase == 2 || nMirrorCase == 4;
474 			FASTBOOL	bVMirr = nMirrorCase == 3 || nMirrorCase == 4;
475 
476 			aActAttr.SetMirrorFlags( ( bHMirr ? BMP_MIRROR_HORZ : 0 ) | ( bVMirr ? BMP_MIRROR_VERT : 0 ) );
477 		}
478 
479 		if( bRotate )
480 			aActAttr.SetRotation( sal_uInt16(aGeo.nDrehWink / 10) );
481 	}
482 
483     // #107947# Delegate to moved code in GraphicObject
484     return GetGraphicObject().GetTransformedGraphic( aDestSize, aDestMap, aActAttr );
485 }
486 
487 // -----------------------------------------------------------------------------
488 
489 GraphicType SdrGrafObj::GetGraphicType() const
490 {
491 	return pGraphic->GetType();
492 }
493 
494 sal_Bool SdrGrafObj::IsAnimated() const
495 {
496 	return pGraphic->IsAnimated();
497 }
498 
499 sal_Bool SdrGrafObj::IsEPS() const
500 {
501 	return pGraphic->IsEPS();
502 }
503 
504 sal_Bool SdrGrafObj::IsRenderGraphic() const
505 {
506 	return pGraphic->IsRenderGraphic();
507 }
508 
509 sal_Bool SdrGrafObj::HasRenderGraphic() const
510 {
511 	return pGraphic->HasRenderGraphic();
512 }
513 
514 sal_Bool SdrGrafObj::IsSwappedOut() const
515 {
516 	return mbIsPreview ? sal_True : pGraphic->IsSwappedOut();
517 }
518 
519 const MapMode& SdrGrafObj::GetGrafPrefMapMode() const
520 {
521 	return pGraphic->GetPrefMapMode();
522 }
523 
524 const Size& SdrGrafObj::GetGrafPrefSize() const
525 {
526 	return pGraphic->GetPrefSize();
527 }
528 
529 // -----------------------------------------------------------------------------
530 
531 void SdrGrafObj::SetGrafStreamURL( const String& rGraphicStreamURL )
532 {
533 	mbIsPreview = sal_False;
534 	if( !rGraphicStreamURL.Len() )
535 	{
536 		pGraphic->SetUserData();
537 	}
538 	else if( pModel->IsSwapGraphics() )
539 	{
540 		pGraphic->SetUserData( rGraphicStreamURL );
541 
542 		// set state of graphic object to 'swapped out'
543 		if( pGraphic->GetType() == GRAPHIC_NONE )
544 			pGraphic->SetSwapState();
545 	}
546 }
547 
548 // -----------------------------------------------------------------------------
549 
550 String SdrGrafObj::GetGrafStreamURL() const
551 {
552 	return pGraphic->GetUserData();
553 }
554 
555 // -----------------------------------------------------------------------------
556 
557 void SdrGrafObj::SetFileName(const String& rFileName)
558 {
559 	aFileName = rFileName;
560 	SetChanged();
561 }
562 
563 // -----------------------------------------------------------------------------
564 
565 void SdrGrafObj::SetFilterName(const String& rFilterName)
566 {
567 	aFilterName = rFilterName;
568 	SetChanged();
569 }
570 
571 // -----------------------------------------------------------------------------
572 
573 void SdrGrafObj::ForceSwapIn() const
574 {
575 	if( mbIsPreview )
576 	{
577 		// removing preview graphic
578 		const String aUserData( pGraphic->GetUserData() );
579 
580 		Graphic aEmpty;
581 		pGraphic->SetGraphic( aEmpty );
582 		pGraphic->SetUserData( aUserData );
583 		pGraphic->SetSwapState();
584 
585 		const_cast< SdrGrafObj* >( this )->mbIsPreview = sal_False;
586 	}
587 	if ( pGraphicLink && pGraphic->IsSwappedOut() )
588 		ImpUpdateGraphicLink( sal_False );
589 	else
590 		pGraphic->FireSwapInRequest();
591 
592 	if( pGraphic->IsSwappedOut() ||
593 	    ( pGraphic->GetType() == GRAPHIC_NONE ) ||
594 		( pGraphic->GetType() == GRAPHIC_DEFAULT ) )
595 	{
596 		Graphic aDefaultGraphic;
597 		aDefaultGraphic.SetDefaultType();
598 		pGraphic->SetGraphic( aDefaultGraphic );
599 	}
600 }
601 
602 // -----------------------------------------------------------------------------
603 
604 void SdrGrafObj::ForceSwapOut() const
605 {
606 	pGraphic->FireSwapOutRequest();
607 }
608 
609 // -----------------------------------------------------------------------------
610 
611 void SdrGrafObj::ImpLinkAnmeldung()
612 {
613 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
614 
615 	if( pLinkManager != NULL && pGraphicLink == NULL )
616 	{
617 		if( aFileName.Len() )
618 		{
619 			pGraphicLink = new SdrGraphicLink( this );
620 			pLinkManager->InsertFileLink( *pGraphicLink, OBJECT_CLIENT_GRF, aFileName, ( aFilterName.Len() ? &aFilterName : NULL ), NULL );
621 			pGraphicLink->Connect();
622 		}
623 	}
624 }
625 
626 // -----------------------------------------------------------------------------
627 
628 void SdrGrafObj::ImpLinkAbmeldung()
629 {
630 	sfx2::LinkManager* pLinkManager = pModel != NULL ? pModel->GetLinkManager() : NULL;
631 
632 	if( pLinkManager != NULL && pGraphicLink!=NULL)
633 	{
634 		// Bei Remove wird *pGraphicLink implizit deleted
635 		pLinkManager->Remove( pGraphicLink );
636 		pGraphicLink=NULL;
637 	}
638 }
639 
640 // -----------------------------------------------------------------------------
641 
642 void SdrGrafObj::SetGraphicLink( const String& rFileName, const String& rFilterName )
643 {
644 	ImpLinkAbmeldung();
645 	aFileName = rFileName;
646 	aFilterName = rFilterName;
647 	ImpLinkAnmeldung();
648 	pGraphic->SetUserData();
649 
650     // #92205# A linked graphic is per definition swapped out (has to be loaded)
651     pGraphic->SetSwapState();
652 }
653 
654 // -----------------------------------------------------------------------------
655 
656 void SdrGrafObj::ReleaseGraphicLink()
657 {
658 	ImpLinkAbmeldung();
659 	aFileName = String();
660 	aFilterName = String();
661 }
662 
663 // -----------------------------------------------------------------------------
664 
665 void SdrGrafObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
666 {
667 	FASTBOOL bAnim = pGraphic->IsAnimated();
668     FASTBOOL bRenderGraphic = pGraphic->HasRenderGraphic();
669 	FASTBOOL bNoPresGrf = ( pGraphic->GetType() != GRAPHIC_NONE ) && !bEmptyPresObj;
670 
671 	rInfo.bResizeFreeAllowed = aGeo.nDrehWink % 9000 == 0 ||
672 							   aGeo.nDrehWink % 18000 == 0 ||
673 							   aGeo.nDrehWink % 27000 == 0;
674 
675 	rInfo.bResizePropAllowed = sal_True;
676 	rInfo.bRotateFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic;
677 	rInfo.bRotate90Allowed = bNoPresGrf && !bAnim && !bRenderGraphic;
678 	rInfo.bMirrorFreeAllowed = bNoPresGrf && !bAnim && !bRenderGraphic;
679 	rInfo.bMirror45Allowed = bNoPresGrf && !bAnim && !bRenderGraphic;
680 	rInfo.bMirror90Allowed = !bEmptyPresObj && !bRenderGraphic;
681 	rInfo.bTransparenceAllowed = sal_False;
682 	rInfo.bGradientAllowed = sal_False;
683 	rInfo.bShearAllowed = sal_False;
684 	rInfo.bEdgeRadiusAllowed=sal_False;
685 	rInfo.bCanConvToPath = sal_False;
686 	rInfo.bCanConvToPathLineToArea = sal_False;
687 	rInfo.bCanConvToPolyLineToArea = sal_False;
688 	rInfo.bCanConvToPoly = !IsEPS() && !bRenderGraphic;
689 	rInfo.bCanConvToContour = (rInfo.bCanConvToPoly || LineGeometryUsageIsNecessary());
690 }
691 
692 // -----------------------------------------------------------------------------
693 
694 sal_uInt16 SdrGrafObj::GetObjIdentifier() const
695 {
696 	return sal_uInt16( OBJ_GRAF );
697 }
698 
699 // -----------------------------------------------------------------------------
700 
701 /* The graphic of the GraphicLink will be loaded. If it is called with
702    bAsynchron = true then the graphic will be set later via DataChanged
703 */
704 sal_Bool SdrGrafObj::ImpUpdateGraphicLink( sal_Bool bAsynchron ) const
705 {
706     sal_Bool bRet = sal_False;
707     if( pGraphicLink )
708 	{
709 		if ( bAsynchron )
710 			pGraphicLink->UpdateAsynchron();
711 		else
712 			pGraphicLink->DataChanged( ImpLoadLinkedGraphic( aFileName, aFilterName ) );
713         bRet = sal_True;
714     }
715 	return bRet;
716 }
717 
718 // -----------------------------------------------------------------------------
719 
720 void SdrGrafObj::ImpSetLinkedGraphic( const Graphic& rGraphic )
721 {
722 	const sal_Bool bIsChanged = GetModel()->IsChanged();
723 	NbcSetGraphic( rGraphic );
724 	ActionChanged();
725 	BroadcastObjectChange();
726 	GetModel()->SetChanged( bIsChanged );
727 }
728 
729 // -----------------------------------------------------------------------------
730 
731 void SdrGrafObj::TakeObjNameSingul(XubString& rName) const
732 {
733 	switch( pGraphic->GetType() )
734 	{
735 		case GRAPHIC_BITMAP:
736         {
737             const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
738                                  ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPTRANSLNK : STR_ObjNameSingulGRAFBMPTRANS ) :
739                                  ( IsLinkedGraphic() ? STR_ObjNameSingulGRAFBMPLNK : STR_ObjNameSingulGRAFBMP ) );
740 
741             rName=ImpGetResStr( nId );
742         }
743         break;
744 
745 		case GRAPHIC_GDIMETAFILE:
746             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFMTFLNK : STR_ObjNameSingulGRAFMTF );
747         break;
748 
749         case GRAPHIC_NONE:
750             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNameSingulGRAFNONELNK : STR_ObjNameSingulGRAFNONE );
751         break;
752 
753         default:
754             rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNameSingulGRAFLNK : STR_ObjNameSingulGRAF );
755         break;
756 	}
757 
758 	const String aName(GetName());
759 
760 	if( aName.Len() )
761 	{
762 		rName.AppendAscii( " '" );
763 		rName += aName;
764 		rName += sal_Unicode( '\'' );
765 	}
766 }
767 
768 // -----------------------------------------------------------------------------
769 
770 void SdrGrafObj::TakeObjNamePlural( XubString& rName ) const
771 {
772 	switch( pGraphic->GetType() )
773 	{
774 		case GRAPHIC_BITMAP:
775         {
776             const sal_uInt16 nId = ( ( pGraphic->IsTransparent() || ( (const SdrGrafTransparenceItem&) GetObjectItem( SDRATTR_GRAFTRANSPARENCE ) ).GetValue() ) ?
777                                  ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPTRANSLNK : STR_ObjNamePluralGRAFBMPTRANS ) :
778                                  ( IsLinkedGraphic() ? STR_ObjNamePluralGRAFBMPLNK : STR_ObjNamePluralGRAFBMP ) );
779 
780             rName=ImpGetResStr( nId );
781         }
782         break;
783 
784 		case GRAPHIC_GDIMETAFILE:
785             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFMTFLNK : STR_ObjNamePluralGRAFMTF );
786         break;
787 
788         case GRAPHIC_NONE:
789             rName=ImpGetResStr( IsLinkedGraphic() ? STR_ObjNamePluralGRAFNONELNK : STR_ObjNamePluralGRAFNONE );
790         break;
791 
792         default:
793             rName=ImpGetResStr(  IsLinkedGraphic() ? STR_ObjNamePluralGRAFLNK : STR_ObjNamePluralGRAF );
794         break;
795 	}
796 
797 	const String aName(GetName());
798 
799 	if( aName.Len() )
800 	{
801 		rName.AppendAscii( " '" );
802 		rName += aName;
803 		rName += sal_Unicode( '\'' );
804 	}
805 }
806 
807 // -----------------------------------------------------------------------------
808 
809 SdrObject* SdrGrafObj::getFullDragClone() const
810 {
811     // call parent
812     SdrGrafObj* pRetval = static_cast< SdrGrafObj* >(SdrRectObj::getFullDragClone());
813 
814     // #i103116# the full drag clone leads to problems
815     // with linked graphics, so reset the link in this
816     // temporary interaction object and load graphic
817     if(pRetval && IsLinkedGraphic())
818     {
819         pRetval->ForceSwapIn();
820         pRetval->ReleaseGraphicLink();
821     }
822 
823     return pRetval;
824 }
825 
826 void SdrGrafObj::operator=( const SdrObject& rObj )
827 {
828 	SdrRectObj::operator=( rObj );
829 
830 	const SdrGrafObj& rGraf = (SdrGrafObj&) rObj;
831 
832 	pGraphic->SetGraphic( rGraf.GetGraphic(), &rGraf.GetGraphicObject() );
833 	aCropRect = rGraf.aCropRect;
834 	aFileName = rGraf.aFileName;
835 	aFilterName = rGraf.aFilterName;
836 	bMirrored = rGraf.bMirrored;
837 
838 	if( rGraf.pGraphicLink != NULL)
839 	{
840 		SetGraphicLink( aFileName, aFilterName );
841 	}
842 
843 	ImpSetAttrToGrafInfo();
844 }
845 
846 // -----------------------------------------------------------------------------
847 // #i25616#
848 
849 basegfx::B2DPolyPolygon SdrGrafObj::TakeXorPoly() const
850 {
851 	if(mbInsidePaint)
852 	{
853 		basegfx::B2DPolyPolygon aRetval;
854 
855 		// take grown rectangle
856 		const sal_Int32 nHalfLineWidth(ImpGetLineWdt() / 2);
857 		const Rectangle aGrownRect(
858 			aRect.Left() - nHalfLineWidth,
859 			aRect.Top() - nHalfLineWidth,
860 			aRect.Right() + nHalfLineWidth,
861 			aRect.Bottom() + nHalfLineWidth);
862 
863 		XPolygon aXPoly(ImpCalcXPoly(aGrownRect, GetEckenradius()));
864 		aRetval.append(aXPoly.getB2DPolygon());
865 
866 		return aRetval;
867 	}
868 	else
869 	{
870 		// call parent
871 		return SdrRectObj::TakeXorPoly();
872 	}
873 }
874 
875 // -----------------------------------------------------------------------------
876 
877 sal_uInt32 SdrGrafObj::GetHdlCount() const
878 {
879 	return 8L;
880 }
881 
882 // -----------------------------------------------------------------------------
883 
884 SdrHdl* SdrGrafObj::GetHdl(sal_uInt32 nHdlNum) const
885 {
886 	return SdrRectObj::GetHdl( nHdlNum + 1L );
887 }
888 
889 // -----------------------------------------------------------------------------
890 
891 void SdrGrafObj::NbcResize(const Point& rRef, const Fraction& xFact, const Fraction& yFact)
892 {
893 	SdrRectObj::NbcResize( rRef, xFact, yFact );
894 
895 	FASTBOOL bMirrX = xFact.GetNumerator() < 0;
896 	FASTBOOL bMirrY = yFact.GetNumerator() < 0;
897 
898 	if( bMirrX != bMirrY )
899 		bMirrored = !bMirrored;
900 }
901 
902 // -----------------------------------------------------------------------------
903 
904 void SdrGrafObj::NbcRotate(const Point& rRef, long nWink, double sn, double cs)
905 {
906 	SdrRectObj::NbcRotate(rRef,nWink,sn,cs);
907 }
908 
909 // -----------------------------------------------------------------------------
910 
911 void SdrGrafObj::NbcMirror(const Point& rRef1, const Point& rRef2)
912 {
913 	SdrRectObj::NbcMirror(rRef1,rRef2);
914 	bMirrored = !bMirrored;
915 }
916 
917 // -----------------------------------------------------------------------------
918 
919 void SdrGrafObj::NbcShear(const Point& rRef, long nWink, double tn, FASTBOOL bVShear)
920 {
921 	SdrRectObj::NbcRotate( rRef, nWink, tn, bVShear );
922 }
923 
924 // -----------------------------------------------------------------------------
925 
926 void SdrGrafObj::NbcSetSnapRect(const Rectangle& rRect)
927 {
928 	SdrRectObj::NbcSetSnapRect(rRect);
929 }
930 
931 // -----------------------------------------------------------------------------
932 
933 void SdrGrafObj::NbcSetLogicRect( const Rectangle& rRect)
934 {
935 	//int bChg=rRect.GetSize()!=aRect.GetSize();
936 	SdrRectObj::NbcSetLogicRect(rRect);
937 }
938 
939 // -----------------------------------------------------------------------------
940 
941 SdrObjGeoData* SdrGrafObj::NewGeoData() const
942 {
943 	return new SdrGrafObjGeoData;
944 }
945 
946 // -----------------------------------------------------------------------------
947 
948 void SdrGrafObj::SaveGeoData(SdrObjGeoData& rGeo) const
949 {
950 	SdrRectObj::SaveGeoData(rGeo);
951 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
952 	rGGeo.bMirrored=bMirrored;
953 }
954 
955 // -----------------------------------------------------------------------------
956 
957 void SdrGrafObj::RestGeoData(const SdrObjGeoData& rGeo)
958 {
959 	//long		nDrehMerk = aGeo.nDrehWink;
960 	//long		nShearMerk = aGeo.nShearWink;
961 	//int	bMirrMerk = bMirrored;
962 	Size		aSizMerk( aRect.GetSize() );
963 
964 	SdrRectObj::RestGeoData(rGeo);
965 	SdrGrafObjGeoData& rGGeo=(SdrGrafObjGeoData&)rGeo;
966 	bMirrored=rGGeo.bMirrored;
967 }
968 
969 // -----------------------------------------------------------------------------
970 
971 void SdrGrafObj::SetPage( SdrPage* pNewPage )
972 {
973 	FASTBOOL bRemove = pNewPage == NULL && pPage != NULL;
974 	FASTBOOL bInsert = pNewPage != NULL && pPage == NULL;
975 
976 	if( bRemove )
977 	{
978 		// hier kein SwapIn noetig, weil wenn nicht geladen, dann auch nicht animiert.
979 		if( pGraphic->IsAnimated())
980 			pGraphic->StopAnimation();
981 
982 		if( pGraphicLink != NULL )
983 			ImpLinkAbmeldung();
984 	}
985 
986 	SdrRectObj::SetPage( pNewPage );
987 
988 	if(aFileName.Len() && bInsert)
989 		ImpLinkAnmeldung();
990 }
991 
992 // -----------------------------------------------------------------------------
993 
994 void SdrGrafObj::SetModel( SdrModel* pNewModel )
995 {
996 	FASTBOOL bChg = pNewModel != pModel;
997 
998 	if( bChg )
999 	{
1000 		if( pGraphic->HasUserData() )
1001 		{
1002 			ForceSwapIn();
1003 			pGraphic->SetUserData();
1004 		}
1005 
1006 		if( pGraphicLink != NULL )
1007 			ImpLinkAbmeldung();
1008 	}
1009 
1010 	// Model umsetzen
1011 	SdrRectObj::SetModel(pNewModel);
1012 
1013 	if( bChg && aFileName.Len() )
1014 		ImpLinkAnmeldung();
1015 }
1016 
1017 // -----------------------------------------------------------------------------
1018 
1019 void SdrGrafObj::StartAnimation( OutputDevice* /*pOutDev*/, const Point& /*rPoint*/, const Size& /*rSize*/, long /*nExtraData*/)
1020 {
1021 	// #111096#
1022 	// use new graf animation
1023 	SetGrafAnimationAllowed(sal_True);
1024 }
1025 
1026 // -----------------------------------------------------------------------------
1027 
1028 void SdrGrafObj::StopAnimation(OutputDevice* /*pOutDev*/, long /*nExtraData*/)
1029 {
1030 	// #111096#
1031 	// use new graf animation
1032 	SetGrafAnimationAllowed(sal_False);
1033 }
1034 
1035 // -----------------------------------------------------------------------------
1036 
1037 FASTBOOL SdrGrafObj::HasGDIMetaFile() const
1038 {
1039 	return( pGraphic->GetType() == GRAPHIC_GDIMETAFILE );
1040 }
1041 
1042 // -----------------------------------------------------------------------------
1043 
1044 const GDIMetaFile* SdrGrafObj::GetGDIMetaFile() const
1045 {
1046 	DBG_ERROR( "Invalid return value! Don't use it! (KA)" );
1047 	return &GetGraphic().GetGDIMetaFile();
1048 }
1049 
1050 // -----------------------------------------------------------------------------
1051 
1052 SdrObject* SdrGrafObj::DoConvertToPolyObj(sal_Bool bBezier) const
1053 {
1054 	SdrObject* pRetval = NULL;
1055 
1056 	switch( GetGraphicType() )
1057 	{
1058 		case GRAPHIC_GDIMETAFILE:
1059 		{
1060 			// NUR die aus dem MetaFile erzeugbaren Objekte in eine Gruppe packen und zurueckliefern
1061 			SdrObjGroup*			pGrp = new SdrObjGroup();
1062 			ImpSdrGDIMetaFileImport aFilter(*GetModel());
1063 			Point					aOutPos( aRect.TopLeft() );
1064 			const Size				aOutSiz( aRect.GetSize() );
1065 
1066 			aFilter.SetScaleRect(GetSnapRect());
1067 			aFilter.SetLayer(GetLayer());
1068 
1069 			sal_uInt32 nInsAnz = aFilter.DoImport(GetTransformedGraphic().GetGDIMetaFile(), *pGrp->GetSubList(), 0);
1070 			if(nInsAnz)
1071 			{
1072 				pRetval = pGrp;
1073 				pGrp->NbcSetLayer(GetLayer());
1074 				pGrp->SetModel(GetModel());
1075 				pRetval = ImpConvertAddText(pRetval, bBezier);
1076 
1077                 // convert all children
1078                 if( pRetval )
1079                 {
1080                     SdrObject* pHalfDone = pRetval;
1081                     pRetval = pHalfDone->DoConvertToPolyObj(bBezier);
1082                     SdrObject::Free( pHalfDone ); // resulting object is newly created
1083 
1084                     if( pRetval )
1085                     {
1086                         // flatten subgroups. As we call
1087                         // DoConvertToPolyObj() on the resulting group
1088                         // objects, subgroups can exist (e.g. text is
1089                         // a group object for every line).
1090                         SdrObjList* pList = pRetval->GetSubList();
1091                         if( pList )
1092                             pList->FlattenGroups();
1093                     }
1094                 }
1095 			}
1096 			else
1097 				delete pGrp;
1098 			break;
1099 		}
1100 		case GRAPHIC_BITMAP:
1101 		{
1102 			// Grundobjekt kreieren und Fuellung ergaenzen
1103 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier);
1104 
1105 			// Bitmap als Attribut retten
1106 			if(pRetval)
1107 			{
1108 				// Bitmap als Fuellung holen
1109 				SfxItemSet aSet(GetObjectItemSet());
1110 
1111 				aSet.Put(XFillStyleItem(XFILL_BITMAP));
1112 				Bitmap aBitmap( GetTransformedGraphic().GetBitmap() );
1113 				XOBitmap aXBmp(aBitmap, XBITMAP_STRETCH);
1114 				aSet.Put(XFillBitmapItem(String(), aXBmp));
1115 				aSet.Put(XFillBmpTileItem(sal_False));
1116 
1117 				pRetval->SetMergedItemSet(aSet);
1118 			}
1119 			break;
1120 		}
1121 		case GRAPHIC_NONE:
1122 		case GRAPHIC_DEFAULT:
1123 		{
1124 			pRetval = SdrRectObj::DoConvertToPolyObj(bBezier);
1125 			break;
1126 		}
1127 	}
1128 
1129 	return pRetval;
1130 }
1131 
1132 // -----------------------------------------------------------------------------
1133 
1134 void SdrGrafObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
1135 {
1136 	SetXPolyDirty();
1137 	SdrRectObj::Notify( rBC, rHint );
1138 	ImpSetAttrToGrafInfo();
1139 }
1140 
1141 void SdrGrafObj::ImpSetAttrToGrafInfo()
1142 {
1143 	const SfxItemSet& rSet = GetObjectItemSet();
1144 	const sal_uInt16 nTrans = ( (SdrGrafTransparenceItem&) rSet.Get( SDRATTR_GRAFTRANSPARENCE ) ).GetValue();
1145 	const SdrGrafCropItem&	rCrop = (const SdrGrafCropItem&) rSet.Get( SDRATTR_GRAFCROP );
1146 
1147 	aGrafInfo.SetLuminance( ( (SdrGrafLuminanceItem&) rSet.Get( SDRATTR_GRAFLUMINANCE ) ).GetValue() );
1148 	aGrafInfo.SetContrast( ( (SdrGrafContrastItem&) rSet.Get( SDRATTR_GRAFCONTRAST ) ).GetValue() );
1149 	aGrafInfo.SetChannelR( ( (SdrGrafRedItem&) rSet.Get( SDRATTR_GRAFRED ) ).GetValue() );
1150 	aGrafInfo.SetChannelG( ( (SdrGrafGreenItem&) rSet.Get( SDRATTR_GRAFGREEN ) ).GetValue() );
1151 	aGrafInfo.SetChannelB( ( (SdrGrafBlueItem&) rSet.Get( SDRATTR_GRAFBLUE ) ).GetValue() );
1152 	aGrafInfo.SetGamma( ( (SdrGrafGamma100Item&) rSet.Get( SDRATTR_GRAFGAMMA ) ).GetValue() * 0.01 );
1153 	aGrafInfo.SetTransparency( (sal_uInt8) FRound( Min( nTrans, (sal_uInt16) 100 )  * 2.55 ) );
1154 	aGrafInfo.SetInvert( ( (SdrGrafInvertItem&) rSet.Get( SDRATTR_GRAFINVERT ) ).GetValue() );
1155 	aGrafInfo.SetDrawMode( ( (SdrGrafModeItem&) rSet.Get( SDRATTR_GRAFMODE ) ).GetValue() );
1156 	aGrafInfo.SetCrop( rCrop.GetLeft(), rCrop.GetTop(), rCrop.GetRight(), rCrop.GetBottom() );
1157 
1158 	SetXPolyDirty();
1159 	SetRectsDirty();
1160 }
1161 
1162 // -----------------------------------------------------------------------------
1163 
1164 void SdrGrafObj::ImpSetGrafInfoToAttr()
1165 {
1166 	SetObjectItem( SdrGrafLuminanceItem( aGrafInfo.GetLuminance() ) );
1167 	SetObjectItem( SdrGrafContrastItem( aGrafInfo.GetContrast() ) );
1168 	SetObjectItem( SdrGrafRedItem( aGrafInfo.GetChannelR() ) );
1169 	SetObjectItem( SdrGrafGreenItem( aGrafInfo.GetChannelG() ) );
1170 	SetObjectItem( SdrGrafBlueItem( aGrafInfo.GetChannelB() ) );
1171 	SetObjectItem( SdrGrafGamma100Item( FRound( aGrafInfo.GetGamma() * 100.0 ) ) );
1172 	SetObjectItem( SdrGrafTransparenceItem( (sal_uInt16) FRound( aGrafInfo.GetTransparency() / 2.55 ) ) );
1173 	SetObjectItem( SdrGrafInvertItem( aGrafInfo.IsInvert() ) );
1174 	SetObjectItem( SdrGrafModeItem( aGrafInfo.GetDrawMode() ) );
1175 	SetObjectItem( SdrGrafCropItem( aGrafInfo.GetLeftCrop(), aGrafInfo.GetTopCrop(), aGrafInfo.GetRightCrop(), aGrafInfo.GetBottomCrop() ) );
1176 }
1177 
1178 // -----------------------------------------------------------------------------
1179 
1180 void SdrGrafObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly )
1181 {
1182 	Size aSize;
1183 	Size aMaxSize( rMaxRect.GetSize() );
1184 	if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1185 		aSize = Application::GetDefaultDevice()->PixelToLogic( pGraphic->GetPrefSize(), MAP_100TH_MM );
1186 	else
1187 		aSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(),
1188 										    pGraphic->GetPrefMapMode(),
1189 										    MapMode( MAP_100TH_MM ) );
1190 
1191 	if( aSize.Height() != 0 && aSize.Width() != 0 )
1192 	{
1193 		Point aPos( rMaxRect.TopLeft() );
1194 
1195 		// Falls Grafik zu gross, wird die Grafik
1196 		// in die Seite eingepasst
1197 		if ( (!bShrinkOnly                          ||
1198 	    	 ( aSize.Height() > aMaxSize.Height() ) ||
1199 		 	( aSize.Width()  > aMaxSize.Width()  ) )&&
1200 		 	aSize.Height() && aMaxSize.Height() )
1201 		{
1202 			float fGrfWH =	(float)aSize.Width() /
1203 							(float)aSize.Height();
1204 			float fWinWH =	(float)aMaxSize.Width() /
1205 							(float)aMaxSize.Height();
1206 
1207 			// Grafik an Pagesize anpassen (skaliert)
1208 			if ( fGrfWH < fWinWH )
1209 			{
1210 				aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
1211 				aSize.Height()= aMaxSize.Height();
1212 			}
1213 			else if ( fGrfWH > 0.F )
1214 			{
1215 				aSize.Width() = aMaxSize.Width();
1216 				aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
1217 			}
1218 
1219 			aPos = rMaxRect.Center();
1220 		}
1221 
1222 		if( bShrinkOnly )
1223 			aPos = aRect.TopLeft();
1224 
1225 		aPos.X() -= aSize.Width() / 2;
1226 		aPos.Y() -= aSize.Height() / 2;
1227 		SetLogicRect( Rectangle( aPos, aSize ) );
1228 	}
1229 }
1230 
1231 // -----------------------------------------------------------------------------
1232 
1233 IMPL_LINK( SdrGrafObj, ImpSwapHdl, GraphicObject*, pO )
1234 {
1235 	SvStream* pRet = GRFMGR_AUTOSWAPSTREAM_NONE;
1236 
1237 	if( pO->IsInSwapOut() )
1238 	{
1239 		if( pModel && !mbIsPreview && pModel->IsSwapGraphics() && pGraphic->GetSizeBytes() > 20480 )
1240 		{
1241 			// test if this object is visualized from someone
1242             // ## test only if there are VOCs other than the preview renderer
1243 			if(!GetViewContact().HasViewObjectContacts(true))
1244 			{
1245 				const sal_uIntPtr	nSwapMode = pModel->GetSwapGraphicsMode();
1246 
1247 				if( ( pGraphic->HasUserData() || pGraphicLink ) &&
1248 					( nSwapMode & SDR_SWAPGRAPHICSMODE_PURGE ) )
1249 				{
1250 					pRet = GRFMGR_AUTOSWAPSTREAM_LINK;
1251 				}
1252 				else if( nSwapMode & SDR_SWAPGRAPHICSMODE_TEMP )
1253 				{
1254 					pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1255 					pGraphic->SetUserData();
1256 				}
1257 
1258 				// #i102380#
1259 				sdr::contact::ViewContactOfGraphic* pVC = dynamic_cast< sdr::contact::ViewContactOfGraphic* >(&GetViewContact());
1260 
1261 				if(pVC)
1262 				{
1263 					pVC->flushGraphicObjects();
1264 				}
1265 			}
1266 		}
1267 	}
1268 	else if( pO->IsInSwapIn() )
1269 	{
1270 		// kann aus dem original Doc-Stream nachgeladen werden...
1271 		if( pModel != NULL )
1272 		{
1273 			if( pGraphic->HasUserData() )
1274 			{
1275 				SdrDocumentStreamInfo aStreamInfo;
1276 
1277 				aStreamInfo.mbDeleteAfterUse = sal_False;
1278 				aStreamInfo.maUserData = pGraphic->GetUserData();
1279 
1280 				SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1281 
1282 				if( pStream != NULL )
1283 				{
1284 					Graphic aGraphic;
1285 
1286                     com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >* pFilterData = NULL;
1287 
1288 					if(mbInsidePaint && !GetViewContact().HasViewObjectContacts(true))
1289                     {
1290 //							Rectangle aSnapRect(GetSnapRect());
1291 //							const Rectangle aSnapRectPixel(pOutDev->LogicToPixel(aSnapRect));
1292 
1293                         pFilterData = new com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >( 3 );
1294 
1295                         com::sun::star::awt::Size aPreviewSizeHint( 64, 64 );
1296                         sal_Bool bAllowPartialStreamRead = sal_True;
1297                         sal_Bool bCreateNativeLink = sal_False;
1298                         (*pFilterData)[ 0 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "PreviewSizeHint" ) );
1299                         (*pFilterData)[ 0 ].Value <<= aPreviewSizeHint;
1300                         (*pFilterData)[ 1 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "AllowPartialStreamRead" ) );
1301                         (*pFilterData)[ 1 ].Value <<= bAllowPartialStreamRead;
1302                         (*pFilterData)[ 2 ].Name = String( RTL_CONSTASCII_USTRINGPARAM( "CreateNativeLink" ) );
1303                         (*pFilterData)[ 2 ].Value <<= bCreateNativeLink;
1304 
1305                         mbIsPreview = sal_True;
1306                     }
1307 
1308                     if( !GraphicFilter::GetGraphicFilter()->ImportGraphic( aGraphic, String(), *pStream,
1309                                                         GRFILTER_FORMAT_DONTKNOW, NULL, 0, pFilterData ) )
1310                     {
1311                         const String aUserData( pGraphic->GetUserData() );
1312 
1313                         pGraphic->SetGraphic( aGraphic );
1314                         pGraphic->SetUserData( aUserData );
1315 
1316                         // #142146# Graphic successfully swapped in.
1317                         pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1318                     }
1319                     delete pFilterData;
1320 
1321                     pStream->ResetError();
1322 
1323                     if( aStreamInfo.mbDeleteAfterUse || aStreamInfo.mxStorageRef.is() )
1324                     {
1325                         if ( aStreamInfo.mxStorageRef.is() )
1326                         {
1327                             aStreamInfo.mxStorageRef->dispose();
1328                             aStreamInfo.mxStorageRef = 0;
1329                         }
1330 
1331                         delete pStream;
1332                     }
1333                 }
1334 			}
1335 			else if( !ImpUpdateGraphicLink( sal_False ) )
1336             {
1337 				pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1338             }
1339 			else
1340             {
1341                 pRet = GRFMGR_AUTOSWAPSTREAM_LOADED;
1342             }
1343 		}
1344 		else
1345 			pRet = GRFMGR_AUTOSWAPSTREAM_TEMP;
1346 	}
1347 
1348 	return (long)(void*) pRet;
1349 }
1350 
1351 // -----------------------------------------------------------------------------
1352 
1353 // #111096#
1354 // Access to GrafAnimationAllowed flag
1355 sal_Bool SdrGrafObj::IsGrafAnimationAllowed() const
1356 {
1357 	return mbGrafAnimationAllowed;
1358 }
1359 
1360 void SdrGrafObj::SetGrafAnimationAllowed(sal_Bool bNew)
1361 {
1362 	if(mbGrafAnimationAllowed != bNew)
1363 	{
1364 		mbGrafAnimationAllowed = bNew;
1365 		ActionChanged();
1366 	}
1367 }
1368 
1369 // #i25616#
1370 sal_Bool SdrGrafObj::IsObjectTransparent() const
1371 {
1372 	if(((const SdrGrafTransparenceItem&)GetObjectItem(SDRATTR_GRAFTRANSPARENCE)).GetValue()
1373 		|| pGraphic->IsTransparent())
1374 	{
1375 		return sal_True;
1376 	}
1377 
1378 	return sal_False;
1379 }
1380 
1381 Reference< XInputStream > SdrGrafObj::getInputStream()
1382 {
1383 	Reference< XInputStream > xStream;
1384 
1385 	if( pModel )
1386 	{
1387 //		if( !pGraphic->HasUserData() )
1388 //			pGraphic->SwapOut();
1389 
1390 		// kann aus dem original Doc-Stream nachgeladen werden...
1391 		if( pGraphic->HasUserData() )
1392 		{
1393 			SdrDocumentStreamInfo aStreamInfo;
1394 
1395 			aStreamInfo.mbDeleteAfterUse = sal_False;
1396 			aStreamInfo.maUserData = pGraphic->GetUserData();
1397 
1398 			SvStream* pStream = pModel->GetDocumentStream( aStreamInfo );
1399 
1400 			if( pStream )
1401 				xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1402 		}
1403 		else if( pGraphic && GetGraphic().IsLink() )
1404 		{
1405 			Graphic aGraphic( GetGraphic() );
1406 			GfxLink aLink( aGraphic.GetLink() );
1407 			sal_uInt32 nSize = aLink.GetDataSize();
1408 			const void* pSourceData = (const void*)aLink.GetData();
1409 			if( nSize && pSourceData )
1410 			{
1411 				sal_uInt8 * pBuffer = new sal_uInt8[ nSize ];
1412 				if( pBuffer )
1413 				{
1414 					memcpy( pBuffer, pSourceData, nSize );
1415 
1416 					SvMemoryStream* pStream = new SvMemoryStream( (void*)pBuffer, (sal_Size)nSize, STREAM_READ );
1417 					pStream->ObjectOwnsMemory( sal_True );
1418 					xStream.set( new utl::OInputStreamWrapper( pStream, sal_True ) );
1419 				}
1420 			}
1421 		}
1422 
1423 		if( !xStream.is() && aFileName.Len() )
1424 		{
1425 			SvFileStream* pStream = new SvFileStream( aFileName, STREAM_READ );
1426 			if( pStream )
1427 				xStream.set( new utl::OInputStreamWrapper( pStream ) );
1428 		}
1429 	}
1430 
1431 	return xStream;
1432 }
1433 
1434 // eof
1435