xref: /trunk/main/vcl/source/gdi/graph.cxx (revision ddde725d)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 
27 #include <vcl/outdev.hxx>
28 #include <vcl/svapp.hxx>
29 #include <vcl/graph.hxx>
30 #include <vcl/metaact.hxx>
31 #include <impgraph.hxx>
32 #include <comphelper/processfactory.hxx>
33 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
34 #include <com/sun/star/graphic/XGraphicProvider.hpp>
35 #include <com/sun/star/lang/XUnoTunnel.hpp>
36 #include <com/sun/star/lang/XTypeProvider.hpp>
37 #include <com/sun/star/graphic/XGraphic.hpp>
38 
39 // -----------------------
40 // - Compression defines -
41 // -----------------------
42 
43 #define COMPRESS_OWN                ('S'|('D'<<8UL))
44 #define COMPRESS_NONE               ( 0UL )
45 #define RLE_8                       ( 1UL )
46 #define RLE_4                       ( 2UL )
47 #define BITFIELDS                   ( 3UL )
48 #define ZCOMPRESS                   ( COMPRESS_OWN | 0x01000000UL ) /* == 'SD01' (binary) */
49 
50 using namespace ::com::sun::star;
51 
52 // -----------------------
53 // - Default-Drawmethode -
54 // -----------------------
55 
ImplDrawDefault(OutputDevice * pOutDev,const UniString * pText,Font * pFont,const Bitmap * pBitmap,const BitmapEx * pBitmapEx,const Point & rDestPt,const Size & rDestSize)56 static void ImplDrawDefault( OutputDevice* pOutDev, const UniString* pText,
57                              Font* pFont, const Bitmap* pBitmap, const BitmapEx* pBitmapEx,
58                              const Point& rDestPt, const Size& rDestSize )
59 {
60     sal_uInt16      nPixel = (sal_uInt16) pOutDev->PixelToLogic( Size( 1, 1 ) ).Width();
61     sal_uInt16      nPixelWidth = nPixel;
62     Point       aPoint( rDestPt.X() + nPixelWidth, rDestPt.Y() + nPixelWidth );
63     Size        aSize( rDestSize.Width() - ( nPixelWidth << 1 ), rDestSize.Height() - ( nPixelWidth << 1 ) );
64     sal_Bool        bFilled = ( pBitmap != NULL || pBitmapEx != NULL || pFont != NULL );
65     Rectangle   aBorderRect( aPoint, aSize );
66 
67     pOutDev->Push();
68 
69     pOutDev->SetFillColor();
70 
71     // Auf dem Drucker ein schwarzes Rechteck und auf dem Bildschirm eins mit 3D-Effekt
72     if ( pOutDev->GetOutDevType() == OUTDEV_PRINTER )
73         pOutDev->SetLineColor( COL_BLACK );
74     else
75     {
76         aBorderRect.Left() += nPixel;
77         aBorderRect.Top() += nPixel;
78 
79         pOutDev->SetLineColor( COL_LIGHTGRAY );
80         pOutDev->DrawRect( aBorderRect );
81 
82         aBorderRect.Left() -= nPixel;
83         aBorderRect.Top() -= nPixel;
84         aBorderRect.Right() -= nPixel;
85         aBorderRect.Bottom() -= nPixel;
86         pOutDev->SetLineColor( COL_GRAY );
87     }
88 
89     pOutDev->DrawRect( aBorderRect );
90 
91     aPoint.X() += nPixelWidth + 2*nPixel;
92     aPoint.Y() += nPixelWidth + 2*nPixel;
93     aSize.Width() -= 2*nPixelWidth + 4*nPixel;
94     aSize.Height() -= 2*nPixelWidth + 4*nPixel;
95 
96     if( aSize.Width() > 0 && aSize.Height() > 0
97         && (  ( pBitmap && !!*pBitmap ) || ( pBitmapEx && !!*pBitmapEx ) ) )
98     {
99         Size aBitmapSize( pOutDev->PixelToLogic( pBitmap ? pBitmap->GetSizePixel() : pBitmapEx->GetSizePixel() ) );
100 
101         if( aSize.Height() > aBitmapSize.Height() && aSize.Width() > aBitmapSize.Width() )
102         {
103             if ( pBitmap )
104                 pOutDev->DrawBitmap( aPoint, *pBitmap );
105             else
106                 pOutDev->DrawBitmapEx( aPoint, *pBitmapEx );
107             aPoint.X() += aBitmapSize.Width() + 2*nPixel;
108             aSize.Width() -= aBitmapSize.Width() + 2*nPixel;
109         }
110     }
111 
112     if ( aSize.Width() > 0 && aSize.Height() > 0 && pFont && pText && pText->Len()
113          && !(!pOutDev->IsOutputEnabled() /*&& pOutDev->GetConnectMetaFile() */) )
114     {
115         MapMode aMapMode( MAP_POINT );
116         Size    aSz = pOutDev->LogicToLogic( Size( 0, 12 ), &aMapMode, NULL );
117         long    nThreshold = aSz.Height() / 2;
118         long    nStep = nThreshold / 3;
119 
120         if ( !nStep )
121             nStep = aSz.Height() - nThreshold;
122 
123         for(;; aSz.Height() -= nStep )
124         {
125             pFont->SetSize( aSz );
126             pOutDev->SetFont( *pFont );
127 
128             long nTextHeight = pOutDev->GetTextHeight();
129             long nTextWidth = pOutDev->GetTextWidth( *pText );
130             if ( nTextHeight )
131             {
132                 // Die N"aherung ber"ucksichtigt keine Ungenauigkeiten durch
133                 // Wortumbr"uche
134                 long nLines = aSize.Height() / nTextHeight;
135                 long nWidth = aSize.Width() * nLines; // N"aherung!!!
136 
137                 if ( nTextWidth <= nWidth || aSz.Height() <= nThreshold )
138                 {
139                     sal_uInt16 nStart = 0;
140                     sal_uInt16 nLen = 0;
141 
142                     while( nStart < pText->Len() && pText->GetChar( nStart ) == ' ' )
143                         nStart++;
144                     while( nStart+nLen < pText->Len() && pText->GetChar( nStart+nLen ) != ' ' )
145                         nLen++;
146                     while( nStart < pText->Len() && nLines-- )
147                     {
148                         sal_uInt16 nNext = nLen;
149                         do
150                         {
151                             while ( nStart+nNext < pText->Len() && pText->GetChar( nStart+nNext ) == ' ' )
152                                 nNext++;
153                             while ( nStart+nNext < pText->Len() && pText->GetChar( nStart+nNext ) != ' ' )
154                                 nNext++;
155                             nTextWidth = pOutDev->GetTextWidth( *pText, nStart, nNext );
156                             if ( nTextWidth > aSize.Width() )
157                                 break;
158                             nLen = nNext;
159                         }
160                         while ( nStart+nNext < pText->Len() );
161 
162                         sal_uInt16 n = nLen;
163                         nTextWidth = pOutDev->GetTextWidth( *pText, nStart, n );
164                         while( nTextWidth > aSize.Width() )
165                             nTextWidth = pOutDev->GetTextWidth( *pText, nStart, --n );
166                         pOutDev->DrawText( aPoint, *pText, nStart, n );
167 
168                         aPoint.Y() += nTextHeight;
169                         nStart      = sal::static_int_cast<sal_uInt16>(nStart + nLen);
170                         nLen        = nNext-nLen;
171                         while( nStart < pText->Len() && pText->GetChar( nStart ) == ' ' )
172                         {
173                             nStart++;
174                             nLen--;
175                         }
176                     }
177                     break;
178                 }
179             }
180             else
181                 break;
182         }
183     }
184 
185     // Falls die Default-Graphik keinen Inhalt hat,
186     // malen wir ein rotes Kreuz
187     if( !bFilled )
188     {
189         aBorderRect.Left()++;
190         aBorderRect.Top()++;
191         aBorderRect.Right()--;
192         aBorderRect.Bottom()--;
193 
194         pOutDev->SetLineColor( COL_LIGHTRED );
195         pOutDev->DrawLine( aBorderRect.TopLeft(), aBorderRect.BottomRight() );
196         pOutDev->DrawLine( aBorderRect.TopRight(), aBorderRect.BottomLeft() );
197     }
198 
199     pOutDev->Pop();
200 }
201 
202 // -----------
203 // - Graphic -
204 // -----------
205 
206 TYPEINIT1_AUTOFACTORY( Graphic, SvDataCopyStream );
207 
208 // ------------------------------------------------------------------------
209 
Graphic()210 Graphic::Graphic()
211 {
212     mpImpGraphic = new ImpGraphic;
213 }
214 
215 // ------------------------------------------------------------------------
216 
Graphic(const Graphic & rGraphic)217 Graphic::Graphic( const Graphic& rGraphic ) :
218 SvDataCopyStream()
219 {
220     if( rGraphic.IsAnimated() )
221         mpImpGraphic = new ImpGraphic( *rGraphic.mpImpGraphic );
222     else
223     {
224         mpImpGraphic = rGraphic.mpImpGraphic;
225         mpImpGraphic->mnRefCount++;
226     }
227 }
228 
229 // ------------------------------------------------------------------------
230 
Graphic(const Bitmap & rBmp)231 Graphic::Graphic( const Bitmap& rBmp )
232 {
233     mpImpGraphic = new ImpGraphic( rBmp );
234 }
235 
236 // ------------------------------------------------------------------------
237 
Graphic(const BitmapEx & rBmpEx)238 Graphic::Graphic( const BitmapEx& rBmpEx )
239 {
240     mpImpGraphic = new ImpGraphic( rBmpEx );
241 }
242 
243 // ------------------------------------------------------------------------
244 
Graphic(const SvgDataPtr & rSvgDataPtr)245 Graphic::Graphic(const SvgDataPtr& rSvgDataPtr)
246 {
247     mpImpGraphic = new ImpGraphic(rSvgDataPtr);
248 }
249 
250 // ------------------------------------------------------------------------
251 
Graphic(const Animation & rAnimation)252 Graphic::Graphic( const Animation& rAnimation )
253 {
254     mpImpGraphic = new ImpGraphic( rAnimation );
255 }
256 
257 // ------------------------------------------------------------------------
258 
Graphic(const GDIMetaFile & rMtf)259 Graphic::Graphic( const GDIMetaFile& rMtf )
260 {
261     mpImpGraphic = new ImpGraphic( rMtf );
262 }
263 
264 // ------------------------------------------------------------------------
265 
Graphic(const::com::sun::star::uno::Reference<::com::sun::star::graphic::XGraphic> & rxGraphic)266 Graphic::Graphic( const ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >& rxGraphic )
267 {
268 	uno::Reference< lang::XUnoTunnel >		xTunnel( rxGraphic, uno::UNO_QUERY );
269 	uno::Reference< lang::XTypeProvider	>	xProv( rxGraphic, uno::UNO_QUERY );
270 	const ::Graphic* 						pGraphic = ( ( xTunnel.is() && xProv.is() ) ?
271 														 reinterpret_cast< ::Graphic* >( xTunnel->getSomething( xProv->getImplementationId() ) ) :
272 													 	 NULL );
273 
274 	if( pGraphic )
275 	{
276 		if( pGraphic->IsAnimated() )
277 			mpImpGraphic = new ImpGraphic( *pGraphic->mpImpGraphic );
278 		else
279 		{
280 			mpImpGraphic = pGraphic->mpImpGraphic;
281 			mpImpGraphic->mnRefCount++;
282 		}
283 	}
284 	else
285 		mpImpGraphic = new ImpGraphic;
286 }
287 
288 // ------------------------------------------------------------------------
289 
~Graphic()290 Graphic::~Graphic()
291 {
292     if( mpImpGraphic->mnRefCount == 1UL )
293         delete mpImpGraphic;
294     else
295         mpImpGraphic->mnRefCount--;
296 }
297 
298 // ------------------------------------------------------------------------
299 
ImplTestRefCount()300 void Graphic::ImplTestRefCount()
301 {
302     if( mpImpGraphic->mnRefCount > 1UL )
303     {
304         mpImpGraphic->mnRefCount--;
305         mpImpGraphic = new ImpGraphic( *mpImpGraphic );
306     }
307 }
308 
309 // ------------------------------------------------------------------------
310 
operator =(const Graphic & rGraphic)311 Graphic& Graphic::operator=( const Graphic& rGraphic )
312 {
313     if( &rGraphic != this )
314     {
315         if( rGraphic.IsAnimated() )
316         {
317             if( mpImpGraphic->mnRefCount == 1UL )
318                 delete mpImpGraphic;
319             else
320                 mpImpGraphic->mnRefCount--;
321 
322             mpImpGraphic = new ImpGraphic( *rGraphic.mpImpGraphic );
323         }
324         else
325         {
326             rGraphic.mpImpGraphic->mnRefCount++;
327 
328             if( mpImpGraphic->mnRefCount == 1UL )
329                 delete mpImpGraphic;
330             else
331                 mpImpGraphic->mnRefCount--;
332 
333             mpImpGraphic = rGraphic.mpImpGraphic;
334         }
335     }
336 
337     return *this;
338 }
339 
340 // ------------------------------------------------------------------------
341 
operator ==(const Graphic & rGraphic) const342 sal_Bool Graphic::operator==( const Graphic& rGraphic ) const
343 {
344     return( *mpImpGraphic == *rGraphic.mpImpGraphic );
345 }
346 
347 // ------------------------------------------------------------------------
348 
operator !=(const Graphic & rGraphic) const349 sal_Bool Graphic::operator!=( const Graphic& rGraphic ) const
350 {
351     return( *mpImpGraphic != *rGraphic.mpImpGraphic );
352 }
353 
354 // ------------------------------------------------------------------------
355 
operator !() const356 sal_Bool Graphic::operator!() const
357 {
358     return( GRAPHIC_NONE == mpImpGraphic->ImplGetType() );
359 }
360 
361 // ------------------------------------------------------------------------
362 
Load(SvStream & rIStm)363 void Graphic::Load( SvStream& rIStm )
364 {
365     rIStm >> *this;
366 }
367 
368 // ------------------------------------------------------------------------
369 
Save(SvStream & rOStm)370 void Graphic::Save( SvStream& rOStm )
371 {
372     rOStm << *this;
373 }
374 
375 // ------------------------------------------------------------------------
376 
Assign(const SvDataCopyStream & rCopyStream)377 void Graphic::Assign( const SvDataCopyStream& rCopyStream )
378 {
379     *this = (const Graphic& ) rCopyStream;
380 }
381 
382 // ------------------------------------------------------------------------
383 
Clear()384 void Graphic::Clear()
385 {
386     ImplTestRefCount();
387     mpImpGraphic->ImplClear();
388 }
389 
390 // ------------------------------------------------------------------------
391 
GetType() const392 GraphicType Graphic::GetType() const
393 {
394     return mpImpGraphic->ImplGetType();
395 }
396 
397 // ------------------------------------------------------------------------
398 
SetDefaultType()399 void Graphic::SetDefaultType()
400 {
401     ImplTestRefCount();
402     mpImpGraphic->ImplSetDefaultType();
403 }
404 
405 // ------------------------------------------------------------------------
406 
IsSupportedGraphic() const407 sal_Bool Graphic::IsSupportedGraphic() const
408 {
409     return mpImpGraphic->ImplIsSupportedGraphic();
410 }
411 
412 // ------------------------------------------------------------------------
413 
IsTransparent() const414 sal_Bool Graphic::IsTransparent() const
415 {
416     return mpImpGraphic->ImplIsTransparent();
417 }
418 
419 // ------------------------------------------------------------------------
420 
IsAlpha() const421 sal_Bool Graphic::IsAlpha() const
422 {
423     return mpImpGraphic->ImplIsAlpha();
424 }
425 
426 // ------------------------------------------------------------------------
427 
IsAnimated() const428 sal_Bool Graphic::IsAnimated() const
429 {
430     return mpImpGraphic->ImplIsAnimated();
431 }
432 
433 // ------------------------------------------------------------------------
434 
IsEPS() const435 sal_Bool Graphic::IsEPS() const
436 {
437     return mpImpGraphic->ImplIsEPS();
438 }
439 
440 // ------------------------------------------------------------------------
441 
GetBitmap(const GraphicConversionParameters & rParameters) const442 Bitmap Graphic::GetBitmap(const GraphicConversionParameters& rParameters) const
443 {
444     return mpImpGraphic->ImplGetBitmap(rParameters);
445 }
446 
447 // ------------------------------------------------------------------------
448 
GetBitmapEx(const GraphicConversionParameters & rParameters) const449 BitmapEx Graphic::GetBitmapEx(const GraphicConversionParameters& rParameters) const
450 {
451     return mpImpGraphic->ImplGetBitmapEx(rParameters);
452 }
453 
454 // ------------------------------------------------------------------------
455 
GetAnimation() const456 Animation Graphic::GetAnimation() const
457 {
458     return mpImpGraphic->ImplGetAnimation();
459 }
460 
461 // ------------------------------------------------------------------------
462 
GetGDIMetaFile() const463 const GDIMetaFile& Graphic::GetGDIMetaFile() const
464 {
465     return mpImpGraphic->ImplGetGDIMetaFile();
466 }
467 
468 // ------------------------------------------------------------------------
469 
GetXGraphic() const470 uno::Reference< graphic::XGraphic > Graphic::GetXGraphic() const
471 {
472 	uno::Reference< graphic::XGraphic > xRet;
473 
474 	if( GetType() != GRAPHIC_NONE )
475 	{
476 		uno::Reference < lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
477 
478 		if( xMSF.is() )
479 		{
480 			uno::Reference< graphic::XGraphicProvider > xProv( xMSF->createInstance(
481 				::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.graphic.GraphicProvider" ) ) ),
482 				uno::UNO_QUERY );
483 
484 			if( xProv.is() )
485 			{
486 				uno::Sequence< beans::PropertyValue > 	aLoadProps( 1 );
487 				::rtl::OUString							aURL( RTL_CONSTASCII_USTRINGPARAM( "private:memorygraphic/" ) );
488 
489 				aLoadProps[ 0 ].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
490 				aLoadProps[ 0 ].Value <<= ( aURL += ::rtl::OUString::valueOf( reinterpret_cast< sal_Int64 >( this ) ) );
491 
492 				xRet = xProv->queryGraphic( aLoadProps );
493 			}
494 		}
495 	}
496 
497 	return xRet;
498 }
499 
500 // ------------------------------------------------------------------------
501 
GetPrefSize() const502 Size Graphic::GetPrefSize() const
503 {
504     return mpImpGraphic->ImplGetPrefSize();
505 }
506 
507 // ------------------------------------------------------------------------
508 
SetPrefSize(const Size & rPrefSize)509 void Graphic::SetPrefSize( const Size& rPrefSize )
510 {
511     ImplTestRefCount();
512     mpImpGraphic->ImplSetPrefSize( rPrefSize );
513 }
514 
515 // ------------------------------------------------------------------------
516 
GetPrefMapMode() const517 MapMode Graphic::GetPrefMapMode() const
518 {
519     return mpImpGraphic->ImplGetPrefMapMode();
520 }
521 
522 // ------------------------------------------------------------------------
523 
SetPrefMapMode(const MapMode & rPrefMapMode)524 void Graphic::SetPrefMapMode( const MapMode& rPrefMapMode )
525 {
526     ImplTestRefCount();
527     mpImpGraphic->ImplSetPrefMapMode( rPrefMapMode );
528 }
529 
530 // ------------------------------------------------------------------
531 
GetSizePixel(const OutputDevice * pRefDevice) const532 Size Graphic::GetSizePixel( const OutputDevice* pRefDevice ) const
533 {
534     Size aRet;
535 
536     if( GRAPHIC_BITMAP == mpImpGraphic->ImplGetType() )
537         aRet = mpImpGraphic->ImplGetBitmapEx(GraphicConversionParameters()).GetSizePixel();
538     else
539         aRet = ( pRefDevice ? pRefDevice : Application::GetDefaultDevice() )->LogicToPixel( GetPrefSize(), GetPrefMapMode() );
540 
541     return aRet;
542 }
543 
544 // ------------------------------------------------------------------
545 
GetSizeBytes() const546 sal_uLong Graphic::GetSizeBytes() const
547 {
548     return mpImpGraphic->ImplGetSizeBytes();
549 }
550 
551 // ------------------------------------------------------------------------
552 
Draw(OutputDevice * pOutDev,const Point & rDestPt) const553 void Graphic::Draw( OutputDevice* pOutDev, const Point& rDestPt ) const
554 {
555     mpImpGraphic->ImplDraw( pOutDev, rDestPt );
556 }
557 
558 // ------------------------------------------------------------------------
559 
Draw(OutputDevice * pOutDev,const Point & rDestPt,const Size & rDestSz) const560 void Graphic::Draw( OutputDevice* pOutDev,
561                     const Point& rDestPt, const Size& rDestSz ) const
562 {
563     if( GRAPHIC_DEFAULT == mpImpGraphic->ImplGetType() )
564         ImplDrawDefault( pOutDev, NULL, NULL, NULL, NULL, rDestPt, rDestSz );
565     else
566         mpImpGraphic->ImplDraw( pOutDev, rDestPt, rDestSz );
567 }
568 
569 // ------------------------------------------------------------------------
570 
Draw(OutputDevice * pOutDev,const String & rText,Font & rFont,const Bitmap & rBitmap,const Point & rDestPt,const Size & rDestSz)571 void Graphic::Draw( OutputDevice* pOutDev, const String& rText,
572                     Font& rFont, const Bitmap& rBitmap,
573                     const Point& rDestPt, const Size& rDestSz )
574 {
575     ImplDrawDefault( pOutDev, &rText, &rFont, &rBitmap, NULL, rDestPt, rDestSz );
576 }
577 
578 // ------------------------------------------------------------------------
579 
DrawEx(OutputDevice * pOutDev,const String & rText,Font & rFont,const BitmapEx & rBitmap,const Point & rDestPt,const Size & rDestSz)580 void Graphic::DrawEx( OutputDevice* pOutDev, const String& rText,
581                     Font& rFont, const BitmapEx& rBitmap,
582                     const Point& rDestPt, const Size& rDestSz )
583 {
584     ImplDrawDefault( pOutDev, &rText, &rFont, NULL, &rBitmap, rDestPt, rDestSz );
585 }
586 
587 // ------------------------------------------------------------------------
588 
StartAnimation(OutputDevice * pOutDev,const Point & rDestPt,long nExtraData,OutputDevice * pFirstFrameOutDev)589 void Graphic::StartAnimation( OutputDevice* pOutDev, const Point& rDestPt, long nExtraData,
590                               OutputDevice* pFirstFrameOutDev )
591 {
592     ImplTestRefCount();
593     mpImpGraphic->ImplStartAnimation( pOutDev, rDestPt, nExtraData, pFirstFrameOutDev );
594 }
595 
596 // ------------------------------------------------------------------------
597 
StartAnimation(OutputDevice * pOutDev,const Point & rDestPt,const Size & rDestSz,long nExtraData,OutputDevice * pFirstFrameOutDev)598 void Graphic::StartAnimation( OutputDevice* pOutDev, const Point& rDestPt,
599                               const Size& rDestSz, long nExtraData,
600                               OutputDevice* pFirstFrameOutDev )
601 {
602     ImplTestRefCount();
603     mpImpGraphic->ImplStartAnimation( pOutDev, rDestPt, rDestSz, nExtraData, pFirstFrameOutDev );
604 }
605 
606 // ------------------------------------------------------------------------
607 
StopAnimation(OutputDevice * pOutDev,long nExtraData)608 void Graphic::StopAnimation( OutputDevice* pOutDev, long nExtraData )
609 {
610     ImplTestRefCount();
611     mpImpGraphic->ImplStopAnimation( pOutDev, nExtraData );
612 }
613 
614 // ------------------------------------------------------------------------
615 
SetAnimationNotifyHdl(const Link & rLink)616 void Graphic::SetAnimationNotifyHdl( const Link& rLink )
617 {
618     mpImpGraphic->ImplSetAnimationNotifyHdl( rLink );
619 }
620 
621 // ------------------------------------------------------------------------
622 
GetAnimationNotifyHdl() const623 Link Graphic::GetAnimationNotifyHdl() const
624 {
625     return mpImpGraphic->ImplGetAnimationNotifyHdl();
626 }
627 
628 // ------------------------------------------------------------------------
629 
GetAnimationLoopCount() const630 sal_uLong Graphic::GetAnimationLoopCount() const
631 {
632     return mpImpGraphic->ImplGetAnimationLoopCount();
633 }
634 
635 // ------------------------------------------------------------------------
636 
ResetAnimationLoopCount()637 void Graphic::ResetAnimationLoopCount()
638 {
639     mpImpGraphic->ImplResetAnimationLoopCount();
640 }
641 
642 // ------------------------------------------------------------------------
643 
GetAnimationInfoList() const644 List* Graphic::GetAnimationInfoList() const
645 {
646     return mpImpGraphic->ImplGetAnimationInfoList();
647 }
648 
649 // ------------------------------------------------------------------------
650 
GetContext()651 GraphicReader* Graphic::GetContext()
652 {
653     return mpImpGraphic->ImplGetContext();
654 }
655 
656 // ------------------------------------------------------------------------
657 
SetContext(GraphicReader * pReader)658 void Graphic::SetContext( GraphicReader* pReader )
659 {
660     mpImpGraphic->ImplSetContext( pReader );
661 }
662 
663 // ------------------------------------------------------------------------
664 
GetGraphicsCompressMode(SvStream & rIStm)665 sal_uInt16 Graphic::GetGraphicsCompressMode( SvStream& rIStm )
666 {
667     const sal_uLong     nPos = rIStm.Tell();
668     const sal_uInt16    nOldFormat = rIStm.GetNumberFormatInt();
669     sal_uInt32          nTmp32;
670     sal_uInt16          nTmp16;
671     sal_uInt16          nCompressMode = COMPRESSMODE_NONE;
672 
673     rIStm.SetNumberFormatInt( NUMBERFORMAT_INT_LITTLEENDIAN );
674 
675     rIStm >> nTmp32;
676 
677     // is it a swapped graphic with a bitmap?
678     rIStm.SeekRel( (nTmp32 == (sal_uInt32) GRAPHIC_BITMAP ) ? 40 : -4 );
679 
680     // try to read bitmap id
681     rIStm >> nTmp16;
682 
683     // check id of BitmapFileHeader
684     if( 0x4D42 == nTmp16 )
685     {
686         // seek to compress field of BitmapInfoHeader
687         rIStm.SeekRel( 28 );
688         rIStm >> nTmp32;
689 
690         // Compare with our own compressmode
691         if( ZCOMPRESS == nTmp32 )
692             nCompressMode = COMPRESSMODE_ZBITMAP;
693     }
694 
695     rIStm.SetNumberFormatInt( nOldFormat );
696     rIStm.Seek( nPos );
697 
698     return nCompressMode;
699 }
700 
701 // ------------------------------------------------------------------------
702 
SetDocFileName(const String & rName,sal_uLong nFilePos)703 void Graphic::SetDocFileName( const String& rName, sal_uLong nFilePos )
704 {
705     mpImpGraphic->ImplSetDocFileName( rName, nFilePos );
706 }
707 
708 // ------------------------------------------------------------------------
709 
GetDocFileName() const710 const String& Graphic::GetDocFileName() const
711 {
712     return mpImpGraphic->ImplGetDocFileName();
713 }
714 
715 // ------------------------------------------------------------------------
716 
GetDocFilePos() const717 sal_uLong Graphic::GetDocFilePos() const
718 {
719     return mpImpGraphic->ImplGetDocFilePos();
720 }
721 
722 // ------------------------------------------------------------------------
723 
ReadEmbedded(SvStream & rIStream,sal_Bool bSwap)724 sal_Bool Graphic::ReadEmbedded( SvStream& rIStream, sal_Bool bSwap )
725 {
726     ImplTestRefCount();
727     return mpImpGraphic->ImplReadEmbedded( rIStream, bSwap );
728 }
729 
730 // ------------------------------------------------------------------------
731 
WriteEmbedded(SvStream & rOStream)732 sal_Bool Graphic::WriteEmbedded( SvStream& rOStream )
733 {
734     ImplTestRefCount();
735     return mpImpGraphic->ImplWriteEmbedded( rOStream );
736 }
737 
738 // ------------------------------------------------------------------------
739 
SwapOut()740 sal_Bool Graphic::SwapOut()
741 {
742     ImplTestRefCount();
743     return mpImpGraphic->ImplSwapOut();
744 }
745 
746 // ------------------------------------------------------------------------
747 
SwapOut(SvStream * pOStream)748 sal_Bool Graphic::SwapOut( SvStream* pOStream )
749 {
750     ImplTestRefCount();
751     return mpImpGraphic->ImplSwapOut( pOStream );
752 }
753 
754 // ------------------------------------------------------------------------
755 
SwapIn()756 sal_Bool Graphic::SwapIn()
757 {
758     ImplTestRefCount();
759     return mpImpGraphic->ImplSwapIn();
760 }
761 
762 // ------------------------------------------------------------------------
763 
SwapIn(SvStream * pStrm)764 sal_Bool Graphic::SwapIn( SvStream* pStrm )
765 {
766     ImplTestRefCount();
767     return mpImpGraphic->ImplSwapIn( pStrm );
768 }
769 
770 // ------------------------------------------------------------------------
771 
IsSwapOut() const772 sal_Bool Graphic::IsSwapOut() const
773 {
774     return mpImpGraphic->ImplIsSwapOut();
775 }
776 
777 // ------------------------------------------------------------------------
778 
SetLink(const GfxLink & rGfxLink)779 void Graphic::SetLink( const GfxLink& rGfxLink )
780 {
781     ImplTestRefCount();
782     mpImpGraphic->ImplSetLink( rGfxLink );
783 }
784 
785 // ------------------------------------------------------------------------
786 
GetLink() const787 GfxLink Graphic::GetLink() const
788 {
789     return mpImpGraphic->ImplGetLink();
790 }
791 
792 // ------------------------------------------------------------------------
793 
IsLink() const794 sal_Bool Graphic::IsLink() const
795 {
796     return mpImpGraphic->ImplIsLink();
797 }
798 
799 // ------------------------------------------------------------------------
800 
GetChecksum() const801 sal_uLong Graphic::GetChecksum() const
802 {
803     return mpImpGraphic->ImplGetChecksum();
804 }
805 
806 // ------------------------------------------------------------------------
807 
ExportNative(SvStream & rOStream) const808 sal_Bool Graphic::ExportNative( SvStream& rOStream ) const
809 {
810 	return mpImpGraphic->ImplExportNative( rOStream );
811 }
812 
813 // ------------------------------------------------------------------------
814 
operator >>(SvStream & rIStream,Graphic & rGraphic)815 SvStream& operator>>( SvStream& rIStream, Graphic& rGraphic )
816 {
817     rGraphic.ImplTestRefCount();
818     return rIStream >> *rGraphic.mpImpGraphic;
819 }
820 
821 // ------------------------------------------------------------------------
822 
operator <<(SvStream & rOStream,const Graphic & rGraphic)823 SvStream& operator<<( SvStream& rOStream, const Graphic& rGraphic )
824 {
825     return rOStream << *rGraphic.mpImpGraphic;
826 }
827 
getSvgData() const828 const SvgDataPtr& Graphic::getSvgData() const
829 {
830     return mpImpGraphic->getSvgData();
831 }
832