xref: /AOO41X/main/svtools/inc/svtools/grfmgr.hxx (revision d327e58a21b15b860afd29f26e7ba444af09287b)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _GRFMGR_HXX
25 #define _GRFMGR_HXX
26 
27 #include <vcl/graph.hxx>
28 #include <svtools/svtdllapi.h>
29 
30 // -----------
31 // - Defines -
32 // -----------
33 
34 #define GRFMGR_DRAW_NOTCACHED               0x00000000UL
35 #define GRFMGR_DRAW_CACHED                  0x00000001UL
36 #define GRFMGR_DRAW_BILINEAR                0x00000002UL
37 #define GRFMGR_DRAW_USE_DRAWMODE_SETTINGS   0x00000004UL
38 #define GRFMGR_DRAW_SUBSTITUTE              0x00000008UL
39 #define GRFMGR_DRAW_NO_SUBSTITUTE           0x00000010UL
40 #define GRFMGR_DRAW_STANDARD                (GRFMGR_DRAW_CACHED|GRFMGR_DRAW_BILINEAR)
41 
42 // --------------------
43 // - AutoSwap Defines -
44 // --------------------
45 
46 #define GRFMGR_AUTOSWAPSTREAM_LINK      ((SvStream*)0x00000000UL)
47 #define GRFMGR_AUTOSWAPSTREAM_LOADED    ((SvStream*)0xfffffffdUL)
48 #define GRFMGR_AUTOSWAPSTREAM_TEMP      ((SvStream*)0xfffffffeUL)
49 #define GRFMGR_AUTOSWAPSTREAM_NONE      ((SvStream*)0xffffffffUL)
50 
51 // ----------------------
52 // - Adjustment Defines -
53 // ----------------------
54 
55 #define ADJUSTMENT_NONE                 0x00000000UL
56 #define ADJUSTMENT_DRAWMODE             0x00000001UL
57 #define ADJUSTMENT_COLORS               0x00000002UL
58 #define ADJUSTMENT_MIRROR               0x00000004UL
59 #define ADJUSTMENT_ROTATE               0x00000008UL
60 #define ADJUSTMENT_TRANSPARENCY         0x00000010UL
61 #define ADJUSTMENT_ALL                  0xFFFFFFFFUL
62 
63 // ---------
64 // - Enums -
65 // ---------
66 
67 enum GraphicDrawMode
68 {
69     GRAPHICDRAWMODE_STANDARD = 0,
70     GRAPHICDRAWMODE_GREYS = 1,
71     GRAPHICDRAWMODE_MONO = 2,
72     GRAPHICDRAWMODE_WATERMARK = 3
73 };
74 
75 // ------------
76 // - Forwards -
77 // ------------
78 
79 class GraphicManager;
80 class SvStream;
81 class BitmapWriteAccess;
82 class GraphicCache;
83 class VirtualDevice;
84 struct GrfSimpleCacheObj;
85 struct ImplTileInfo;
86 
87 // ---------------
88 // - GraphicAttr -
89 // ---------------
90 
91 class SVT_DLLPUBLIC GraphicAttr
92 {
93 private:
94 
95     long            mnDummy1;
96     long            mnDummy2;
97     double          mfGamma;
98     sal_uInt32      mnMirrFlags;
99     long            mnLeftCrop;
100     long            mnTopCrop;
101     long            mnRightCrop;
102     long            mnBottomCrop;
103     sal_uInt16          mnRotate10;
104     short           mnContPercent;
105     short           mnLumPercent;
106     short           mnRPercent;
107     short           mnGPercent;
108     short           mnBPercent;
109     sal_Bool            mbInvert;
110     sal_uInt8           mcTransparency;
111     GraphicDrawMode meDrawMode;
112 
113     void*           mpDummy;
114 
115 public:
116 
117                     GraphicAttr();
118                     ~GraphicAttr();
119 
120     sal_Bool            operator==( const GraphicAttr& rAttr ) const;
operator !=(const GraphicAttr & rAttr) const121     sal_Bool            operator!=( const GraphicAttr& rAttr ) const { return !( *this == rAttr ); }
122 
SetDrawMode(GraphicDrawMode eDrawMode)123     void            SetDrawMode( GraphicDrawMode eDrawMode ) { meDrawMode = eDrawMode; }
GetDrawMode() const124     GraphicDrawMode GetDrawMode() const { return meDrawMode; }
125 
SetMirrorFlags(sal_uLong nMirrFlags)126     void            SetMirrorFlags( sal_uLong nMirrFlags ) { mnMirrFlags = nMirrFlags; }
GetMirrorFlags() const127     sal_uLong           GetMirrorFlags() const { return mnMirrFlags; }
128 
SetCrop(long nLeft_100TH_MM,long nTop_100TH_MM,long nRight_100TH_MM,long nBottom_100TH_MM)129     void            SetCrop( long nLeft_100TH_MM, long nTop_100TH_MM, long nRight_100TH_MM, long nBottom_100TH_MM )
130                     {
131                         mnLeftCrop = nLeft_100TH_MM; mnTopCrop = nTop_100TH_MM;
132                         mnRightCrop = nRight_100TH_MM; mnBottomCrop = nBottom_100TH_MM;
133                     }
GetLeftCrop() const134     long            GetLeftCrop() const { return mnLeftCrop; }
GetTopCrop() const135     long            GetTopCrop() const { return mnTopCrop; }
GetRightCrop() const136     long            GetRightCrop() const { return mnRightCrop; }
GetBottomCrop() const137     long            GetBottomCrop() const { return mnBottomCrop; }
138 
SetRotation(sal_uInt16 nRotate10)139     void            SetRotation( sal_uInt16 nRotate10 ) { mnRotate10 = nRotate10; }
GetRotation() const140     sal_uInt16          GetRotation() const { return mnRotate10; }
141 
SetLuminance(short nLuminancePercent)142     void            SetLuminance( short nLuminancePercent ) { mnLumPercent = nLuminancePercent; }
GetLuminance() const143     short           GetLuminance() const { return mnLumPercent; }
144 
SetContrast(short nContrastPercent)145     void            SetContrast( short nContrastPercent ) { mnContPercent = nContrastPercent; }
GetContrast() const146     short           GetContrast() const { return mnContPercent; }
147 
SetChannelR(short nChannelRPercent)148     void            SetChannelR( short nChannelRPercent ) { mnRPercent = nChannelRPercent; }
GetChannelR() const149     short           GetChannelR() const { return mnRPercent; }
150 
SetChannelG(short nChannelGPercent)151     void            SetChannelG( short nChannelGPercent ) { mnGPercent = nChannelGPercent; }
GetChannelG() const152     short           GetChannelG() const { return mnGPercent; }
153 
SetChannelB(short nChannelBPercent)154     void            SetChannelB( short nChannelBPercent ) { mnBPercent = nChannelBPercent; }
GetChannelB() const155     short           GetChannelB() const { return mnBPercent; }
156 
SetGamma(double fGamma)157     void            SetGamma( double fGamma ) { mfGamma = fGamma; }
GetGamma() const158     double          GetGamma() const { return mfGamma; }
159 
SetInvert(sal_Bool bInvert)160     void            SetInvert( sal_Bool bInvert ) { mbInvert = bInvert; }
IsInvert() const161     sal_Bool            IsInvert() const { return mbInvert; }
162 
SetTransparency(sal_uInt8 cTransparency)163     void            SetTransparency( sal_uInt8 cTransparency ) { mcTransparency = cTransparency; }
GetTransparency() const164     sal_uInt8           GetTransparency() const { return mcTransparency; }
165 
IsSpecialDrawMode() const166     sal_Bool            IsSpecialDrawMode() const { return( meDrawMode != GRAPHICDRAWMODE_STANDARD ); }
IsMirrored() const167     sal_Bool            IsMirrored() const { return( mnMirrFlags != 0UL ); }
IsCropped() const168     sal_Bool            IsCropped() const
169                     {
170                         return( mnLeftCrop != 0 || mnTopCrop != 0 ||
171                                 mnRightCrop != 0 || mnBottomCrop != 0 );
172                     }
IsRotated() const173     sal_Bool            IsRotated() const { return( ( mnRotate10 % 3600 ) != 0 ); }
IsTransparent() const174     sal_Bool            IsTransparent() const { return( mcTransparency > 0 ); }
IsAdjusted() const175     sal_Bool            IsAdjusted() const
176                     {
177                         return( mnLumPercent != 0 || mnContPercent != 0 || mnRPercent != 0 ||
178                                 mnGPercent != 0 || mnBPercent != 0 || mfGamma != 1.0 || mbInvert );
179                     }
180 
181     friend SvStream& operator<<( SvStream& rOStm, const GraphicAttr& rAttr );
182     friend SvStream& operator>>( SvStream& rIStm, GraphicAttr& rAttr );
183 };
184 
185 // -----------------
186 // - GraphicObject -
187 // -----------------
188 
189 class SVT_DLLPUBLIC GraphicObject : public SvDataCopyStream
190 {
191     friend class GraphicManager;
192 
193 private:
194 
195     static GraphicManager*  mpGlobalMgr;
196 
197     Graphic                 maGraphic;
198     GraphicAttr             maAttr;
199     Size                    maPrefSize;
200     MapMode                 maPrefMapMode;
201     sal_uLong                   mnSizeBytes;
202     GraphicType             meType;
203     GraphicManager*         mpMgr;
204     String*                 mpLink;
205     Link*                   mpSwapStreamHdl;
206     String*                 mpUserData;
207     Timer*                  mpSwapOutTimer;
208     GrfSimpleCacheObj*      mpSimpleCache;
209     sal_uLong                   mnAnimationLoopCount;
210 
211     // a unique increasing ID to be able to say which data change is older
212     sal_uLong               mnDataChangeTimeStamp;
213 
214     void*                   mpDummy2;
215     sal_Bool                mbAutoSwapped   : 1;
216     sal_Bool                mbTransparent   : 1;
217     sal_Bool                mbAnimated      : 1;
218     sal_Bool                mbEPS           : 1;
219     sal_Bool                mbIsInSwapIn    : 1;
220     sal_Bool                mbIsInSwapOut   : 1;
221     sal_Bool                mbAlpha         : 1;
222     sal_Bool                mbDummyFlag8    : 1;
223 
224     void                    SVT_DLLPRIVATE ImplConstruct();
225     void                    SVT_DLLPRIVATE ImplAssignGraphicData();
226     void                    SVT_DLLPRIVATE ImplSetGraphicManager( const GraphicManager* pMgr,
227                                                    const ByteString* pID = NULL,
228                                                    const GraphicObject* pCopyObj = NULL );
229     void                    SVT_DLLPRIVATE ImplAutoSwapIn();
ImplIsAutoSwapped() const230     sal_Bool                    SVT_DLLPRIVATE ImplIsAutoSwapped() const { return mbAutoSwapped; }
231     sal_Bool                    SVT_DLLPRIVATE ImplGetCropParams( OutputDevice* pOut, Point& rPt, Size& rSz, const GraphicAttr* pAttr,
232                                                PolyPolygon& rClipPolyPoly, sal_Bool& bRectClipRegion ) const;
233 
234     /** Render a given number of tiles in an optimized way
235 
236         This method recursively subdivides the tile rendering problem
237         in smaller parts, i.e. rendering output size x with few tiles
238         of size y, which in turn are generated from the original
239         bitmap in a recursive fashion. The subdivision size can be
240         controlled by the exponent argument, which specifies the
241         minimal number of smaller tiles used in one recursion
242         step. The resulting tile size is given as the integer number
243         of repetitions of the original bitmap along x and y. As the
244         exponent need not necessarily divide these numbers without
245         remainder, the repetition counts are effectively converted to
246         base-exponent numbers, where each place denotes the number of
247         times the corresponding tile size is rendered.
248 
249         @param rVDev
250         Virtual device to render everything into
251 
252         @param nExponent
253         Number of repetitions per subdivision step, _must_ be greater than 1
254 
255         @param nNumTilesX
256         Number of original tiles to generate in x direction
257 
258         @param nNumTilesY
259         Number of original tiles to generate in y direction
260 
261         @param rTileSizePixel
262         Size in pixel of the original tile bitmap to render it in
263 
264         @param pAttr
265         Graphic attributes to be used for rendering
266 
267         @param nFlags
268         Graphic flags to be used for rendering
269 
270         @param rCurrPos
271         Current output point for this recursion level (should start with (0,0))
272 
273         @return true, if everything was successfully rendered.
274     */
275     bool                    SVT_DLLPRIVATE ImplRenderTempTile( VirtualDevice& rVDev, int nExponent,
276                                                 int nNumTilesX, int nNumTilesY,
277                                                 const Size& rTileSizePixel,
278                                                 const GraphicAttr* pAttr, sal_uLong nFlags );
279 
280     /// internally called by ImplRenderTempTile()
281     bool                    SVT_DLLPRIVATE ImplRenderTileRecursive( VirtualDevice& rVDev, int nExponent, int nMSBFactor,
282                                                      int nNumOrigTilesX, int nNumOrigTilesY,
283                                                      int nRemainderTilesX, int nRemainderTilesY,
284                                                      const Size& rTileSizePixel, const GraphicAttr* pAttr,
285                                                      sal_uLong nFlags, ImplTileInfo& rTileInfo );
286 
287     bool                    SVT_DLLPRIVATE ImplDrawTiled( OutputDevice* pOut, const Rectangle& rArea, const Size& rSizePixel,
288                                            const Size& rOffset, const GraphicAttr* pAttr, sal_uLong nFlags, int nTileCacheSize1D );
289 
290     bool                    SVT_DLLPRIVATE ImplDrawTiled( OutputDevice& rOut, const Point& rPos,
291                                            int nNumTilesX, int nNumTilesY,
292                                            const Size& rTileSize,
293                                            const GraphicAttr* pAttr, sal_uLong nFlags );
294 
295     void                    SVT_DLLPRIVATE ImplTransformBitmap( BitmapEx&           rBmpEx,
296                                                  const GraphicAttr& rAttr,
297                                                  const Size&        rCropLeftTop,
298                                                  const Size&        rCropRightBottom,
299                                                  const Rectangle&   rCropRect,
300                                                  const Size&        rDstSize,
301                                                  sal_Bool               bEnlarge ) const;
302 
303                             DECL_LINK( ImplAutoSwapOutHdl, void* );
304 
305     // Handle evtl. needed AfterDataChanges, needs to be called when new
306     // graphic data is swapped in/added to the GraphicManager
307     void ImplAfterDataChange();
308 
309 protected:
310 
311     virtual void            GraphicManagerDestroyed();
312     virtual SvStream*       GetSwapStream() const;
313 
314     // !!! to be removed
315     virtual sal_uLong           GetReleaseFromCache() const;
316 
317     virtual void            Load( SvStream& );
318     virtual void            Save( SvStream& );
319     virtual void            Assign( const SvDataCopyStream& );
320 
321 public:
322 
323                             TYPEINFO();
324 
325                             GraphicObject( const GraphicManager* pMgr = NULL );
326                             GraphicObject( const Graphic& rGraphic, const GraphicManager* pMgr = NULL );
327                             GraphicObject( const Graphic& rGraphic, const String& rLink, const GraphicManager* pMgr = NULL );
328                             GraphicObject( const GraphicObject& rCacheObj, const GraphicManager* pMgr = NULL );
329                             GraphicObject( const ByteString& rUniqueID, const GraphicManager* pMgr = NULL );
330                             ~GraphicObject();
331 
332     GraphicObject&          operator=( const GraphicObject& rCacheObj );
333     sal_Bool                    operator==( const GraphicObject& rCacheObj ) const;
operator !=(const GraphicObject & rCacheObj) const334     sal_Bool                    operator!=( const GraphicObject& rCacheObj ) const { return !( *this == rCacheObj ); }
335 
HasSwapStreamHdl() const336     sal_Bool                    HasSwapStreamHdl() const { return( mpSwapStreamHdl != NULL && mpSwapStreamHdl->IsSet() ); }
337     void                    SetSwapStreamHdl();
338     void                    SetSwapStreamHdl( const Link& rHdl, const sal_uLong nSwapOutTimeout = 0UL );
339     Link                    GetSwapStreamHdl() const;
GetSwapOutTimeout() const340     sal_uLong                   GetSwapOutTimeout() const { return( mpSwapOutTimer ? mpSwapOutTimer->GetTimeout() : 0 ); }
341 
342     void                    FireSwapInRequest();
343     void                    FireSwapOutRequest();
344 
345     void                    SetGraphicManager( const GraphicManager& rMgr );
GetGraphicManager() const346     GraphicManager&         GetGraphicManager() const { return *mpMgr; }
347 
348     sal_Bool                    IsCached( OutputDevice* pOut, const Point& rPt, const Size& rSz,
349                                       const GraphicAttr* pAttr = NULL, sal_uLong nFlags = GRFMGR_DRAW_STANDARD) const;
350     void                    ReleaseFromCache();
351 
352     const Graphic&          GetGraphic() const;
353     void                    SetGraphic( const Graphic& rGraphic, const GraphicObject* pCopyObj = 0);
354     void                    SetGraphic( const Graphic& rGraphic, const String& rLink );
355 
356     /** Get graphic transformed according to given attributes
357 
358         This method returns a Graphic transformed, cropped and scaled
359         to the given parameters, ready to be rendered to printer or
360         display. The returned graphic has the same visual appearance
361         as if it had been drawn via GraphicObject::Draw() to a
362         specific output device.
363 
364         @param rDestSize
365         Desired output size in logical coordinates. The mapmode to
366         interpret these logical coordinates in is given by the second
367         parameter, rDestMap.
368 
369         @param rDestMap
370         Mapmode the output should be interpreted in. This is used to
371         interpret rDestSize, to set the appropriate PrefMapMode on the
372         returned Graphic, and to deal correctly with metafile graphics.
373 
374         @param rAttr
375         Graphic attributes used to transform the graphic. This
376         includes cropping, rotation, mirroring, and various color
377         adjustment parameters.
378 
379         @return the readily transformed Graphic
380      */
381     Graphic                 GetTransformedGraphic( const Size& rDestSize, const MapMode& rDestMap, const GraphicAttr& rAttr ) const;
382     Graphic                 GetTransformedGraphic( const GraphicAttr* pAttr = NULL ) const; // TODO: Change to Impl
383 
384     void                    SetAttr( const GraphicAttr& rAttr );
GetAttr() const385     const GraphicAttr&      GetAttr() const { return maAttr; }
386 
HasLink() const387     sal_Bool                    HasLink() const { return( mpLink != NULL && mpLink->Len() > 0 ); }
388     void                    SetLink();
389     void                    SetLink( const String& rLink );
390     String                  GetLink() const;
391 
HasUserData() const392     sal_Bool                    HasUserData() const { return( mpUserData != NULL && mpUserData->Len() > 0 ); }
393     void                    SetUserData();
394     void                    SetUserData( const String& rUserData );
395     String                  GetUserData() const;
396 
397     ByteString              GetUniqueID() const;
398 
GetType() const399     GraphicType             GetType() const { return meType; }
GetPrefSize() const400     const Size&             GetPrefSize() const { return maPrefSize; }
GetPrefMapMode() const401     const MapMode&          GetPrefMapMode() const { return maPrefMapMode; }
GetSizeBytes() const402     sal_uLong               GetSizeBytes() const { return mnSizeBytes; }
403     sal_uLong               GetChecksum() const;
IsTransparent() const404     sal_Bool                IsTransparent() const { return mbTransparent; }
IsAlpha() const405     sal_Bool                IsAlpha() const { return mbAlpha; }
IsAnimated() const406     sal_Bool                IsAnimated() const { return mbAnimated; }
IsEPS() const407     sal_Bool                IsEPS() const { return mbEPS; }
408 
409     void                    ResetAnimationLoopCount();
410     List*                   GetAnimationInfoList() const;
GetAnimationNotifyHdl() const411     Link                    GetAnimationNotifyHdl() const { return maGraphic.GetAnimationNotifyHdl(); }
412     void                    SetAnimationNotifyHdl( const Link& rLink );
413 
414     sal_Bool                    SwapOut();
415     sal_Bool                    SwapOut( SvStream* pOStm );
416     sal_Bool                    SwapIn();
417     sal_Bool                    SwapIn( SvStream* pIStm );
418 
IsInSwapIn() const419     sal_Bool                    IsInSwapIn() const { return mbIsInSwapIn; }
IsInSwapOut() const420     sal_Bool                    IsInSwapOut() const { return mbIsInSwapOut; }
IsInSwap() const421     sal_Bool                    IsInSwap() const { return( mbIsInSwapOut || mbIsInSwapOut ); }
IsSwappedOut() const422     sal_Bool                    IsSwappedOut() const { return( mbAutoSwapped || maGraphic.IsSwapOut() ); }
423     void                    SetSwapState();
424 
425     sal_Bool                    Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz,
426                                   const GraphicAttr* pAttr = NULL, sal_uLong nFlags = GRFMGR_DRAW_STANDARD );
427 
428     sal_Bool DrawWithPDFHandling( OutputDevice& rOutDev,
429                               const Point& rPt, const Size& rSz,
430                               const GraphicAttr* pGrfAttr = NULL,
431                               const sal_uLong nFlags = GRFMGR_DRAW_STANDARD );
432 
433     /** Draw the graphic repeatedly into the given output rectangle
434 
435         @param pOut
436         OutputDevice where the rendering should take place
437 
438         @param rArea
439         The output area that is filled with tiled instances of this graphic
440 
441         @param rSize
442         The actual size of a single tile
443 
444         @param rOffset
445         Offset from the left, top position of rArea, where to start
446         the tiling. The upper left corner of the graphic tilings will
447         virtually start at this position. Concretely, only that many
448         tiles are drawn to completely fill the given output area.
449 
450         @param pAttr
451         Optional GraphicAttr
452 
453         @param nFlags
454         Optional rendering flags
455 
456         @param nTileCacheSize1D
457         Optional dimension of the generated cache tiles. The pOut sees
458         a number of tile draws, which have approximately
459         nTileCacheSize1D times nTileCacheSize1D bitmap sizes if the
460         tile bitmap is smaller. Otherwise, the tile is drawn as
461         is. This is useful if e.g. you want only a few, very large
462         bitmap drawings appear on the outdev.
463 
464         @return sal_True, if drawing completed successfully
465      */
466     sal_Bool                    DrawTiled( OutputDevice* pOut, const Rectangle& rArea, const Size& rSize,
467                                        const Size& rOffset, const GraphicAttr* pAttr = NULL,
468                                        sal_uLong nFlags = GRFMGR_DRAW_STANDARD, int nTileCacheSize1D=128 );
469 
470     sal_Bool                    StartAnimation( OutputDevice* pOut, const Point& rPt, const Size& rSz, long nExtraData = 0L,
471                                             const GraphicAttr* pAttr = NULL, sal_uLong nFlags = GRFMGR_DRAW_STANDARD,
472                                             OutputDevice* pFirstFrameOutDev = NULL );
473 
474     void                    StopAnimation( OutputDevice* pOut = NULL, long nExtraData = 0L );
475 
476     friend SvStream&        operator<<( SvStream& rOStm, const GraphicObject& rGraphicObj );
477     friend SvStream&        operator>>( SvStream& rIStm, GraphicObject& rGraphicObj );
478 
479     static GraphicObject CreateGraphicObjectFromURL( const ::rtl::OUString &rURL );
480 
481     // create CropScaling information
482     // fWidth, fHeight: object size
483     // f*Crop: crop values relative to original bitmap size
484     basegfx::B2DVector calculateCropScaling(
485         double fWidth,
486         double fHeight,
487         double fLeftCrop,
488         double fTopCrop,
489         double fRightCrop,
490         double fBottomCrop) const;
491 
492     // read access
GetDataChangeTimeStamp() const493     sal_uLong GetDataChangeTimeStamp() const { return mnDataChangeTimeStamp; }
494 
495     // restart SwapOut timer; this is like touching in a cache to reset to the full timeout value
496     void restartSwapOutTimer() const;
497 };
498 
499 // ------------------
500 // - GraphicManager -
501 // ------------------
502 
503 class SVT_DLLPUBLIC GraphicManager
504 {
505     friend class GraphicObject;
506     friend class GraphicDisplayCacheEntry;
507 
508 private:
509 
510     List            maObjList;
511     GraphicCache*   mpCache;
512 
GraphicManager(const GraphicManager &)513                     GraphicManager( const GraphicManager& ) {}
operator =(const GraphicManager &)514     GraphicManager& operator=( const GraphicManager& ) { return *this; }
515 
516     sal_Bool            SVT_DLLPRIVATE ImplDraw( OutputDevice* pOut, const Point& rPt,
517                               const Size& rSz, GraphicObject& rObj,
518                               const GraphicAttr& rAttr,
519                               const sal_uLong nFlags, sal_Bool& rCached );
520 
521     sal_Bool            SVT_DLLPRIVATE ImplCreateOutput( OutputDevice* pOut, const Point& rPt, const Size& rSz,
522                                       const BitmapEx& rBmpEx, const GraphicAttr& rAttr,
523                                       const sal_uLong nFlags, BitmapEx* pBmpEx = NULL );
524     sal_Bool            SVT_DLLPRIVATE ImplCreateOutput( OutputDevice* pOut,
525                                       const Point& rPt, const Size& rSz,
526                                       const GDIMetaFile& rMtf, const GraphicAttr& rAttr,
527                                       const sal_uLong nFlags, GDIMetaFile& rOutMtf, BitmapEx& rOutBmpEx );
528 
529     sal_Bool            SVT_DLLPRIVATE ImplCreateScaled( const BitmapEx& rBmpEx,
530                                       long* pMapIX, long* pMapFX, long* pMapIY, long* pMapFY,
531                                       long nStartX, long nEndX, long nStartY, long nEndY,
532                                       BitmapEx& rOutBmpEx );
533 
534     sal_Bool            SVT_DLLPRIVATE ImplCreateRotatedScaled( const BitmapEx& rBmpEx,
535                                              sal_uInt16 nRot10, const Size& rOutSzPix, const Size& rUntSzPix,
536                                              long* pMapIX, long* pMapFX, long* pMapIY, long* pMapFY,
537                                              long nStartX, long nEndX, long nStartY, long nEndY,
538                                              BitmapEx& rOutBmpEx );
539 
540     static void     SVT_DLLPRIVATE ImplAdjust( BitmapEx& rBmpEx, const GraphicAttr& rAttr, sal_uLong nAdjustmentFlags );
541     static void     SVT_DLLPRIVATE ImplAdjust( GDIMetaFile& rMtf, const GraphicAttr& rAttr, sal_uLong nAdjustmentFlags );
542     static void     SVT_DLLPRIVATE ImplAdjust( Animation& rAnimation, const GraphicAttr& rAttr, sal_uLong nAdjustmentFlags );
543 
544     static void     SVT_DLLPRIVATE ImplDraw( OutputDevice* pOut, const Point& rPt, const Size& rSz,
545                               const GDIMetaFile& rMtf, const GraphicAttr& rAttr );
546 
547                     // Only used by GraphicObject's Ctor's and Dtor's
548     void            SVT_DLLPRIVATE ImplRegisterObj( const GraphicObject& rObj, Graphic& rSubstitute,
549                                      const ByteString* pID = NULL,
550                                      const GraphicObject* pCopyObj = NULL );
551     void            SVT_DLLPRIVATE ImplUnregisterObj( const GraphicObject& rObj );
ImplHasObjects() const552     inline sal_Bool     SVT_DLLPRIVATE ImplHasObjects() const { return( maObjList.Count() > 0UL ); }
553 
554                     // Only used in swap case by GraphicObject
555     void            SVT_DLLPRIVATE ImplGraphicObjectWasSwappedOut( const GraphicObject& rObj );
556     sal_Bool            SVT_DLLPRIVATE ImplFillSwappedGraphicObject( const GraphicObject& rObj, Graphic& rSubstitute );
557     void            SVT_DLLPRIVATE ImplGraphicObjectWasSwappedIn( const GraphicObject& rObj );
558 
559     ByteString      SVT_DLLPRIVATE ImplGetUniqueID( const GraphicObject& rObj ) const;
560 
561     // This method allows to check memory footprint for all currently swapped in GraphicObjects on this GraphicManager
562     // which are based on Bitmaps. This is needed on 32Bit systems and only does something on those systems. The problem
563     // to solve is that normally the SwapOut is timer-driven, but even with short timer settings there are situations
564     // where this does not trigger - or in other words: A maximum limitation for GraphicManagers was not in place before.
565     // For 32Bit systems this leads to situations where graphics will be missing. This method will actively swap out
566     // the longest swapped in graphics until a maximum memory boundary (derived from user settings in tools/options/memory)
567     // is no longer exceeded
568     void ImplCheckSizeOfSwappedInGraphics();
569 
570 public:
571 
572                     GraphicManager( sal_uLong nCacheSize = 10000000UL, sal_uLong nMaxObjCacheSize = 2400000UL );
573                     ~GraphicManager();
574 
575     void            SetMaxCacheSize( sal_uLong nNewCacheSize );
576     sal_uLong           GetMaxCacheSize() const;
577 
578     void            SetMaxObjCacheSize( sal_uLong nNewMaxObjSize, sal_Bool bDestroyGreaterCached = sal_False );
579     sal_uLong           GetMaxObjCacheSize() const;
580 
581     sal_uLong           GetUsedCacheSize() const;
582     sal_uLong           GetFreeCacheSize() const;
583 
584     void            SetCacheTimeout( sal_uLong nTimeoutSeconds );
585     sal_uLong           GetCacheTimeout() const;
586 
587     void            ClearCache();
588 
589     void            ReleaseFromCache( const GraphicObject& rObj );
590 
591     sal_Bool            IsInCache( OutputDevice* pOut, const Point& rPt, const Size& rSz,
592                                const GraphicObject& rObj, const GraphicAttr& rAttr ) const;
593 
594     sal_Bool            DrawObj( OutputDevice* pOut, const Point& rPt, const Size& rSz,
595                              GraphicObject& rObj, const GraphicAttr& rAttr,
596                              const sal_uLong nFlags, sal_Bool& rCached );
597 };
598 
599 #endif // _GRFMGR_HXX
600