xref: /trunk/main/svtools/source/graphic/grfmgr.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15900e8ecSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35900e8ecSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45900e8ecSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55900e8ecSAndrew Rist  * distributed with this work for additional information
65900e8ecSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75900e8ecSAndrew Rist  * to you under the Apache License, Version 2.0 (the
85900e8ecSAndrew Rist  * "License"); you may not use this file except in compliance
95900e8ecSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135900e8ecSAndrew Rist  * Unless required by applicable law or agreed to in writing,
145900e8ecSAndrew Rist  * software distributed under the License is distributed on an
155900e8ecSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165900e8ecSAndrew Rist  * KIND, either express or implied.  See the License for the
175900e8ecSAndrew Rist  * specific language governing permissions and limitations
185900e8ecSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205900e8ecSAndrew Rist  *************************************************************/
215900e8ecSAndrew Rist 
225900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svtools.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define ENABLE_BYTESTRING_STREAM_OPERATORS
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <algorithm>
30cdf0e10cSrcweir 
31*089177b8SArrigo Marchiori #include <com/sun/star/uno/Reference.hxx>
32*089177b8SArrigo Marchiori #include <com/sun/star/document/XLinkAuthorizer.hpp>
33*089177b8SArrigo Marchiori #include <com/sun/star/frame/XDesktop.hpp>
34*089177b8SArrigo Marchiori #include <com/sun/star/lang/XMultiServiceFactory.hpp>
35cdf0e10cSrcweir #include <tools/vcompat.hxx>
36*089177b8SArrigo Marchiori #include <ucbhelper/contentbroker.hxx>
37cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
38cdf0e10cSrcweir #include <unotools/localfilehelper.hxx>
39cdf0e10cSrcweir #include <unotools/tempfile.hxx>
40cdf0e10cSrcweir #include <vcl/svapp.hxx>
41cdf0e10cSrcweir #include <vcl/cvtgrf.hxx>
42cdf0e10cSrcweir #include <vcl/metaact.hxx>
43cdf0e10cSrcweir #include <vcl/virdev.hxx>
44cdf0e10cSrcweir #include <vcl/salbtype.hxx>
45cdf0e10cSrcweir #include <unotools/cacheoptions.hxx>
46cdf0e10cSrcweir #include <svtools/grfmgr.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir // --> OD 2010-01-04 #i105243#
49cdf0e10cSrcweir #include <vcl/pdfextoutdevdata.hxx>
50cdf0e10cSrcweir // <--
51cdf0e10cSrcweir 
52*089177b8SArrigo Marchiori using namespace ::com::sun::star;
53*089177b8SArrigo Marchiori 
54cdf0e10cSrcweir // -----------
55cdf0e10cSrcweir // - Defines -
56cdf0e10cSrcweir // -----------
57cdf0e10cSrcweir 
58cdf0e10cSrcweir #define WATERMARK_LUM_OFFSET                50
59cdf0e10cSrcweir #define WATERMARK_CON_OFFSET                -70
60cdf0e10cSrcweir 
61cdf0e10cSrcweir // -----------
62cdf0e10cSrcweir // - statics -
63cdf0e10cSrcweir // -----------
64cdf0e10cSrcweir 
65cdf0e10cSrcweir GraphicManager* GraphicObject::mpGlobalMgr = NULL;
66cdf0e10cSrcweir 
67cdf0e10cSrcweir // ---------------------
68cdf0e10cSrcweir // - GrfDirectCacheObj -
69cdf0e10cSrcweir // ---------------------
70cdf0e10cSrcweir 
71cdf0e10cSrcweir struct GrfSimpleCacheObj
72cdf0e10cSrcweir {
73cdf0e10cSrcweir     Graphic     maGraphic;
74cdf0e10cSrcweir     GraphicAttr maAttr;
75cdf0e10cSrcweir 
GrfSimpleCacheObjGrfSimpleCacheObj76cdf0e10cSrcweir                 GrfSimpleCacheObj( const Graphic& rGraphic, const GraphicAttr& rAttr ) :
77cdf0e10cSrcweir                     maGraphic( rGraphic ), maAttr( rAttr ) {}
78cdf0e10cSrcweir };
79cdf0e10cSrcweir 
80cdf0e10cSrcweir // -----------------
81cdf0e10cSrcweir // - GraphicObject -
82cdf0e10cSrcweir // -----------------
83cdf0e10cSrcweir 
84cdf0e10cSrcweir TYPEINIT1_AUTOFACTORY( GraphicObject, SvDataCopyStream );
85cdf0e10cSrcweir 
863e526e08SArmin Le Grand // unique increasing ID for being able to detect the GraphicObject with the
873e526e08SArmin Le Grand // oldest last data changes
883e526e08SArmin Le Grand static sal_uLong aIncrementingTimeOfLastDataChange = 1;
893e526e08SArmin Le Grand 
ImplAfterDataChange()903e526e08SArmin Le Grand void GraphicObject::ImplAfterDataChange()
913e526e08SArmin Le Grand {
923e526e08SArmin Le Grand     // set unique timestamp ID of last data change
933e526e08SArmin Le Grand     mnDataChangeTimeStamp = aIncrementingTimeOfLastDataChange++;
943e526e08SArmin Le Grand 
953e526e08SArmin Le Grand     // check memory footprint of all GraphicObjects managed and evtl. take action
963e526e08SArmin Le Grand     GetGraphicManager().ImplCheckSizeOfSwappedInGraphics();
973e526e08SArmin Le Grand }
983e526e08SArmin Le Grand 
99cdf0e10cSrcweir // -----------------------------------------------------------------------------
100cdf0e10cSrcweir 
GraphicObject(const GraphicManager * pMgr)101cdf0e10cSrcweir GraphicObject::GraphicObject( const GraphicManager* pMgr ) :
102cdf0e10cSrcweir     mpLink      ( NULL ),
103cdf0e10cSrcweir     mpUserData  ( NULL )
104cdf0e10cSrcweir {
105cdf0e10cSrcweir     ImplConstruct();
106cdf0e10cSrcweir     ImplAssignGraphicData();
107cdf0e10cSrcweir     ImplSetGraphicManager( pMgr );
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir // -----------------------------------------------------------------------------
111cdf0e10cSrcweir 
GraphicObject(const Graphic & rGraphic,const GraphicManager * pMgr)112cdf0e10cSrcweir GraphicObject::GraphicObject( const Graphic& rGraphic, const GraphicManager* pMgr ) :
113cdf0e10cSrcweir     maGraphic   ( rGraphic ),
114cdf0e10cSrcweir     mpLink      ( NULL ),
115cdf0e10cSrcweir     mpUserData  ( NULL )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir     ImplConstruct();
118cdf0e10cSrcweir     ImplAssignGraphicData();
119cdf0e10cSrcweir     ImplSetGraphicManager( pMgr );
120cdf0e10cSrcweir }
121cdf0e10cSrcweir 
122cdf0e10cSrcweir // -----------------------------------------------------------------------------
123cdf0e10cSrcweir 
GraphicObject(const Graphic & rGraphic,const String & rLink,const GraphicManager * pMgr)124cdf0e10cSrcweir GraphicObject::GraphicObject( const Graphic& rGraphic, const String& rLink, const GraphicManager* pMgr ) :
125cdf0e10cSrcweir     maGraphic   ( rGraphic ),
126cdf0e10cSrcweir     mpLink      ( rLink.Len() ? ( new String( rLink ) ) : NULL ),
127cdf0e10cSrcweir     mpUserData  ( NULL )
128cdf0e10cSrcweir {
129cdf0e10cSrcweir     ImplConstruct();
130cdf0e10cSrcweir     ImplAssignGraphicData();
131cdf0e10cSrcweir     ImplSetGraphicManager( pMgr );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir // -----------------------------------------------------------------------------
135cdf0e10cSrcweir 
GraphicObject(const GraphicObject & rGraphicObj,const GraphicManager * pMgr)136cdf0e10cSrcweir GraphicObject::GraphicObject( const GraphicObject& rGraphicObj, const GraphicManager* pMgr ) :
137cdf0e10cSrcweir     SvDataCopyStream(),
138cdf0e10cSrcweir     maGraphic   ( rGraphicObj.GetGraphic() ),
139cdf0e10cSrcweir     maAttr      ( rGraphicObj.maAttr ),
140cdf0e10cSrcweir     mpLink      ( rGraphicObj.mpLink ? ( new String( *rGraphicObj.mpLink ) ) : NULL ),
141cdf0e10cSrcweir     mpUserData  ( rGraphicObj.mpUserData ? ( new String( *rGraphicObj.mpUserData ) ) : NULL )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir     ImplConstruct();
144cdf0e10cSrcweir     ImplAssignGraphicData();
145cdf0e10cSrcweir     ImplSetGraphicManager( pMgr, NULL, &rGraphicObj );
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // -----------------------------------------------------------------------------
149cdf0e10cSrcweir 
GraphicObject(const ByteString & rUniqueID,const GraphicManager * pMgr)150cdf0e10cSrcweir GraphicObject::GraphicObject( const ByteString& rUniqueID, const GraphicManager* pMgr ) :
151cdf0e10cSrcweir     mpLink      ( NULL ),
152cdf0e10cSrcweir     mpUserData  ( NULL )
153cdf0e10cSrcweir {
154cdf0e10cSrcweir     ImplConstruct();
155cdf0e10cSrcweir 
156cdf0e10cSrcweir     // assign default properties
157cdf0e10cSrcweir     ImplAssignGraphicData();
158cdf0e10cSrcweir 
159cdf0e10cSrcweir     ImplSetGraphicManager( pMgr, &rUniqueID );
160cdf0e10cSrcweir 
161cdf0e10cSrcweir     // update properties
162cdf0e10cSrcweir     ImplAssignGraphicData();
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir // -----------------------------------------------------------------------------
166cdf0e10cSrcweir 
~GraphicObject()167cdf0e10cSrcweir GraphicObject::~GraphicObject()
168cdf0e10cSrcweir {
169cdf0e10cSrcweir     if( mpMgr )
170cdf0e10cSrcweir     {
171cdf0e10cSrcweir         mpMgr->ImplUnregisterObj( *this );
172cdf0e10cSrcweir 
173cdf0e10cSrcweir         if( ( mpMgr == mpGlobalMgr ) && !mpGlobalMgr->ImplHasObjects() )
174cdf0e10cSrcweir             delete mpGlobalMgr, mpGlobalMgr = NULL;
175cdf0e10cSrcweir     }
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     delete mpSwapOutTimer;
178cdf0e10cSrcweir     delete mpSwapStreamHdl;
179cdf0e10cSrcweir     delete mpLink;
180cdf0e10cSrcweir     delete mpUserData;
181cdf0e10cSrcweir     delete mpSimpleCache;
182cdf0e10cSrcweir }
183cdf0e10cSrcweir 
184cdf0e10cSrcweir // -----------------------------------------------------------------------------
185cdf0e10cSrcweir 
ImplConstruct()186cdf0e10cSrcweir void GraphicObject::ImplConstruct()
187cdf0e10cSrcweir {
188cdf0e10cSrcweir     mpMgr = NULL;
189cdf0e10cSrcweir     mpSwapStreamHdl = NULL;
190cdf0e10cSrcweir     mpSwapOutTimer = NULL;
191cdf0e10cSrcweir     mpSimpleCache = NULL;
192cdf0e10cSrcweir     mnAnimationLoopCount = 0;
193cdf0e10cSrcweir     mbAutoSwapped = sal_False;
194cdf0e10cSrcweir     mbIsInSwapIn = sal_False;
195cdf0e10cSrcweir     mbIsInSwapOut = sal_False;
1963e526e08SArmin Le Grand 
1973e526e08SArmin Le Grand     // Init with a unique, increasing ID
1983e526e08SArmin Le Grand     mnDataChangeTimeStamp = aIncrementingTimeOfLastDataChange++;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
201cdf0e10cSrcweir // -----------------------------------------------------------------------------
202cdf0e10cSrcweir 
ImplAssignGraphicData()203cdf0e10cSrcweir void GraphicObject::ImplAssignGraphicData()
204cdf0e10cSrcweir {
205cdf0e10cSrcweir     maPrefSize = maGraphic.GetPrefSize();
206cdf0e10cSrcweir     maPrefMapMode = maGraphic.GetPrefMapMode();
207cdf0e10cSrcweir     mnSizeBytes = maGraphic.GetSizeBytes();
208cdf0e10cSrcweir     meType = maGraphic.GetType();
209cdf0e10cSrcweir     mbTransparent = maGraphic.IsTransparent();
210cdf0e10cSrcweir     mbAlpha = maGraphic.IsAlpha();
211cdf0e10cSrcweir     mbAnimated = maGraphic.IsAnimated();
212cdf0e10cSrcweir     mbEPS = maGraphic.IsEPS();
213cdf0e10cSrcweir     mnAnimationLoopCount = ( mbAnimated ? maGraphic.GetAnimationLoopCount() : 0 );
214cdf0e10cSrcweir }
215cdf0e10cSrcweir 
216cdf0e10cSrcweir // -----------------------------------------------------------------------------
217cdf0e10cSrcweir 
ImplSetGraphicManager(const GraphicManager * pMgr,const ByteString * pID,const GraphicObject * pCopyObj)218cdf0e10cSrcweir void GraphicObject::ImplSetGraphicManager( const GraphicManager* pMgr, const ByteString* pID, const GraphicObject* pCopyObj )
219cdf0e10cSrcweir {
220cdf0e10cSrcweir     if( !mpMgr || ( pMgr != mpMgr ) )
221cdf0e10cSrcweir     {
222cdf0e10cSrcweir         if( !pMgr && mpMgr && ( mpMgr == mpGlobalMgr ) )
223cdf0e10cSrcweir             return;
224cdf0e10cSrcweir         else
225cdf0e10cSrcweir         {
226cdf0e10cSrcweir             if( mpMgr )
227cdf0e10cSrcweir             {
228cdf0e10cSrcweir                 mpMgr->ImplUnregisterObj( *this );
229cdf0e10cSrcweir 
230cdf0e10cSrcweir                 if( ( mpMgr == mpGlobalMgr ) && !mpGlobalMgr->ImplHasObjects() )
231cdf0e10cSrcweir                     delete mpGlobalMgr, mpGlobalMgr = NULL;
232cdf0e10cSrcweir             }
233cdf0e10cSrcweir 
234cdf0e10cSrcweir             if( !pMgr )
235cdf0e10cSrcweir             {
236cdf0e10cSrcweir                 if( !mpGlobalMgr )
237cdf0e10cSrcweir                 {
238cdf0e10cSrcweir                     SvtCacheOptions aCacheOptions;
239cdf0e10cSrcweir 
240cdf0e10cSrcweir                     mpGlobalMgr = new GraphicManager( aCacheOptions.GetGraphicManagerTotalCacheSize(),
241cdf0e10cSrcweir                                                       aCacheOptions.GetGraphicManagerObjectCacheSize() );
242cdf0e10cSrcweir                     mpGlobalMgr->SetCacheTimeout( aCacheOptions.GetGraphicManagerObjectReleaseTime() );
243cdf0e10cSrcweir                 }
244cdf0e10cSrcweir 
245cdf0e10cSrcweir                 mpMgr = mpGlobalMgr;
246cdf0e10cSrcweir             }
247cdf0e10cSrcweir             else
248cdf0e10cSrcweir                 mpMgr = (GraphicManager*) pMgr;
249cdf0e10cSrcweir 
250cdf0e10cSrcweir             mpMgr->ImplRegisterObj( *this, maGraphic, pID, pCopyObj );
251cdf0e10cSrcweir         }
252cdf0e10cSrcweir     }
253cdf0e10cSrcweir }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir // -----------------------------------------------------------------------------
256cdf0e10cSrcweir 
ImplAutoSwapIn()257cdf0e10cSrcweir void GraphicObject::ImplAutoSwapIn()
258cdf0e10cSrcweir {
259cdf0e10cSrcweir     if( IsSwappedOut() )
260cdf0e10cSrcweir     {
261cdf0e10cSrcweir         if( mpMgr && mpMgr->ImplFillSwappedGraphicObject( *this, maGraphic ) )
262cdf0e10cSrcweir             mbAutoSwapped = sal_False;
263cdf0e10cSrcweir         else
264cdf0e10cSrcweir         {
265cdf0e10cSrcweir             mbIsInSwapIn = sal_True;
266cdf0e10cSrcweir 
267cdf0e10cSrcweir             if( maGraphic.SwapIn() )
268cdf0e10cSrcweir                 mbAutoSwapped = sal_False;
269cdf0e10cSrcweir             else
270cdf0e10cSrcweir             {
271cdf0e10cSrcweir                 SvStream* pStream = GetSwapStream();
272cdf0e10cSrcweir 
273cdf0e10cSrcweir                 if( GRFMGR_AUTOSWAPSTREAM_NONE != pStream )
274cdf0e10cSrcweir                 {
275cdf0e10cSrcweir                     if( GRFMGR_AUTOSWAPSTREAM_LINK == pStream )
276cdf0e10cSrcweir                     {
277cdf0e10cSrcweir                         if( HasLink() )
278cdf0e10cSrcweir                         {
279cdf0e10cSrcweir                             String aURLStr;
280cdf0e10cSrcweir 
281cdf0e10cSrcweir                             if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( GetLink(), aURLStr ) )
282cdf0e10cSrcweir                             {
283cdf0e10cSrcweir                                 SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aURLStr, STREAM_READ );
284cdf0e10cSrcweir 
285cdf0e10cSrcweir                                 if( pIStm )
286cdf0e10cSrcweir                                 {
287cdf0e10cSrcweir                                     (*pIStm) >> maGraphic;
288cdf0e10cSrcweir                                     mbAutoSwapped = ( maGraphic.GetType() != GRAPHIC_NONE );
289cdf0e10cSrcweir                                     delete pIStm;
290cdf0e10cSrcweir                                 }
291cdf0e10cSrcweir                             }
292cdf0e10cSrcweir                         }
293cdf0e10cSrcweir                     }
294cdf0e10cSrcweir                     else if( GRFMGR_AUTOSWAPSTREAM_TEMP == pStream )
295cdf0e10cSrcweir                         mbAutoSwapped = !maGraphic.SwapIn();
296cdf0e10cSrcweir                     else if( GRFMGR_AUTOSWAPSTREAM_LOADED == pStream )
297cdf0e10cSrcweir                         mbAutoSwapped = maGraphic.IsSwapOut();
298cdf0e10cSrcweir                     else
299cdf0e10cSrcweir                     {
300cdf0e10cSrcweir                         mbAutoSwapped = !maGraphic.SwapIn( pStream );
301cdf0e10cSrcweir                         delete pStream;
302cdf0e10cSrcweir                     }
303cdf0e10cSrcweir                 }
304cdf0e10cSrcweir                 else
305cdf0e10cSrcweir                 {
306cdf0e10cSrcweir                     DBG_ASSERT( ( GRAPHIC_NONE == meType ) || ( GRAPHIC_DEFAULT == meType ),
307cdf0e10cSrcweir                                 "GraphicObject::ImplAutoSwapIn: could not get stream to swap in graphic! (=>KA)" );
308cdf0e10cSrcweir                 }
309cdf0e10cSrcweir             }
310cdf0e10cSrcweir 
311cdf0e10cSrcweir             mbIsInSwapIn = sal_False;
312cdf0e10cSrcweir 
313cdf0e10cSrcweir             if( !mbAutoSwapped && mpMgr )
314cdf0e10cSrcweir                 mpMgr->ImplGraphicObjectWasSwappedIn( *this );
315cdf0e10cSrcweir         }
3163e526e08SArmin Le Grand 
3173e526e08SArmin Le Grand         // Handle evtl. needed AfterDataChanges
3183e526e08SArmin Le Grand         ImplAfterDataChange();
319cdf0e10cSrcweir     }
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir // -----------------------------------------------------------------------------
ImplGetCropParams(OutputDevice * pOut,Point & rPt,Size & rSz,const GraphicAttr * pAttr,PolyPolygon & rClipPolyPoly,sal_Bool & bRectClipRegion) const323cdf0e10cSrcweir sal_Bool GraphicObject::ImplGetCropParams( OutputDevice* pOut, Point& rPt, Size& rSz, const GraphicAttr* pAttr,
324cdf0e10cSrcweir                                        PolyPolygon& rClipPolyPoly, sal_Bool& bRectClipRegion ) const
325cdf0e10cSrcweir {
326cdf0e10cSrcweir     sal_Bool bRet = sal_False;
327cdf0e10cSrcweir 
328cdf0e10cSrcweir     if( GetType() != GRAPHIC_NONE )
329cdf0e10cSrcweir     {
330cdf0e10cSrcweir         Polygon         aClipPoly( Rectangle( rPt, rSz ) );
331cdf0e10cSrcweir         const sal_uInt16    nRot10 = pAttr->GetRotation() % 3600;
332cdf0e10cSrcweir         const Point     aOldOrigin( rPt );
333cdf0e10cSrcweir         // --> OD 2005-09-30 #i54875# - It's not needed to get the graphic again.
334cdf0e10cSrcweir //        const Graphic&  rGraphic = GetGraphic();
335cdf0e10cSrcweir         // <--
336cdf0e10cSrcweir         const MapMode   aMap100( MAP_100TH_MM );
337cdf0e10cSrcweir         Size            aSize100;
338cdf0e10cSrcweir         long            nTotalWidth, nTotalHeight;
339cdf0e10cSrcweir         long            nNewLeft, nNewTop, nNewRight, nNewBottom;
340cdf0e10cSrcweir         double          fScale;
341cdf0e10cSrcweir 
342cdf0e10cSrcweir         if( nRot10 )
343cdf0e10cSrcweir         {
344cdf0e10cSrcweir             aClipPoly.Rotate( rPt, nRot10 );
345cdf0e10cSrcweir             bRectClipRegion = sal_False;
346cdf0e10cSrcweir         }
347cdf0e10cSrcweir         else
348cdf0e10cSrcweir             bRectClipRegion = sal_True;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir         rClipPolyPoly = aClipPoly;
351cdf0e10cSrcweir 
352cdf0e10cSrcweir         // --> OD 2005-09-30 #i54875# - directly access member <maGraphic> to
353cdf0e10cSrcweir         // get <PrefSize> and <PrefMapMode>.
354cdf0e10cSrcweir //        if( rGraphic.GetPrefMapMode() == MAP_PIXEL )
355cdf0e10cSrcweir //            aSize100 = Application::GetDefaultDevice()->PixelToLogic( rGraphic.GetPrefSize(), aMap100 );
356cdf0e10cSrcweir //        else
357cdf0e10cSrcweir //            aSize100 = pOut->LogicToLogic( rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode(), aMap100 );
358cdf0e10cSrcweir         if( maGraphic.GetPrefMapMode() == MAP_PIXEL )
359cdf0e10cSrcweir             aSize100 = Application::GetDefaultDevice()->PixelToLogic( maGraphic.GetPrefSize(), aMap100 );
360cdf0e10cSrcweir         else
361cdf0e10cSrcweir         {
362cdf0e10cSrcweir             MapMode m(maGraphic.GetPrefMapMode());
363cdf0e10cSrcweir             aSize100 = pOut->LogicToLogic( maGraphic.GetPrefSize(), &m, &aMap100 );
364cdf0e10cSrcweir         }
365cdf0e10cSrcweir         // <--
366cdf0e10cSrcweir 
367cdf0e10cSrcweir         nTotalWidth = aSize100.Width() - pAttr->GetLeftCrop() - pAttr->GetRightCrop();
368cdf0e10cSrcweir         nTotalHeight = aSize100.Height() - pAttr->GetTopCrop() - pAttr->GetBottomCrop();
369cdf0e10cSrcweir 
370cdf0e10cSrcweir         if( aSize100.Width() > 0 && aSize100.Height() > 0 && nTotalWidth > 0 && nTotalHeight > 0 )
371cdf0e10cSrcweir         {
372cdf0e10cSrcweir             fScale = (double) aSize100.Width() / nTotalWidth;
373cdf0e10cSrcweir             nNewLeft = -FRound( ( ( pAttr->GetMirrorFlags() & BMP_MIRROR_HORZ ) ? pAttr->GetRightCrop() : pAttr->GetLeftCrop() ) * fScale );
374cdf0e10cSrcweir             nNewRight = nNewLeft + FRound( aSize100.Width() * fScale ) - 1;
375cdf0e10cSrcweir 
376cdf0e10cSrcweir             fScale = (double) rSz.Width() / aSize100.Width();
377cdf0e10cSrcweir             rPt.X() += FRound( nNewLeft * fScale );
378cdf0e10cSrcweir             rSz.Width() = FRound( ( nNewRight - nNewLeft + 1 ) * fScale );
379cdf0e10cSrcweir 
380cdf0e10cSrcweir             fScale = (double) aSize100.Height() / nTotalHeight;
381cdf0e10cSrcweir             nNewTop = -FRound( ( ( pAttr->GetMirrorFlags() & BMP_MIRROR_VERT ) ? pAttr->GetBottomCrop() : pAttr->GetTopCrop() ) * fScale );
382cdf0e10cSrcweir             nNewBottom = nNewTop + FRound( aSize100.Height() * fScale ) - 1;
383cdf0e10cSrcweir 
384cdf0e10cSrcweir             fScale = (double) rSz.Height() / aSize100.Height();
385cdf0e10cSrcweir             rPt.Y() += FRound( nNewTop * fScale );
386cdf0e10cSrcweir             rSz.Height() = FRound( ( nNewBottom - nNewTop + 1 ) * fScale );
387cdf0e10cSrcweir 
388cdf0e10cSrcweir             if( nRot10 )
389cdf0e10cSrcweir             {
390cdf0e10cSrcweir                 Polygon aOriginPoly( 1 );
391cdf0e10cSrcweir 
392cdf0e10cSrcweir                 aOriginPoly[ 0 ] = rPt;
393cdf0e10cSrcweir                 aOriginPoly.Rotate( aOldOrigin, nRot10 );
394cdf0e10cSrcweir                 rPt = aOriginPoly[ 0 ];
395cdf0e10cSrcweir             }
396cdf0e10cSrcweir 
397cdf0e10cSrcweir             bRet = sal_True;
398cdf0e10cSrcweir         }
399cdf0e10cSrcweir     }
400cdf0e10cSrcweir 
401cdf0e10cSrcweir     return bRet;
402cdf0e10cSrcweir }
403cdf0e10cSrcweir 
404cdf0e10cSrcweir // -----------------------------------------------------------------------------
405cdf0e10cSrcweir 
operator =(const GraphicObject & rGraphicObj)406cdf0e10cSrcweir GraphicObject& GraphicObject::operator=( const GraphicObject& rGraphicObj )
407cdf0e10cSrcweir {
408cdf0e10cSrcweir     if( &rGraphicObj != this )
409cdf0e10cSrcweir     {
410cdf0e10cSrcweir         mpMgr->ImplUnregisterObj( *this );
411cdf0e10cSrcweir 
412cdf0e10cSrcweir         delete mpSwapStreamHdl, mpSwapStreamHdl = NULL;
413cdf0e10cSrcweir         delete mpSimpleCache, mpSimpleCache = NULL;
414cdf0e10cSrcweir         delete mpLink;
415cdf0e10cSrcweir         delete mpUserData;
416cdf0e10cSrcweir 
417cdf0e10cSrcweir         maGraphic = rGraphicObj.GetGraphic();
418cdf0e10cSrcweir         maAttr = rGraphicObj.maAttr;
419cdf0e10cSrcweir         mpLink = rGraphicObj.mpLink ? new String( *rGraphicObj.mpLink ) : NULL;
420cdf0e10cSrcweir         mpUserData = rGraphicObj.mpUserData ? new String( *rGraphicObj.mpUserData ) : NULL;
421cdf0e10cSrcweir         ImplAssignGraphicData();
422cdf0e10cSrcweir         mbAutoSwapped = sal_False;
423cdf0e10cSrcweir         mpMgr = rGraphicObj.mpMgr;
424cdf0e10cSrcweir 
425cdf0e10cSrcweir         mpMgr->ImplRegisterObj( *this, maGraphic, NULL, &rGraphicObj );
426cdf0e10cSrcweir     }
427cdf0e10cSrcweir 
428cdf0e10cSrcweir     return *this;
429cdf0e10cSrcweir }
430cdf0e10cSrcweir 
431cdf0e10cSrcweir // -----------------------------------------------------------------------------
432cdf0e10cSrcweir 
operator ==(const GraphicObject & rGraphicObj) const433cdf0e10cSrcweir sal_Bool GraphicObject::operator==( const GraphicObject& rGraphicObj ) const
434cdf0e10cSrcweir {
435cdf0e10cSrcweir     return( ( rGraphicObj.maGraphic == maGraphic ) &&
436cdf0e10cSrcweir             ( rGraphicObj.maAttr == maAttr ) &&
437cdf0e10cSrcweir             ( rGraphicObj.GetLink() == GetLink() ) );
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir // ------------------------------------------------------------------------
441cdf0e10cSrcweir 
Load(SvStream & rIStm)442cdf0e10cSrcweir void GraphicObject::Load( SvStream& rIStm )
443cdf0e10cSrcweir {
444cdf0e10cSrcweir     rIStm >> *this;
445cdf0e10cSrcweir }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir // ------------------------------------------------------------------------
448cdf0e10cSrcweir 
Save(SvStream & rOStm)449cdf0e10cSrcweir void GraphicObject::Save( SvStream& rOStm )
450cdf0e10cSrcweir {
451cdf0e10cSrcweir     rOStm << *this;
452cdf0e10cSrcweir }
453cdf0e10cSrcweir 
454cdf0e10cSrcweir // ------------------------------------------------------------------------
455cdf0e10cSrcweir 
Assign(const SvDataCopyStream & rCopyStream)456cdf0e10cSrcweir void GraphicObject::Assign( const SvDataCopyStream& rCopyStream )
457cdf0e10cSrcweir {
458cdf0e10cSrcweir     *this = (const GraphicObject& ) rCopyStream;
459cdf0e10cSrcweir }
460cdf0e10cSrcweir 
461cdf0e10cSrcweir // -----------------------------------------------------------------------------
462cdf0e10cSrcweir 
GetUniqueID() const463cdf0e10cSrcweir ByteString GraphicObject::GetUniqueID() const
464cdf0e10cSrcweir {
465ddde725dSArmin Le Grand     if ( !IsInSwapIn() && IsEPS() )
466cdf0e10cSrcweir         const_cast<GraphicObject*>(this)->FireSwapInRequest();
467cdf0e10cSrcweir 
468cdf0e10cSrcweir     ByteString aRet;
469cdf0e10cSrcweir 
470cdf0e10cSrcweir     if( mpMgr )
471cdf0e10cSrcweir         aRet = mpMgr->ImplGetUniqueID( *this );
472cdf0e10cSrcweir 
473cdf0e10cSrcweir     return aRet;
474cdf0e10cSrcweir }
475cdf0e10cSrcweir 
476cdf0e10cSrcweir // -----------------------------------------------------------------------------
477cdf0e10cSrcweir 
GetChecksum() const478cdf0e10cSrcweir sal_uLong GraphicObject::GetChecksum() const
479cdf0e10cSrcweir {
480cdf0e10cSrcweir     return( ( maGraphic.IsSupportedGraphic() && !maGraphic.IsSwapOut() ) ? maGraphic.GetChecksum() : 0 );
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir // -----------------------------------------------------------------------------
484cdf0e10cSrcweir 
GetSwapStream() const485cdf0e10cSrcweir SvStream* GraphicObject::GetSwapStream() const
486cdf0e10cSrcweir {
487cdf0e10cSrcweir     return( HasSwapStreamHdl() ? (SvStream*) mpSwapStreamHdl->Call( (void*) this ) : GRFMGR_AUTOSWAPSTREAM_NONE );
488cdf0e10cSrcweir }
489cdf0e10cSrcweir 
490cdf0e10cSrcweir // -----------------------------------------------------------------------------
491cdf0e10cSrcweir 
492cdf0e10cSrcweir // !!! to be removed
GetReleaseFromCache() const493cdf0e10cSrcweir sal_uLong GraphicObject::GetReleaseFromCache() const
494cdf0e10cSrcweir {
495cdf0e10cSrcweir     return 0;
496cdf0e10cSrcweir }
497cdf0e10cSrcweir 
498cdf0e10cSrcweir // -----------------------------------------------------------------------------
499cdf0e10cSrcweir 
SetAttr(const GraphicAttr & rAttr)500cdf0e10cSrcweir void GraphicObject::SetAttr( const GraphicAttr& rAttr )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir     maAttr = rAttr;
503cdf0e10cSrcweir 
504cdf0e10cSrcweir     if( mpSimpleCache && ( mpSimpleCache->maAttr != rAttr ) )
505cdf0e10cSrcweir         delete mpSimpleCache, mpSimpleCache = NULL;
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir // -----------------------------------------------------------------------------
509cdf0e10cSrcweir 
SetLink()510cdf0e10cSrcweir void GraphicObject::SetLink()
511cdf0e10cSrcweir {
512cdf0e10cSrcweir     if( mpLink )
513cdf0e10cSrcweir         delete mpLink, mpLink = NULL;
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir // -----------------------------------------------------------------------------
517cdf0e10cSrcweir 
SetLink(const String & rLink)518cdf0e10cSrcweir void GraphicObject::SetLink( const String& rLink )
519cdf0e10cSrcweir {
520cdf0e10cSrcweir     delete mpLink, mpLink = new String( rLink );
521cdf0e10cSrcweir }
522cdf0e10cSrcweir 
523cdf0e10cSrcweir // -----------------------------------------------------------------------------
524cdf0e10cSrcweir 
GetLink() const525cdf0e10cSrcweir String GraphicObject::GetLink() const
526cdf0e10cSrcweir {
527cdf0e10cSrcweir     if( mpLink )
528cdf0e10cSrcweir         return *mpLink;
529cdf0e10cSrcweir     else
530cdf0e10cSrcweir         return String();
531cdf0e10cSrcweir }
532cdf0e10cSrcweir 
533cdf0e10cSrcweir // -----------------------------------------------------------------------------
534cdf0e10cSrcweir 
SetUserData()535cdf0e10cSrcweir void GraphicObject::SetUserData()
536cdf0e10cSrcweir {
537cdf0e10cSrcweir     if( mpUserData )
538cdf0e10cSrcweir         delete mpUserData, mpUserData = NULL;
539cdf0e10cSrcweir }
540cdf0e10cSrcweir 
541cdf0e10cSrcweir // -----------------------------------------------------------------------------
542cdf0e10cSrcweir 
SetUserData(const String & rUserData)543cdf0e10cSrcweir void GraphicObject::SetUserData( const String& rUserData )
544cdf0e10cSrcweir {
545cdf0e10cSrcweir     delete mpUserData, mpUserData = new String( rUserData );
546cdf0e10cSrcweir }
547cdf0e10cSrcweir 
548cdf0e10cSrcweir // -----------------------------------------------------------------------------
549cdf0e10cSrcweir 
GetUserData() const550cdf0e10cSrcweir String GraphicObject::GetUserData() const
551cdf0e10cSrcweir {
552cdf0e10cSrcweir     if( mpUserData )
553cdf0e10cSrcweir         return *mpUserData;
554cdf0e10cSrcweir     else
555cdf0e10cSrcweir         return String();
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
558cdf0e10cSrcweir // -----------------------------------------------------------------------------
559cdf0e10cSrcweir 
SetSwapStreamHdl()560cdf0e10cSrcweir void GraphicObject::SetSwapStreamHdl()
561cdf0e10cSrcweir {
562cdf0e10cSrcweir     if( mpSwapStreamHdl )
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         delete mpSwapOutTimer, mpSwapOutTimer = NULL;
565cdf0e10cSrcweir         delete mpSwapStreamHdl, mpSwapStreamHdl = NULL;
566cdf0e10cSrcweir     }
567cdf0e10cSrcweir }
568cdf0e10cSrcweir 
569cdf0e10cSrcweir // -----------------------------------------------------------------------------
570cdf0e10cSrcweir 
SetSwapStreamHdl(const Link & rHdl,const sal_uLong nSwapOutTimeout)571cdf0e10cSrcweir void GraphicObject::SetSwapStreamHdl( const Link& rHdl, const sal_uLong nSwapOutTimeout )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir     delete mpSwapStreamHdl, mpSwapStreamHdl = new Link( rHdl );
574cdf0e10cSrcweir 
575cdf0e10cSrcweir     if( nSwapOutTimeout )
576cdf0e10cSrcweir     {
577cdf0e10cSrcweir         if( !mpSwapOutTimer )
578cdf0e10cSrcweir         {
579cdf0e10cSrcweir             mpSwapOutTimer = new Timer;
580cdf0e10cSrcweir             mpSwapOutTimer->SetTimeoutHdl( LINK( this, GraphicObject, ImplAutoSwapOutHdl ) );
581cdf0e10cSrcweir         }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir         mpSwapOutTimer->SetTimeout( nSwapOutTimeout );
584cdf0e10cSrcweir         mpSwapOutTimer->Start();
585cdf0e10cSrcweir     }
586cdf0e10cSrcweir     else
587cdf0e10cSrcweir         delete mpSwapOutTimer, mpSwapOutTimer = NULL;
588cdf0e10cSrcweir }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir // -----------------------------------------------------------------------------
591cdf0e10cSrcweir 
GetSwapStreamHdl() const592cdf0e10cSrcweir Link GraphicObject::GetSwapStreamHdl() const
593cdf0e10cSrcweir {
594cdf0e10cSrcweir     if( mpSwapStreamHdl )
595cdf0e10cSrcweir         return *mpSwapStreamHdl;
596cdf0e10cSrcweir     else
597cdf0e10cSrcweir         return Link();
598cdf0e10cSrcweir }
599cdf0e10cSrcweir 
600cdf0e10cSrcweir // -----------------------------------------------------------------------------
601cdf0e10cSrcweir 
FireSwapInRequest()602cdf0e10cSrcweir void GraphicObject::FireSwapInRequest()
603cdf0e10cSrcweir {
604cdf0e10cSrcweir     ImplAutoSwapIn();
605cdf0e10cSrcweir }
606cdf0e10cSrcweir 
607cdf0e10cSrcweir // -----------------------------------------------------------------------------
608cdf0e10cSrcweir 
FireSwapOutRequest()609cdf0e10cSrcweir void GraphicObject::FireSwapOutRequest()
610cdf0e10cSrcweir {
611cdf0e10cSrcweir     ImplAutoSwapOutHdl( NULL );
612cdf0e10cSrcweir }
613cdf0e10cSrcweir 
614cdf0e10cSrcweir // -----------------------------------------------------------------------------
615cdf0e10cSrcweir 
GraphicManagerDestroyed()616cdf0e10cSrcweir void GraphicObject::GraphicManagerDestroyed()
617cdf0e10cSrcweir {
618cdf0e10cSrcweir     // we're alive, but our manager doesn't live anymore ==> connect to default manager
619cdf0e10cSrcweir     mpMgr = NULL;
620cdf0e10cSrcweir     ImplSetGraphicManager( NULL );
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
623cdf0e10cSrcweir // -----------------------------------------------------------------------------
624cdf0e10cSrcweir 
SetGraphicManager(const GraphicManager & rMgr)625cdf0e10cSrcweir void GraphicObject::SetGraphicManager( const GraphicManager& rMgr )
626cdf0e10cSrcweir {
627cdf0e10cSrcweir     ImplSetGraphicManager( &rMgr );
628cdf0e10cSrcweir }
629cdf0e10cSrcweir 
630cdf0e10cSrcweir // -----------------------------------------------------------------------------
631cdf0e10cSrcweir 
IsCached(OutputDevice * pOut,const Point & rPt,const Size & rSz,const GraphicAttr * pAttr,sal_uLong nFlags) const632cdf0e10cSrcweir sal_Bool GraphicObject::IsCached( OutputDevice* pOut, const Point& rPt, const Size& rSz,
633cdf0e10cSrcweir                               const GraphicAttr* pAttr, sal_uLong nFlags ) const
634cdf0e10cSrcweir {
635cdf0e10cSrcweir     sal_Bool bRet;
636cdf0e10cSrcweir 
637cdf0e10cSrcweir     if( nFlags & GRFMGR_DRAW_CACHED )
638cdf0e10cSrcweir     {
639cdf0e10cSrcweir         // --> OD 2005-10-11 #i54875# - Consider cropped graphics.
640cdf0e10cSrcweir         // Note: The graphic manager caches a cropped graphic with its
641cdf0e10cSrcweir         //       uncropped position and size.
642cdf0e10cSrcweir //        bRet = mpMgr->IsInCache( pOut, rPt, rSz, *this, ( pAttr ? *pAttr : GetAttr() ) );
643cdf0e10cSrcweir         Point aPt( rPt );
644cdf0e10cSrcweir         Size aSz( rSz );
645cdf0e10cSrcweir         if ( pAttr->IsCropped() )
646cdf0e10cSrcweir         {
647cdf0e10cSrcweir             PolyPolygon aClipPolyPoly;
648cdf0e10cSrcweir             sal_Bool        bRectClip;
649cdf0e10cSrcweir             ImplGetCropParams( pOut, aPt, aSz, pAttr, aClipPolyPoly, bRectClip );
650cdf0e10cSrcweir         }
651cdf0e10cSrcweir         bRet = mpMgr->IsInCache( pOut, aPt, aSz, *this, ( pAttr ? *pAttr : GetAttr() ) );
652cdf0e10cSrcweir     }
653cdf0e10cSrcweir     else
654cdf0e10cSrcweir         bRet = sal_False;
655cdf0e10cSrcweir 
656cdf0e10cSrcweir     return bRet;
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir // -----------------------------------------------------------------------------
660cdf0e10cSrcweir 
ReleaseFromCache()661cdf0e10cSrcweir void GraphicObject::ReleaseFromCache()
662cdf0e10cSrcweir {
663cdf0e10cSrcweir 
664cdf0e10cSrcweir     mpMgr->ReleaseFromCache( *this );
665cdf0e10cSrcweir }
666cdf0e10cSrcweir 
667cdf0e10cSrcweir // -----------------------------------------------------------------------------
668cdf0e10cSrcweir 
SetAnimationNotifyHdl(const Link & rLink)669cdf0e10cSrcweir void GraphicObject::SetAnimationNotifyHdl( const Link& rLink )
670cdf0e10cSrcweir {
671cdf0e10cSrcweir     maGraphic.SetAnimationNotifyHdl( rLink );
672cdf0e10cSrcweir }
673cdf0e10cSrcweir 
674cdf0e10cSrcweir // -----------------------------------------------------------------------------
675cdf0e10cSrcweir 
GetAnimationInfoList() const676cdf0e10cSrcweir List* GraphicObject::GetAnimationInfoList() const
677cdf0e10cSrcweir {
678cdf0e10cSrcweir     return maGraphic.GetAnimationInfoList();
679cdf0e10cSrcweir }
680cdf0e10cSrcweir 
681cdf0e10cSrcweir // -----------------------------------------------------------------------------
682cdf0e10cSrcweir 
Draw(OutputDevice * pOut,const Point & rPt,const Size & rSz,const GraphicAttr * pAttr,sal_uLong nFlags)683cdf0e10cSrcweir sal_Bool GraphicObject::Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz,
684cdf0e10cSrcweir                           const GraphicAttr* pAttr, sal_uLong nFlags )
685cdf0e10cSrcweir {
686cdf0e10cSrcweir     GraphicAttr         aAttr( pAttr ? *pAttr : GetAttr() );
687cdf0e10cSrcweir     Point               aPt( rPt );
688cdf0e10cSrcweir     Size                aSz( rSz );
689cdf0e10cSrcweir     const sal_uInt32    nOldDrawMode = pOut->GetDrawMode();
690cdf0e10cSrcweir     sal_Bool                bCropped = aAttr.IsCropped();
691cdf0e10cSrcweir     sal_Bool                bCached = sal_False;
692cdf0e10cSrcweir     sal_Bool                bRet;
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     // #i29534# Provide output rects for PDF writer
695cdf0e10cSrcweir     Rectangle           aCropRect;
696cdf0e10cSrcweir 
697cdf0e10cSrcweir     if( !( GRFMGR_DRAW_USE_DRAWMODE_SETTINGS & nFlags ) )
698cdf0e10cSrcweir         pOut->SetDrawMode( nOldDrawMode & ( ~( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT ) ) );
699cdf0e10cSrcweir 
700cdf0e10cSrcweir     // mirrored horizontically
701cdf0e10cSrcweir     if( aSz.Width() < 0L )
702cdf0e10cSrcweir     {
703cdf0e10cSrcweir         aPt.X() += aSz.Width() + 1;
704cdf0e10cSrcweir         aSz.Width() = -aSz.Width();
705cdf0e10cSrcweir         aAttr.SetMirrorFlags( aAttr.GetMirrorFlags() ^ BMP_MIRROR_HORZ );
706cdf0e10cSrcweir     }
707cdf0e10cSrcweir 
708cdf0e10cSrcweir     // mirrored vertically
709cdf0e10cSrcweir     if( aSz.Height() < 0L )
710cdf0e10cSrcweir     {
711cdf0e10cSrcweir         aPt.Y() += aSz.Height() + 1;
712cdf0e10cSrcweir         aSz.Height() = -aSz.Height();
713cdf0e10cSrcweir         aAttr.SetMirrorFlags( aAttr.GetMirrorFlags() ^ BMP_MIRROR_VERT );
714cdf0e10cSrcweir     }
715cdf0e10cSrcweir 
716cdf0e10cSrcweir     if( bCropped )
717cdf0e10cSrcweir     {
718cdf0e10cSrcweir         PolyPolygon aClipPolyPoly;
719cdf0e10cSrcweir         sal_Bool        bRectClip;
720cdf0e10cSrcweir         const sal_Bool  bCrop = ImplGetCropParams( pOut, aPt, aSz, &aAttr, aClipPolyPoly, bRectClip );
721cdf0e10cSrcweir 
722cdf0e10cSrcweir         pOut->Push( PUSH_CLIPREGION );
723cdf0e10cSrcweir 
724cdf0e10cSrcweir         if( bCrop )
725cdf0e10cSrcweir         {
726cdf0e10cSrcweir             if( bRectClip )
727cdf0e10cSrcweir             {
728cdf0e10cSrcweir                 // #i29534# Store crop rect for later forwarding to
729cdf0e10cSrcweir                 // PDF writer
730cdf0e10cSrcweir                 aCropRect = aClipPolyPoly.GetBoundRect();
731cdf0e10cSrcweir                 pOut->IntersectClipRegion( aCropRect );
732cdf0e10cSrcweir             }
733cdf0e10cSrcweir             else
734cdf0e10cSrcweir             {
735cdf0e10cSrcweir                 pOut->IntersectClipRegion( aClipPolyPoly );
736cdf0e10cSrcweir             }
737cdf0e10cSrcweir         }
738cdf0e10cSrcweir     }
739cdf0e10cSrcweir 
740cdf0e10cSrcweir     bRet = mpMgr->DrawObj( pOut, aPt, aSz, *this, aAttr, nFlags, bCached );
741cdf0e10cSrcweir 
742cdf0e10cSrcweir     if( bCropped )
743cdf0e10cSrcweir         pOut->Pop();
744cdf0e10cSrcweir 
745cdf0e10cSrcweir     pOut->SetDrawMode( nOldDrawMode );
746cdf0e10cSrcweir 
747cdf0e10cSrcweir     // #i29534# Moved below OutDev restoration, to avoid multiple swap-ins
748cdf0e10cSrcweir     // (code above needs to call GetGraphic twice)
749cdf0e10cSrcweir     if( bCached )
750cdf0e10cSrcweir     {
751cdf0e10cSrcweir         if( mpSwapOutTimer )
752cdf0e10cSrcweir             mpSwapOutTimer->Start();
753cdf0e10cSrcweir         else
754cdf0e10cSrcweir             FireSwapOutRequest();
755cdf0e10cSrcweir     }
756cdf0e10cSrcweir 
757cdf0e10cSrcweir     return bRet;
758cdf0e10cSrcweir }
759cdf0e10cSrcweir 
760cdf0e10cSrcweir // --> OD 2010-01-04 #i105243#
DrawWithPDFHandling(OutputDevice & rOutDev,const Point & rPt,const Size & rSz,const GraphicAttr * pGrfAttr,const sal_uLong nFlags)761cdf0e10cSrcweir sal_Bool GraphicObject::DrawWithPDFHandling( OutputDevice& rOutDev,
762cdf0e10cSrcweir                                          const Point& rPt, const Size& rSz,
763cdf0e10cSrcweir                                          const GraphicAttr* pGrfAttr,
764cdf0e10cSrcweir                                          const sal_uLong nFlags )
765cdf0e10cSrcweir {
766cdf0e10cSrcweir     const GraphicAttr aGrfAttr( pGrfAttr ? *pGrfAttr : GetAttr() );
767cdf0e10cSrcweir 
768cdf0e10cSrcweir     // Notify PDF writer about linked graphic (if any)
769cdf0e10cSrcweir     sal_Bool bWritingPdfLinkedGraphic( sal_False );
770cdf0e10cSrcweir     Point aPt( rPt );
771cdf0e10cSrcweir     Size aSz( rSz );
772cdf0e10cSrcweir     Rectangle aCropRect;
773cdf0e10cSrcweir     vcl::PDFExtOutDevData* pPDFExtOutDevData =
774cdf0e10cSrcweir             dynamic_cast<vcl::PDFExtOutDevData*>(rOutDev.GetExtOutDevData());
775cdf0e10cSrcweir     if( pPDFExtOutDevData )
776cdf0e10cSrcweir     {
777cdf0e10cSrcweir         // only delegate image handling to PDF, if no special treatment is necessary
778cdf0e10cSrcweir         if( GetGraphic().IsLink() &&
779cdf0e10cSrcweir             rSz.Width() > 0L &&
780cdf0e10cSrcweir             rSz.Height() > 0L &&
781cdf0e10cSrcweir             !aGrfAttr.IsSpecialDrawMode() &&
782cdf0e10cSrcweir             !aGrfAttr.IsMirrored() &&
783cdf0e10cSrcweir             !aGrfAttr.IsRotated() &&
784cdf0e10cSrcweir             !aGrfAttr.IsAdjusted() )
785cdf0e10cSrcweir         {
786cdf0e10cSrcweir             bWritingPdfLinkedGraphic = true;
787cdf0e10cSrcweir 
788cdf0e10cSrcweir             if( aGrfAttr.IsCropped() )
789cdf0e10cSrcweir             {
790cdf0e10cSrcweir                 PolyPolygon aClipPolyPoly;
791cdf0e10cSrcweir                 sal_Bool bRectClip;
792cdf0e10cSrcweir                 const sal_Bool bCrop = ImplGetCropParams( &rOutDev,
793cdf0e10cSrcweir                                                       aPt, aSz,
794cdf0e10cSrcweir                                                       &aGrfAttr,
795cdf0e10cSrcweir                                                       aClipPolyPoly,
796cdf0e10cSrcweir                                                       bRectClip );
797cdf0e10cSrcweir                 if ( bCrop && bRectClip )
798cdf0e10cSrcweir                 {
799cdf0e10cSrcweir                     aCropRect = aClipPolyPoly.GetBoundRect();
800cdf0e10cSrcweir                 }
801cdf0e10cSrcweir             }
802cdf0e10cSrcweir 
803cdf0e10cSrcweir             pPDFExtOutDevData->BeginGroup();
804cdf0e10cSrcweir         }
805cdf0e10cSrcweir     }
806cdf0e10cSrcweir 
807cdf0e10cSrcweir     sal_Bool bRet = Draw( &rOutDev, rPt, rSz, &aGrfAttr, nFlags );
808cdf0e10cSrcweir 
809cdf0e10cSrcweir     // Notify PDF writer about linked graphic (if any)
810cdf0e10cSrcweir     if( bWritingPdfLinkedGraphic )
811cdf0e10cSrcweir     {
812cdf0e10cSrcweir         pPDFExtOutDevData->EndGroup( const_cast< Graphic& >(GetGraphic()),
813cdf0e10cSrcweir                                      aGrfAttr.GetTransparency(),
814cdf0e10cSrcweir                                      Rectangle( aPt, aSz ),
815cdf0e10cSrcweir                                      aCropRect );
816cdf0e10cSrcweir     }
817cdf0e10cSrcweir 
818cdf0e10cSrcweir     return bRet;
819cdf0e10cSrcweir }
820cdf0e10cSrcweir // <--
821cdf0e10cSrcweir 
822cdf0e10cSrcweir // -----------------------------------------------------------------------------
823cdf0e10cSrcweir 
DrawTiled(OutputDevice * pOut,const Rectangle & rArea,const Size & rSize,const Size & rOffset,const GraphicAttr * pAttr,sal_uLong nFlags,int nTileCacheSize1D)824cdf0e10cSrcweir sal_Bool GraphicObject::DrawTiled( OutputDevice* pOut, const Rectangle& rArea, const Size& rSize,
825cdf0e10cSrcweir                                const Size& rOffset, const GraphicAttr* pAttr, sal_uLong nFlags, int nTileCacheSize1D )
826cdf0e10cSrcweir {
827cdf0e10cSrcweir     if( pOut == NULL || rSize.Width() == 0 || rSize.Height() == 0 )
828cdf0e10cSrcweir         return sal_False;
829cdf0e10cSrcweir 
830cdf0e10cSrcweir     const MapMode   aOutMapMode( pOut->GetMapMode() );
831cdf0e10cSrcweir     const MapMode   aMapMode( aOutMapMode.GetMapUnit(), Point(), aOutMapMode.GetScaleX(), aOutMapMode.GetScaleY() );
832cdf0e10cSrcweir     // #106258# Clamp size to 1 for zero values. This is okay, since
833cdf0e10cSrcweir     // logical size of zero is handled above already
834cdf0e10cSrcweir     const Size      aOutTileSize( ::std::max( 1L, pOut->LogicToPixel( rSize, aOutMapMode ).Width() ),
835cdf0e10cSrcweir                                   ::std::max( 1L, pOut->LogicToPixel( rSize, aOutMapMode ).Height() ) );
836cdf0e10cSrcweir 
837cdf0e10cSrcweir     //#i69780 clip final tile size to a sane max size
838cdf0e10cSrcweir     while (((sal_Int64)rSize.Width() * nTileCacheSize1D) > SAL_MAX_UINT16)
839cdf0e10cSrcweir         nTileCacheSize1D /= 2;
840cdf0e10cSrcweir     while (((sal_Int64)rSize.Height() * nTileCacheSize1D) > SAL_MAX_UINT16)
841cdf0e10cSrcweir         nTileCacheSize1D /= 2;
842cdf0e10cSrcweir 
843cdf0e10cSrcweir     return ImplDrawTiled( pOut, rArea, aOutTileSize, rOffset, pAttr, nFlags, nTileCacheSize1D );
844cdf0e10cSrcweir }
845cdf0e10cSrcweir 
846cdf0e10cSrcweir // -----------------------------------------------------------------------------
847cdf0e10cSrcweir 
StartAnimation(OutputDevice * pOut,const Point & rPt,const Size & rSz,long nExtraData,const GraphicAttr * pAttr,sal_uLong,OutputDevice * pFirstFrameOutDev)848cdf0e10cSrcweir sal_Bool GraphicObject::StartAnimation( OutputDevice* pOut, const Point& rPt, const Size& rSz,
849cdf0e10cSrcweir                                     long nExtraData, const GraphicAttr* pAttr, sal_uLong /*nFlags*/,
850cdf0e10cSrcweir                                     OutputDevice* pFirstFrameOutDev )
851cdf0e10cSrcweir {
852cdf0e10cSrcweir     sal_Bool bRet = sal_False;
853cdf0e10cSrcweir 
854cdf0e10cSrcweir     GetGraphic();
855cdf0e10cSrcweir 
856cdf0e10cSrcweir     if( !IsSwappedOut() )
857cdf0e10cSrcweir     {
858cdf0e10cSrcweir         const GraphicAttr aAttr( pAttr ? *pAttr : GetAttr() );
859cdf0e10cSrcweir 
860cdf0e10cSrcweir         if( mbAnimated )
861cdf0e10cSrcweir         {
862cdf0e10cSrcweir             Point   aPt( rPt );
863cdf0e10cSrcweir             Size    aSz( rSz );
864cdf0e10cSrcweir             sal_Bool    bCropped = aAttr.IsCropped();
865cdf0e10cSrcweir 
866cdf0e10cSrcweir             if( bCropped )
867cdf0e10cSrcweir             {
868cdf0e10cSrcweir                 PolyPolygon aClipPolyPoly;
869cdf0e10cSrcweir                 sal_Bool        bRectClip;
870cdf0e10cSrcweir                 const sal_Bool  bCrop = ImplGetCropParams( pOut, aPt, aSz, &aAttr, aClipPolyPoly, bRectClip );
871cdf0e10cSrcweir 
872cdf0e10cSrcweir                 pOut->Push( PUSH_CLIPREGION );
873cdf0e10cSrcweir 
874cdf0e10cSrcweir                 if( bCrop )
875cdf0e10cSrcweir                 {
876cdf0e10cSrcweir                     if( bRectClip )
877cdf0e10cSrcweir                         pOut->IntersectClipRegion( aClipPolyPoly.GetBoundRect() );
878cdf0e10cSrcweir                     else
879cdf0e10cSrcweir                         pOut->IntersectClipRegion( aClipPolyPoly );
880cdf0e10cSrcweir                 }
881cdf0e10cSrcweir             }
882cdf0e10cSrcweir 
883cdf0e10cSrcweir             if( !mpSimpleCache || ( mpSimpleCache->maAttr != aAttr ) || pFirstFrameOutDev )
884cdf0e10cSrcweir             {
885cdf0e10cSrcweir                 if( mpSimpleCache )
886cdf0e10cSrcweir                     delete mpSimpleCache;
887cdf0e10cSrcweir 
888cdf0e10cSrcweir                 mpSimpleCache = new GrfSimpleCacheObj( GetTransformedGraphic( &aAttr ), aAttr );
889cdf0e10cSrcweir                 mpSimpleCache->maGraphic.SetAnimationNotifyHdl( GetAnimationNotifyHdl() );
890cdf0e10cSrcweir             }
891cdf0e10cSrcweir 
892cdf0e10cSrcweir             mpSimpleCache->maGraphic.StartAnimation( pOut, aPt, aSz, nExtraData, pFirstFrameOutDev );
893cdf0e10cSrcweir 
894cdf0e10cSrcweir             if( bCropped )
895cdf0e10cSrcweir                 pOut->Pop();
896cdf0e10cSrcweir 
897cdf0e10cSrcweir             bRet = sal_True;
898cdf0e10cSrcweir         }
899cdf0e10cSrcweir         else
900cdf0e10cSrcweir             bRet = Draw( pOut, rPt, rSz, &aAttr, GRFMGR_DRAW_STANDARD );
901cdf0e10cSrcweir     }
902cdf0e10cSrcweir 
903cdf0e10cSrcweir     return bRet;
904cdf0e10cSrcweir }
905cdf0e10cSrcweir 
906cdf0e10cSrcweir // -----------------------------------------------------------------------------
907cdf0e10cSrcweir 
StopAnimation(OutputDevice * pOut,long nExtraData)908cdf0e10cSrcweir void GraphicObject::StopAnimation( OutputDevice* pOut, long nExtraData )
909cdf0e10cSrcweir {
910cdf0e10cSrcweir     if( mpSimpleCache )
911cdf0e10cSrcweir         mpSimpleCache->maGraphic.StopAnimation( pOut, nExtraData );
912cdf0e10cSrcweir }
913cdf0e10cSrcweir 
914cdf0e10cSrcweir // -----------------------------------------------------------------------------
915cdf0e10cSrcweir 
GetGraphic() const916cdf0e10cSrcweir const Graphic& GraphicObject::GetGraphic() const
917cdf0e10cSrcweir {
918cdf0e10cSrcweir     if( mbAutoSwapped )
919cdf0e10cSrcweir         ( (GraphicObject*) this )->ImplAutoSwapIn();
920cdf0e10cSrcweir 
921cdf0e10cSrcweir     return maGraphic;
922cdf0e10cSrcweir }
923cdf0e10cSrcweir 
924cdf0e10cSrcweir // -----------------------------------------------------------------------------
925cdf0e10cSrcweir 
SetGraphic(const Graphic & rGraphic,const GraphicObject * pCopyObj)926cdf0e10cSrcweir void GraphicObject::SetGraphic( const Graphic& rGraphic, const GraphicObject* pCopyObj )
927cdf0e10cSrcweir {
928cdf0e10cSrcweir     mpMgr->ImplUnregisterObj( *this );
929cdf0e10cSrcweir 
930cdf0e10cSrcweir     if( mpSwapOutTimer )
931cdf0e10cSrcweir         mpSwapOutTimer->Stop();
932cdf0e10cSrcweir 
933cdf0e10cSrcweir     maGraphic = rGraphic;
934cdf0e10cSrcweir     mbAutoSwapped = sal_False;
935cdf0e10cSrcweir     ImplAssignGraphicData();
936cdf0e10cSrcweir     delete mpLink, mpLink = NULL;
937cdf0e10cSrcweir     delete mpSimpleCache, mpSimpleCache = NULL;
938cdf0e10cSrcweir 
939cdf0e10cSrcweir     mpMgr->ImplRegisterObj( *this, maGraphic, 0, pCopyObj);
940cdf0e10cSrcweir 
941cdf0e10cSrcweir     if( mpSwapOutTimer )
942cdf0e10cSrcweir         mpSwapOutTimer->Start();
9433e526e08SArmin Le Grand 
9443e526e08SArmin Le Grand     // Handle evtl. needed AfterDataChanges
9453e526e08SArmin Le Grand     ImplAfterDataChange();
946cdf0e10cSrcweir }
947cdf0e10cSrcweir 
948cdf0e10cSrcweir // -----------------------------------------------------------------------------
949cdf0e10cSrcweir 
SetGraphic(const Graphic & rGraphic,const String & rLink)950cdf0e10cSrcweir void GraphicObject::SetGraphic( const Graphic& rGraphic, const String& rLink )
951cdf0e10cSrcweir {
952cdf0e10cSrcweir     SetGraphic( rGraphic );
953cdf0e10cSrcweir     mpLink = new String( rLink );
954cdf0e10cSrcweir }
955cdf0e10cSrcweir 
956cdf0e10cSrcweir // -----------------------------------------------------------------------------
957cdf0e10cSrcweir 
GetTransformedGraphic(const Size & rDestSize,const MapMode & rDestMap,const GraphicAttr & rAttr) const958cdf0e10cSrcweir Graphic GraphicObject::GetTransformedGraphic( const Size& rDestSize, const MapMode& rDestMap, const GraphicAttr& rAttr ) const
959cdf0e10cSrcweir {
960cdf0e10cSrcweir     // #104550# Extracted from svx/source/svdraw/svdograf.cxx
961cdf0e10cSrcweir     Graphic             aTransGraphic( maGraphic );
962cdf0e10cSrcweir     const GraphicType   eType = GetType();
963cdf0e10cSrcweir     const Size          aSrcSize( aTransGraphic.GetPrefSize() );
964cdf0e10cSrcweir 
965cdf0e10cSrcweir     // #104115# Convert the crop margins to graphic object mapmode
966cdf0e10cSrcweir     const MapMode aMapGraph( aTransGraphic.GetPrefMapMode() );
967cdf0e10cSrcweir     const MapMode aMap100( MAP_100TH_MM );
968cdf0e10cSrcweir 
969cdf0e10cSrcweir     Size aCropLeftTop;
970cdf0e10cSrcweir     Size aCropRightBottom;
971cdf0e10cSrcweir 
972cdf0e10cSrcweir     if( GRAPHIC_GDIMETAFILE == eType )
973cdf0e10cSrcweir     {
974cdf0e10cSrcweir         GDIMetaFile aMtf( aTransGraphic.GetGDIMetaFile() );
975cdf0e10cSrcweir 
976cdf0e10cSrcweir         if( aMapGraph == MAP_PIXEL )
977cdf0e10cSrcweir         {
978a409c94eSArmin Le Grand             // crops are in 1/100th mm -> to aMapGraph -> to MAP_PIXEL
979a409c94eSArmin Le Grand             aCropLeftTop = Application::GetDefaultDevice()->LogicToPixel(
980a409c94eSArmin Le Grand                 Size(rAttr.GetLeftCrop(), rAttr.GetTopCrop()),
981cdf0e10cSrcweir                 aMap100);
982a409c94eSArmin Le Grand             aCropRightBottom = Application::GetDefaultDevice()->LogicToPixel(
983a409c94eSArmin Le Grand                 Size(rAttr.GetRightCrop(), rAttr.GetBottomCrop()),
984cdf0e10cSrcweir                 aMap100);
985cdf0e10cSrcweir         }
986cdf0e10cSrcweir         else
987cdf0e10cSrcweir         {
988a409c94eSArmin Le Grand             // crops are in GraphicObject units -> to aMapGraph
989a409c94eSArmin Le Grand             aCropLeftTop = OutputDevice::LogicToLogic(
990a409c94eSArmin Le Grand                 Size(rAttr.GetLeftCrop(), rAttr.GetTopCrop()),
991cdf0e10cSrcweir                 aMap100,
992cdf0e10cSrcweir                 aMapGraph);
993a409c94eSArmin Le Grand             aCropRightBottom = OutputDevice::LogicToLogic(
994a409c94eSArmin Le Grand                 Size(rAttr.GetRightCrop(), rAttr.GetBottomCrop()),
995cdf0e10cSrcweir                 aMap100,
996cdf0e10cSrcweir                 aMapGraph);
997cdf0e10cSrcweir         }
998cdf0e10cSrcweir 
999cdf0e10cSrcweir         // #104115# If the metafile is cropped, give it a special
1000cdf0e10cSrcweir         // treatment: clip against the remaining area, scale up such
1001cdf0e10cSrcweir         // that this area later fills the desired size, and move the
1002cdf0e10cSrcweir         // origin to the upper left edge of that area.
1003cdf0e10cSrcweir         if( rAttr.IsCropped() )
1004cdf0e10cSrcweir         {
1005cdf0e10cSrcweir             const MapMode aMtfMapMode( aMtf.GetPrefMapMode() );
1006cdf0e10cSrcweir 
1007cdf0e10cSrcweir             Rectangle aClipRect( aMtfMapMode.GetOrigin().X() + aCropLeftTop.Width(),
1008cdf0e10cSrcweir                                  aMtfMapMode.GetOrigin().Y() + aCropLeftTop.Height(),
1009cdf0e10cSrcweir                                  aMtfMapMode.GetOrigin().X() + aSrcSize.Width() - aCropRightBottom.Width(),
1010cdf0e10cSrcweir                                  aMtfMapMode.GetOrigin().Y() + aSrcSize.Height() - aCropRightBottom.Height() );
1011cdf0e10cSrcweir 
1012cdf0e10cSrcweir             // #104115# To correctly crop rotated metafiles, clip by view rectangle
1013cdf0e10cSrcweir             aMtf.AddAction( new MetaISectRectClipRegionAction( aClipRect ), 0 );
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir             // #104115# To crop the metafile, scale larger than the output rectangle
1016cdf0e10cSrcweir             aMtf.Scale( (double)rDestSize.Width() / (aSrcSize.Width() - aCropLeftTop.Width() - aCropRightBottom.Width()),
1017cdf0e10cSrcweir                         (double)rDestSize.Height() / (aSrcSize.Height() - aCropLeftTop.Height() - aCropRightBottom.Height()) );
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir             // #104115# Adapt the pref size by hand (scale changes it
1020cdf0e10cSrcweir             // proportionally, but we want it to be smaller than the
1021cdf0e10cSrcweir             // former size, to crop the excess out)
1022cdf0e10cSrcweir             aMtf.SetPrefSize( Size( (long)((double)rDestSize.Width() *  (1.0 + (aCropLeftTop.Width() + aCropRightBottom.Width()) / aSrcSize.Width())  + .5),
1023cdf0e10cSrcweir                                     (long)((double)rDestSize.Height() * (1.0 + (aCropLeftTop.Height() + aCropRightBottom.Height()) / aSrcSize.Height()) + .5) ) );
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir             // #104115# Adapt the origin of the new mapmode, such that it
1026cdf0e10cSrcweir             // is shifted to the place where the cropped output starts
1027cdf0e10cSrcweir             Point aNewOrigin( (long)((double)aMtfMapMode.GetOrigin().X() + rDestSize.Width() * aCropLeftTop.Width() / (aSrcSize.Width() - aCropLeftTop.Width() - aCropRightBottom.Width()) + .5),
1028cdf0e10cSrcweir                               (long)((double)aMtfMapMode.GetOrigin().Y() + rDestSize.Height() * aCropLeftTop.Height() / (aSrcSize.Height() - aCropLeftTop.Height() - aCropRightBottom.Height()) + .5) );
1029cdf0e10cSrcweir             MapMode aNewMap( rDestMap );
1030cdf0e10cSrcweir             aNewMap.SetOrigin( OutputDevice::LogicToLogic(aNewOrigin, aMtfMapMode, rDestMap) );
1031cdf0e10cSrcweir             aMtf.SetPrefMapMode( aNewMap );
1032cdf0e10cSrcweir         }
1033cdf0e10cSrcweir         else
1034cdf0e10cSrcweir         {
1035cdf0e10cSrcweir             aMtf.Scale( Fraction( rDestSize.Width(), aSrcSize.Width() ), Fraction( rDestSize.Height(), aSrcSize.Height() ) );
1036cdf0e10cSrcweir             aMtf.SetPrefMapMode( rDestMap );
1037cdf0e10cSrcweir         }
1038cdf0e10cSrcweir 
1039cdf0e10cSrcweir         aTransGraphic = aMtf;
1040cdf0e10cSrcweir     }
1041cdf0e10cSrcweir     else if( GRAPHIC_BITMAP == eType )
1042cdf0e10cSrcweir     {
1043cdf0e10cSrcweir         BitmapEx aBitmapEx( aTransGraphic.GetBitmapEx() );
10442376739dSArmin Le Grand         Rectangle aCropRect;
1045cdf0e10cSrcweir 
1046a409c94eSArmin Le Grand         // convert crops to pixel
10472376739dSArmin Le Grand         if(rAttr.IsCropped())
10482376739dSArmin Le Grand         {
1049a409c94eSArmin Le Grand             if( aMapGraph == MAP_PIXEL )
1050a409c94eSArmin Le Grand             {
1051a409c94eSArmin Le Grand                 // crops are in 1/100th mm -> to MAP_PIXEL
1052a409c94eSArmin Le Grand                 aCropLeftTop = Application::GetDefaultDevice()->LogicToPixel(
1053a409c94eSArmin Le Grand                     Size(rAttr.GetLeftCrop(), rAttr.GetTopCrop()),
1054a409c94eSArmin Le Grand                     aMap100);
1055a409c94eSArmin Le Grand                 aCropRightBottom = Application::GetDefaultDevice()->LogicToPixel(
1056a409c94eSArmin Le Grand                     Size(rAttr.GetRightCrop(), rAttr.GetBottomCrop()),
1057a409c94eSArmin Le Grand                     aMap100);
1058a409c94eSArmin Le Grand             }
1059a409c94eSArmin Le Grand             else
1060a409c94eSArmin Le Grand             {
1061a409c94eSArmin Le Grand                 // crops are in GraphicObject units -> to MAP_PIXEL
10622376739dSArmin Le Grand                 aCropLeftTop = Application::GetDefaultDevice()->LogicToPixel(
10632376739dSArmin Le Grand                     Size(rAttr.GetLeftCrop(), rAttr.GetTopCrop()),
10642376739dSArmin Le Grand                     aMapGraph);
10652376739dSArmin Le Grand                 aCropRightBottom = Application::GetDefaultDevice()->LogicToPixel(
10662376739dSArmin Le Grand                     Size(rAttr.GetRightCrop(), rAttr.GetBottomCrop()),
10672376739dSArmin Le Grand                     aMapGraph);
1068a409c94eSArmin Le Grand             }
1069cdf0e10cSrcweir 
1070cdf0e10cSrcweir             // convert from prefmapmode to pixel
10712376739dSArmin Le Grand             Size aSrcSizePixel(
10722376739dSArmin Le Grand                 Application::GetDefaultDevice()->LogicToPixel(
10732376739dSArmin Le Grand                     aSrcSize,
1074cdf0e10cSrcweir                     aMapGraph));
1075cdf0e10cSrcweir 
10762376739dSArmin Le Grand             if(rAttr.IsCropped()
10772376739dSArmin Le Grand                 && (aSrcSizePixel.Width() != aBitmapEx.GetSizePixel().Width() || aSrcSizePixel.Height() != aBitmapEx.GetSizePixel().Height())
10782376739dSArmin Le Grand                 && aSrcSizePixel.Width())
10792376739dSArmin Le Grand             {
10802376739dSArmin Le Grand                 // the size in pixels calculated from Graphic's internal MapMode (aTransGraphic.GetPrefMapMode())
10812376739dSArmin Le Grand                 // and it's internal size (aTransGraphic.GetPrefSize()) is different from it's real pixel size.
10822376739dSArmin Le Grand                 // This can be interpreted as this values to be set wrong, but needs to be corrected since e.g.
10832376739dSArmin Le Grand                 // existing cropping is calculated based on this logic values already.
10842376739dSArmin Le Grand                 // aBitmapEx.Scale(aSrcSizePixel);
10852376739dSArmin Le Grand 
10862376739dSArmin Le Grand                 // another possibility is to adapt the values created so far with a factor; this
10872376739dSArmin Le Grand                 // will keep the original Bitmap untouched and thus quality will not change
1088a409c94eSArmin Le Grand                 // caution: convert to double first, else pretty big errors may occurr
1089a409c94eSArmin Le Grand                 const double fFactorX((double)aBitmapEx.GetSizePixel().Width() / aSrcSizePixel.Width());
1090a409c94eSArmin Le Grand                 const double fFactorY((double)aBitmapEx.GetSizePixel().Height() / aSrcSizePixel.Height());
10912376739dSArmin Le Grand 
10922376739dSArmin Le Grand                 aCropLeftTop.Width() = basegfx::fround(aCropLeftTop.Width() * fFactorX);
10932376739dSArmin Le Grand                 aCropLeftTop.Height() = basegfx::fround(aCropLeftTop.Height() * fFactorY);
10942376739dSArmin Le Grand                 aCropRightBottom.Width() = basegfx::fround(aCropRightBottom.Width() * fFactorX);
10952376739dSArmin Le Grand                 aCropRightBottom.Height() = basegfx::fround(aCropRightBottom.Height() * fFactorY);
10962376739dSArmin Le Grand 
10972376739dSArmin Le Grand                 aSrcSizePixel = aBitmapEx.GetSizePixel();
10982376739dSArmin Le Grand             }
10992376739dSArmin Le Grand 
1100cdf0e10cSrcweir             // setup crop rectangle in pixel
11012376739dSArmin Le Grand             aCropRect = Rectangle( aCropLeftTop.Width(), aCropLeftTop.Height(),
1102cdf0e10cSrcweir                                  aSrcSizePixel.Width() - aCropRightBottom.Width(),
1103cdf0e10cSrcweir                                  aSrcSizePixel.Height() - aCropRightBottom.Height() );
11042376739dSArmin Le Grand         }
1105cdf0e10cSrcweir 
1106cdf0e10cSrcweir         // #105641# Also crop animations
1107cdf0e10cSrcweir         if( aTransGraphic.IsAnimated() )
1108cdf0e10cSrcweir         {
1109cdf0e10cSrcweir             sal_uInt16 nFrame;
1110cdf0e10cSrcweir             Animation aAnim( aTransGraphic.GetAnimation() );
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir             for( nFrame=0; nFrame<aAnim.Count(); ++nFrame )
1113cdf0e10cSrcweir             {
1114cdf0e10cSrcweir                 AnimationBitmap aAnimBmp( aAnim.Get( nFrame ) );
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir                 if( !aCropRect.IsInside( Rectangle(aAnimBmp.aPosPix, aAnimBmp.aSizePix) ) )
1117cdf0e10cSrcweir                 {
1118cdf0e10cSrcweir                     // setup actual cropping (relative to frame position)
1119cdf0e10cSrcweir                     Rectangle aCropRectRel( aCropRect );
1120cdf0e10cSrcweir                     aCropRectRel.Move( -aAnimBmp.aPosPix.X(),
1121cdf0e10cSrcweir                                        -aAnimBmp.aPosPix.Y() );
1122cdf0e10cSrcweir 
1123cdf0e10cSrcweir                     // cropping affects this frame, apply it then
1124cdf0e10cSrcweir                     // do _not_ apply enlargement, this is done below
1125cdf0e10cSrcweir                     ImplTransformBitmap( aAnimBmp.aBmpEx, rAttr, Size(), Size(),
1126cdf0e10cSrcweir                                          aCropRectRel, rDestSize, sal_False );
1127cdf0e10cSrcweir 
1128cdf0e10cSrcweir                     aAnim.Replace( aAnimBmp, nFrame );
1129cdf0e10cSrcweir                 }
1130cdf0e10cSrcweir                 // else: bitmap completely within crop area,
1131cdf0e10cSrcweir                 // i.e. nothing is cropped away
1132cdf0e10cSrcweir             }
1133cdf0e10cSrcweir 
1134cdf0e10cSrcweir             // now, apply enlargement (if any) through global animation size
1135cdf0e10cSrcweir             if( aCropLeftTop.Width() < 0 ||
1136cdf0e10cSrcweir                 aCropLeftTop.Height() < 0 ||
1137cdf0e10cSrcweir                 aCropRightBottom.Width() < 0 ||
1138cdf0e10cSrcweir                 aCropRightBottom.Height() < 0 )
1139cdf0e10cSrcweir             {
1140cdf0e10cSrcweir                 Size aNewSize( aAnim.GetDisplaySizePixel() );
1141cdf0e10cSrcweir                 aNewSize.Width() += aCropRightBottom.Width() < 0 ? -aCropRightBottom.Width() : 0;
1142cdf0e10cSrcweir                 aNewSize.Width() += aCropLeftTop.Width() < 0 ? -aCropLeftTop.Width() : 0;
1143cdf0e10cSrcweir                 aNewSize.Height() += aCropRightBottom.Height() < 0 ? -aCropRightBottom.Height() : 0;
1144cdf0e10cSrcweir                 aNewSize.Height() += aCropLeftTop.Height() < 0 ? -aCropLeftTop.Height() : 0;
1145cdf0e10cSrcweir                 aAnim.SetDisplaySizePixel( aNewSize );
1146cdf0e10cSrcweir             }
1147cdf0e10cSrcweir 
1148cdf0e10cSrcweir             // if topleft has changed, we must move all frames to the
1149cdf0e10cSrcweir             // right and bottom, resp.
1150cdf0e10cSrcweir             if( aCropLeftTop.Width() < 0 ||
1151cdf0e10cSrcweir                 aCropLeftTop.Height() < 0 )
1152cdf0e10cSrcweir             {
1153cdf0e10cSrcweir                 Point aPosOffset( aCropLeftTop.Width() < 0 ? -aCropLeftTop.Width() : 0,
1154cdf0e10cSrcweir                                   aCropLeftTop.Height() < 0 ? -aCropLeftTop.Height() : 0 );
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir                 for( nFrame=0; nFrame<aAnim.Count(); ++nFrame )
1157cdf0e10cSrcweir                 {
1158cdf0e10cSrcweir                     AnimationBitmap aAnimBmp( aAnim.Get( nFrame ) );
1159cdf0e10cSrcweir 
1160cdf0e10cSrcweir                     aAnimBmp.aPosPix += aPosOffset;
1161cdf0e10cSrcweir 
1162cdf0e10cSrcweir                     aAnim.Replace( aAnimBmp, nFrame );
1163cdf0e10cSrcweir                 }
1164cdf0e10cSrcweir             }
1165cdf0e10cSrcweir 
1166cdf0e10cSrcweir             aTransGraphic = aAnim;
1167cdf0e10cSrcweir         }
1168cdf0e10cSrcweir         else
1169cdf0e10cSrcweir         {
11702376739dSArmin Le Grand             ImplTransformBitmap( aBitmapEx, rAttr, aCropLeftTop, aCropRightBottom,
1171cdf0e10cSrcweir                                  aCropRect, rDestSize, sal_True );
1172cdf0e10cSrcweir 
11732376739dSArmin Le Grand             aTransGraphic = aBitmapEx;
1174cdf0e10cSrcweir         }
1175cdf0e10cSrcweir 
1176cdf0e10cSrcweir         aTransGraphic.SetPrefSize( rDestSize );
1177cdf0e10cSrcweir         aTransGraphic.SetPrefMapMode( rDestMap );
1178cdf0e10cSrcweir     }
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir     GraphicObject aGrfObj( aTransGraphic );
1181cdf0e10cSrcweir     aTransGraphic = aGrfObj.GetTransformedGraphic( &rAttr );
1182cdf0e10cSrcweir 
1183cdf0e10cSrcweir     return aTransGraphic;
1184cdf0e10cSrcweir }
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir // -----------------------------------------------------------------------------
1187cdf0e10cSrcweir 
GetTransformedGraphic(const GraphicAttr * pAttr) const1188cdf0e10cSrcweir Graphic GraphicObject::GetTransformedGraphic( const GraphicAttr* pAttr ) const // TODO: Change to Impl
1189cdf0e10cSrcweir {
1190cdf0e10cSrcweir     GetGraphic();
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir     Graphic     aGraphic;
1193cdf0e10cSrcweir     GraphicAttr aAttr( pAttr ? *pAttr : GetAttr() );
1194cdf0e10cSrcweir 
1195cdf0e10cSrcweir     if( maGraphic.IsSupportedGraphic() && !maGraphic.IsSwapOut() )
1196cdf0e10cSrcweir     {
1197cdf0e10cSrcweir         if( aAttr.IsSpecialDrawMode() || aAttr.IsAdjusted() || aAttr.IsMirrored() || aAttr.IsRotated() || aAttr.IsTransparent() )
1198cdf0e10cSrcweir         {
1199cdf0e10cSrcweir             if( GetType() == GRAPHIC_BITMAP )
1200cdf0e10cSrcweir             {
1201cdf0e10cSrcweir                 if( IsAnimated() )
1202cdf0e10cSrcweir                 {
1203cdf0e10cSrcweir                     Animation aAnimation( maGraphic.GetAnimation() );
1204cdf0e10cSrcweir                     GraphicManager::ImplAdjust( aAnimation, aAttr, ADJUSTMENT_ALL );
1205cdf0e10cSrcweir                     aAnimation.SetLoopCount( mnAnimationLoopCount );
1206cdf0e10cSrcweir                     aGraphic = aAnimation;
1207cdf0e10cSrcweir                 }
1208cdf0e10cSrcweir                 else
1209cdf0e10cSrcweir                 {
1210cdf0e10cSrcweir                     BitmapEx aBmpEx( maGraphic.GetBitmapEx() );
1211cdf0e10cSrcweir                     GraphicManager::ImplAdjust( aBmpEx, aAttr, ADJUSTMENT_ALL );
1212cdf0e10cSrcweir                     aGraphic = aBmpEx;
1213cdf0e10cSrcweir                 }
1214cdf0e10cSrcweir             }
1215cdf0e10cSrcweir             else
1216cdf0e10cSrcweir             {
1217cdf0e10cSrcweir                 GDIMetaFile aMtf( maGraphic.GetGDIMetaFile() );
1218cdf0e10cSrcweir                 GraphicManager::ImplAdjust( aMtf, aAttr, ADJUSTMENT_ALL );
1219cdf0e10cSrcweir                 aGraphic = aMtf;
1220cdf0e10cSrcweir             }
1221cdf0e10cSrcweir         }
1222cdf0e10cSrcweir         else
1223cdf0e10cSrcweir         {
1224cdf0e10cSrcweir             if( ( GetType() == GRAPHIC_BITMAP ) && IsAnimated() )
1225cdf0e10cSrcweir             {
1226cdf0e10cSrcweir                 Animation aAnimation( maGraphic.GetAnimation() );
1227cdf0e10cSrcweir                 aAnimation.SetLoopCount( mnAnimationLoopCount );
1228cdf0e10cSrcweir                 aGraphic = aAnimation;
1229cdf0e10cSrcweir             }
1230cdf0e10cSrcweir             else
1231cdf0e10cSrcweir                 aGraphic = maGraphic;
1232cdf0e10cSrcweir         }
1233cdf0e10cSrcweir     }
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir     return aGraphic;
1236cdf0e10cSrcweir }
1237cdf0e10cSrcweir 
1238cdf0e10cSrcweir // -----------------------------------------------------------------------------
1239cdf0e10cSrcweir 
ResetAnimationLoopCount()1240cdf0e10cSrcweir void GraphicObject::ResetAnimationLoopCount()
1241cdf0e10cSrcweir {
1242cdf0e10cSrcweir     if( IsAnimated() && !IsSwappedOut() )
1243cdf0e10cSrcweir     {
1244cdf0e10cSrcweir         maGraphic.ResetAnimationLoopCount();
1245cdf0e10cSrcweir 
1246cdf0e10cSrcweir         if( mpSimpleCache )
1247cdf0e10cSrcweir             mpSimpleCache->maGraphic.ResetAnimationLoopCount();
1248cdf0e10cSrcweir     }
1249cdf0e10cSrcweir }
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir // -----------------------------------------------------------------------------
1252cdf0e10cSrcweir 
SwapOut()1253cdf0e10cSrcweir sal_Bool GraphicObject::SwapOut()
1254cdf0e10cSrcweir {
1255cdf0e10cSrcweir     sal_Bool bRet = ( !mbAutoSwapped ? maGraphic.SwapOut() : sal_False );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir     if( bRet && mpMgr )
1258cdf0e10cSrcweir         mpMgr->ImplGraphicObjectWasSwappedOut( *this );
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     return bRet;
1261cdf0e10cSrcweir }
1262cdf0e10cSrcweir 
1263cdf0e10cSrcweir // -----------------------------------------------------------------------------
1264cdf0e10cSrcweir 
SwapOut(SvStream * pOStm)1265cdf0e10cSrcweir sal_Bool GraphicObject::SwapOut( SvStream* pOStm )
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir     sal_Bool bRet = ( !mbAutoSwapped ? maGraphic.SwapOut( pOStm ) : sal_False );
1268cdf0e10cSrcweir 
1269cdf0e10cSrcweir     if( bRet && mpMgr )
1270cdf0e10cSrcweir         mpMgr->ImplGraphicObjectWasSwappedOut( *this );
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir     return bRet;
1273cdf0e10cSrcweir }
1274cdf0e10cSrcweir 
1275cdf0e10cSrcweir // -----------------------------------------------------------------------------
1276cdf0e10cSrcweir 
SwapIn()1277cdf0e10cSrcweir sal_Bool GraphicObject::SwapIn()
1278cdf0e10cSrcweir {
1279cdf0e10cSrcweir     sal_Bool bRet;
1280cdf0e10cSrcweir 
1281cdf0e10cSrcweir     if( mbAutoSwapped )
1282cdf0e10cSrcweir     {
1283cdf0e10cSrcweir         ImplAutoSwapIn();
1284cdf0e10cSrcweir         bRet = sal_True;
1285cdf0e10cSrcweir     }
1286cdf0e10cSrcweir     else if( mpMgr && mpMgr->ImplFillSwappedGraphicObject( *this, maGraphic ) )
12873e526e08SArmin Le Grand     {
1288cdf0e10cSrcweir         bRet = sal_True;
12893e526e08SArmin Le Grand     }
1290cdf0e10cSrcweir     else
1291cdf0e10cSrcweir     {
1292cdf0e10cSrcweir         bRet = maGraphic.SwapIn();
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir         if( bRet && mpMgr )
1295cdf0e10cSrcweir             mpMgr->ImplGraphicObjectWasSwappedIn( *this );
1296cdf0e10cSrcweir     }
1297cdf0e10cSrcweir 
1298cdf0e10cSrcweir     if( bRet )
12993e526e08SArmin Le Grand     {
1300cdf0e10cSrcweir         ImplAssignGraphicData();
1301cdf0e10cSrcweir 
13023e526e08SArmin Le Grand         // Handle evtl. needed AfterDataChanges
13033e526e08SArmin Le Grand         ImplAfterDataChange();
13043e526e08SArmin Le Grand     }
13053e526e08SArmin Le Grand 
1306cdf0e10cSrcweir     return bRet;
1307cdf0e10cSrcweir }
1308cdf0e10cSrcweir 
1309cdf0e10cSrcweir // -----------------------------------------------------------------------------
1310cdf0e10cSrcweir 
SwapIn(SvStream * pIStm)1311cdf0e10cSrcweir sal_Bool GraphicObject::SwapIn( SvStream* pIStm )
1312cdf0e10cSrcweir {
1313cdf0e10cSrcweir     sal_Bool bRet;
1314cdf0e10cSrcweir 
1315cdf0e10cSrcweir     if( mbAutoSwapped )
1316cdf0e10cSrcweir     {
1317cdf0e10cSrcweir         ImplAutoSwapIn();
1318cdf0e10cSrcweir         bRet = sal_True;
1319cdf0e10cSrcweir     }
1320cdf0e10cSrcweir     else if( mpMgr && mpMgr->ImplFillSwappedGraphicObject( *this, maGraphic ) )
13213e526e08SArmin Le Grand     {
1322cdf0e10cSrcweir         bRet = sal_True;
13233e526e08SArmin Le Grand     }
1324cdf0e10cSrcweir     else
1325cdf0e10cSrcweir     {
1326cdf0e10cSrcweir         bRet = maGraphic.SwapIn( pIStm );
1327cdf0e10cSrcweir 
1328cdf0e10cSrcweir         if( bRet && mpMgr )
1329cdf0e10cSrcweir             mpMgr->ImplGraphicObjectWasSwappedIn( *this );
1330cdf0e10cSrcweir     }
1331cdf0e10cSrcweir 
1332cdf0e10cSrcweir     if( bRet )
13333e526e08SArmin Le Grand     {
1334cdf0e10cSrcweir         ImplAssignGraphicData();
1335cdf0e10cSrcweir 
13363e526e08SArmin Le Grand         //
13373e526e08SArmin Le Grand         ImplAfterDataChange();
13383e526e08SArmin Le Grand     }
13393e526e08SArmin Le Grand 
1340cdf0e10cSrcweir     return bRet;
1341cdf0e10cSrcweir }
1342cdf0e10cSrcweir 
1343cdf0e10cSrcweir // -----------------------------------------------------------------------------
1344cdf0e10cSrcweir 
SetSwapState()1345cdf0e10cSrcweir void GraphicObject::SetSwapState()
1346cdf0e10cSrcweir {
1347cdf0e10cSrcweir     if( !IsSwappedOut() )
1348cdf0e10cSrcweir     {
1349cdf0e10cSrcweir         mbAutoSwapped = sal_True;
1350cdf0e10cSrcweir 
1351cdf0e10cSrcweir         if( mpMgr )
1352cdf0e10cSrcweir             mpMgr->ImplGraphicObjectWasSwappedOut( *this );
1353cdf0e10cSrcweir     }
1354cdf0e10cSrcweir }
1355cdf0e10cSrcweir 
1356cdf0e10cSrcweir // -----------------------------------------------------------------------------
1357cdf0e10cSrcweir 
IMPL_LINK(GraphicObject,ImplAutoSwapOutHdl,void *,EMPTYARG)1358cdf0e10cSrcweir IMPL_LINK( GraphicObject, ImplAutoSwapOutHdl, void*, EMPTYARG )
1359cdf0e10cSrcweir {
1360cdf0e10cSrcweir     if( !IsSwappedOut() )
1361cdf0e10cSrcweir     {
1362cdf0e10cSrcweir         mbIsInSwapOut = sal_True;
1363cdf0e10cSrcweir 
1364cdf0e10cSrcweir         SvStream* pStream = GetSwapStream();
1365cdf0e10cSrcweir 
1366cdf0e10cSrcweir         if( GRFMGR_AUTOSWAPSTREAM_NONE != pStream )
1367cdf0e10cSrcweir         {
1368cdf0e10cSrcweir             if( GRFMGR_AUTOSWAPSTREAM_LINK == pStream )
1369cdf0e10cSrcweir                 mbAutoSwapped = SwapOut( NULL );
1370cdf0e10cSrcweir             else
1371cdf0e10cSrcweir             {
1372cdf0e10cSrcweir                 if( GRFMGR_AUTOSWAPSTREAM_TEMP == pStream )
1373cdf0e10cSrcweir                     mbAutoSwapped = SwapOut();
1374cdf0e10cSrcweir                 else
1375cdf0e10cSrcweir                 {
1376cdf0e10cSrcweir                     mbAutoSwapped = SwapOut( pStream );
1377cdf0e10cSrcweir                     delete pStream;
1378cdf0e10cSrcweir                 }
1379cdf0e10cSrcweir             }
1380cdf0e10cSrcweir         }
1381cdf0e10cSrcweir 
1382cdf0e10cSrcweir         mbIsInSwapOut = sal_False;
1383cdf0e10cSrcweir     }
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir     if( mpSwapOutTimer )
1386cdf0e10cSrcweir         mpSwapOutTimer->Start();
1387cdf0e10cSrcweir 
1388cdf0e10cSrcweir     return 0L;
1389cdf0e10cSrcweir }
1390cdf0e10cSrcweir 
1391cdf0e10cSrcweir // ------------------------------------------------------------------------
1392cdf0e10cSrcweir 
operator >>(SvStream & rIStm,GraphicObject & rGraphicObj)1393cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, GraphicObject& rGraphicObj )
1394cdf0e10cSrcweir {
1395cdf0e10cSrcweir     VersionCompat   aCompat( rIStm, STREAM_READ );
1396cdf0e10cSrcweir     Graphic         aGraphic;
1397cdf0e10cSrcweir     GraphicAttr     aAttr;
1398cdf0e10cSrcweir     ByteString      aLink;
1399cdf0e10cSrcweir     sal_Bool            bLink;
1400cdf0e10cSrcweir 
1401cdf0e10cSrcweir     rIStm >> aGraphic >> aAttr >> bLink;
1402cdf0e10cSrcweir 
1403cdf0e10cSrcweir     rGraphicObj.SetGraphic( aGraphic );
1404cdf0e10cSrcweir     rGraphicObj.SetAttr( aAttr );
1405cdf0e10cSrcweir 
1406cdf0e10cSrcweir     if( bLink )
1407cdf0e10cSrcweir     {
1408cdf0e10cSrcweir         rIStm >> aLink;
1409cdf0e10cSrcweir         rGraphicObj.SetLink( UniString( aLink, RTL_TEXTENCODING_UTF8 ) );
1410cdf0e10cSrcweir     }
1411cdf0e10cSrcweir     else
1412cdf0e10cSrcweir         rGraphicObj.SetLink();
1413cdf0e10cSrcweir 
1414cdf0e10cSrcweir     rGraphicObj.SetSwapStreamHdl();
1415cdf0e10cSrcweir 
1416cdf0e10cSrcweir     return rIStm;
1417cdf0e10cSrcweir }
1418cdf0e10cSrcweir 
1419cdf0e10cSrcweir // ------------------------------------------------------------------------
1420cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const GraphicObject & rGraphicObj)1421cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const GraphicObject& rGraphicObj )
1422cdf0e10cSrcweir {
1423cdf0e10cSrcweir     VersionCompat   aCompat( rOStm, STREAM_WRITE, 1 );
1424cdf0e10cSrcweir     const sal_Bool      bLink =  rGraphicObj.HasLink();
1425cdf0e10cSrcweir 
1426cdf0e10cSrcweir     rOStm << rGraphicObj.GetGraphic() << rGraphicObj.GetAttr() << bLink;
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir     if( bLink )
1429cdf0e10cSrcweir         rOStm << ByteString( rGraphicObj.GetLink(), RTL_TEXTENCODING_UTF8 );
1430cdf0e10cSrcweir 
1431cdf0e10cSrcweir     return rOStm;
1432cdf0e10cSrcweir }
1433cdf0e10cSrcweir 
1434cdf0e10cSrcweir #define UNO_NAME_GRAPHOBJ_URLPREFIX "vnd.sun.star.GraphicObject:"
1435cdf0e10cSrcweir 
CreateGraphicObjectFromURL(const::rtl::OUString & rURL)1436cdf0e10cSrcweir GraphicObject GraphicObject::CreateGraphicObjectFromURL( const ::rtl::OUString &rURL )
1437cdf0e10cSrcweir {
1438cdf0e10cSrcweir     const String aURL( rURL ), aPrefix( RTL_CONSTASCII_STRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX) );
1439cdf0e10cSrcweir     if( aURL.Search( aPrefix ) == 0 )
1440cdf0e10cSrcweir     {
1441cdf0e10cSrcweir         // graphic manager url
1442cdf0e10cSrcweir         ByteString aUniqueID( String(rURL.copy( sizeof( UNO_NAME_GRAPHOBJ_URLPREFIX ) - 1 )), RTL_TEXTENCODING_UTF8 );
1443cdf0e10cSrcweir         return GraphicObject( aUniqueID );
1444cdf0e10cSrcweir     }
1445cdf0e10cSrcweir     else
1446cdf0e10cSrcweir     {
1447cdf0e10cSrcweir         Graphic     aGraphic;
1448cdf0e10cSrcweir         if ( aURL.Len() )
1449cdf0e10cSrcweir         {
1450*089177b8SArrigo Marchiori             /* We must obtain authorization from the current document, and we
1451*089177b8SArrigo Marchiori                need a ServiceManager to access it. Because utl::UcbStreamHelper
1452*089177b8SArrigo Marchiori                relies on the ::ucbhelper::ContentBroker instance, we will
1453*089177b8SArrigo Marchiori                use its ServiceManager. */
1454*089177b8SArrigo Marchiori             ::ucbhelper::ContentBroker* pBroker = ::ucbhelper::ContentBroker::get();
1455*089177b8SArrigo Marchiori             if ( pBroker ) {
1456*089177b8SArrigo Marchiori                 uno::Reference< lang::XMultiServiceFactory > xFactory = pBroker->getServiceManager();
1457*089177b8SArrigo Marchiori                 uno::Any desktop( xFactory->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ) );
1458*089177b8SArrigo Marchiori                 uno::Reference< com::sun::star::frame::XDesktop > xDesktop( desktop, uno::UNO_QUERY );
1459*089177b8SArrigo Marchiori                 if ( xDesktop.is() ) {
1460*089177b8SArrigo Marchiori                     uno::Reference< ::com::sun::star::frame::XFrame > xFrame = xDesktop->getCurrentFrame();
1461*089177b8SArrigo Marchiori                     if ( xFrame.is() ) {
1462*089177b8SArrigo Marchiori                         uno::Reference< ::com::sun::star::frame::XController > xController = xFrame->getController();
1463*089177b8SArrigo Marchiori                         if ( xController.is() ) {
1464*089177b8SArrigo Marchiori                             uno::Reference< ::com::sun::star::frame::XModel > xModel = xController->getModel();
1465*089177b8SArrigo Marchiori                             if ( xModel.is() ) {
1466*089177b8SArrigo Marchiori                                 uno::Reference< com::sun::star::document::XLinkAuthorizer > xLinkAuthorizer( xModel, uno::UNO_QUERY);
1467*089177b8SArrigo Marchiori                                 if ( xLinkAuthorizer.is() ) {
1468*089177b8SArrigo Marchiori                                     if ( !xLinkAuthorizer->authorizeLinks( aURL ) )
1469*089177b8SArrigo Marchiori                                         return GraphicObject( aGraphic );
1470*089177b8SArrigo Marchiori                                 }
1471*089177b8SArrigo Marchiori                             }
1472*089177b8SArrigo Marchiori                         }
1473*089177b8SArrigo Marchiori                     }
1474*089177b8SArrigo Marchiori                 }
1475*089177b8SArrigo Marchiori             }
1476*089177b8SArrigo Marchiori 
1477cdf0e10cSrcweir             SvStream*   pStream = utl::UcbStreamHelper::CreateStream( aURL, STREAM_READ );
1478cdf0e10cSrcweir             if( pStream )
1479cdf0e10cSrcweir                 GraphicConverter::Import( *pStream, aGraphic );
1480cdf0e10cSrcweir         }
1481cdf0e10cSrcweir 
1482cdf0e10cSrcweir         return GraphicObject( aGraphic );
1483cdf0e10cSrcweir     }
1484cdf0e10cSrcweir }
14852376739dSArmin Le Grand 
14862376739dSArmin Le Grand // calculate scalings between real image size and logic object size. This
14872376739dSArmin Le Grand // is necessary since the crop values are relative to original bitmap size
calculateCropScaling(double fWidth,double fHeight,double fLeftCrop,double fTopCrop,double fRightCrop,double fBottomCrop) const14882376739dSArmin Le Grand basegfx::B2DVector GraphicObject::calculateCropScaling(
14892376739dSArmin Le Grand     double fWidth,
14902376739dSArmin Le Grand     double fHeight,
14912376739dSArmin Le Grand     double fLeftCrop,
14922376739dSArmin Le Grand     double fTopCrop,
14932376739dSArmin Le Grand     double fRightCrop,
14942376739dSArmin Le Grand     double fBottomCrop) const
14952376739dSArmin Le Grand {
14962376739dSArmin Le Grand     const MapMode aMapMode100thmm(MAP_100TH_MM);
14972376739dSArmin Le Grand     Size aBitmapSize(GetPrefSize());
14982376739dSArmin Le Grand     double fFactorX(1.0);
14992376739dSArmin Le Grand     double fFactorY(1.0);
15002376739dSArmin Le Grand 
15012376739dSArmin Le Grand     if(MAP_PIXEL == GetPrefMapMode().GetMapUnit())
15022376739dSArmin Le Grand     {
15032376739dSArmin Le Grand         aBitmapSize = Application::GetDefaultDevice()->PixelToLogic(aBitmapSize, aMapMode100thmm);
15042376739dSArmin Le Grand     }
15052376739dSArmin Le Grand     else
15062376739dSArmin Le Grand     {
15072376739dSArmin Le Grand         aBitmapSize = Application::GetDefaultDevice()->LogicToLogic(aBitmapSize, GetPrefMapMode(), aMapMode100thmm);
15082376739dSArmin Le Grand     }
15092376739dSArmin Le Grand 
15102376739dSArmin Le Grand     const double fDivX(aBitmapSize.Width() - fLeftCrop - fRightCrop);
15112376739dSArmin Le Grand     const double fDivY(aBitmapSize.Height() - fTopCrop - fBottomCrop);
15122376739dSArmin Le Grand 
15132376739dSArmin Le Grand     if(!basegfx::fTools::equalZero(fDivX))
15142376739dSArmin Le Grand     {
15152376739dSArmin Le Grand         fFactorX = fabs(fWidth) / fDivX;
15162376739dSArmin Le Grand     }
15172376739dSArmin Le Grand 
15182376739dSArmin Le Grand     if(!basegfx::fTools::equalZero(fDivY))
15192376739dSArmin Le Grand     {
15202376739dSArmin Le Grand         fFactorY = fabs(fHeight) / fDivY;
15212376739dSArmin Le Grand     }
15222376739dSArmin Le Grand 
15232376739dSArmin Le Grand     return basegfx::B2DVector(fFactorX,fFactorY);
15242376739dSArmin Le Grand }
15252376739dSArmin Le Grand 
15263e526e08SArmin Le Grand // ------------------------------------------------------------------------
15273e526e08SArmin Le Grand // restart SwapOut timer
15283e526e08SArmin Le Grand 
restartSwapOutTimer() const15293e526e08SArmin Le Grand void GraphicObject::restartSwapOutTimer() const
15303e526e08SArmin Le Grand {
15313e526e08SArmin Le Grand     if( mpSwapOutTimer && mpSwapOutTimer->IsActive() )
15323e526e08SArmin Le Grand     {
15333e526e08SArmin Le Grand         mpSwapOutTimer->Start();
15343e526e08SArmin Le Grand     }
15353e526e08SArmin Le Grand }
15363e526e08SArmin Le Grand 
15372376739dSArmin Le Grand // eof
1538