LCOV - code coverage report
Current view: top level - vcl/source/gdi - image.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 214 334 64.1 %
Date: 2015-06-13 12:38:46 Functions: 30 44 68.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <boost/scoped_array.hpp>
      21             : 
      22             : #include <osl/file.hxx>
      23             : #include <tools/debug.hxx>
      24             : #include <tools/stream.hxx>
      25             : #include <tools/rc.h>
      26             : #include <tools/rc.hxx>
      27             : #include <tools/resmgr.hxx>
      28             : #include <vcl/settings.hxx>
      29             : #include <vcl/outdev.hxx>
      30             : #include <vcl/graph.hxx>
      31             : #include <vcl/graphicfilter.hxx>
      32             : #include <vcl/svapp.hxx>
      33             : #include <vcl/image.hxx>
      34             : #include <vcl/imagerepository.hxx>
      35             : #include <impimagetree.hxx>
      36             : #include <image.h>
      37             : 
      38             : #if OSL_DEBUG_LEVEL > 0
      39             : #include <rtl/strbuf.hxx>
      40             : #endif
      41             : 
      42             : using namespace ::com::sun::star;
      43             : 
      44     2142178 : Image::Image() :
      45     2142178 :     mpImplData( NULL )
      46             : {
      47     2142178 : }
      48             : 
      49       25845 : Image::Image( const ResId& rResId ) :
      50       25845 :     mpImplData( NULL )
      51             : {
      52             : 
      53       25845 :     rResId.SetRT( RSC_IMAGE );
      54             : 
      55       25845 :     ResMgr* pResMgr = rResId.GetResMgr();
      56       25845 :     if( pResMgr && pResMgr->GetResource( rResId ) )
      57             :     {
      58       25845 :         pResMgr->Increment( sizeof( RSHEADER_TYPE ) );
      59             : 
      60       25845 :         BitmapEx    aBmpEx;
      61       25845 :         sal_uLong       nObjMask = pResMgr->ReadLong();
      62             : 
      63       25845 :         if( nObjMask & RSC_IMAGE_IMAGEBITMAP )
      64             :         {
      65       25845 :             aBmpEx = BitmapEx( ResId( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()), *pResMgr ) );
      66       25845 :             pResMgr->Increment( ResMgr::GetObjSize( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()) ) );
      67             :         }
      68             : 
      69       25845 :         if( nObjMask & RSC_IMAGE_MASKBITMAP )
      70             :         {
      71           0 :             if( !aBmpEx.IsEmpty() && aBmpEx.GetTransparentType() == TRANSPARENT_NONE )
      72             :             {
      73           0 :                 const Bitmap aMaskBitmap( ResId( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()), *pResMgr ) );
      74           0 :                 aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aMaskBitmap );
      75             :             }
      76             : 
      77           0 :             pResMgr->Increment( ResMgr::GetObjSize( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()) ) );
      78             :         }
      79             : 
      80       25845 :         if( nObjMask & RSC_IMAGE_MASKCOLOR )
      81             :         {
      82        8659 :             if( !aBmpEx.IsEmpty() && aBmpEx.GetTransparentType() == TRANSPARENT_NONE )
      83             :             {
      84           0 :                 const Color aMaskColor( ResId( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()), *pResMgr ) );
      85           0 :                 aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aMaskColor );
      86             :             }
      87             : 
      88        8659 :             pResMgr->Increment( ResMgr::GetObjSize( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()) ) );
      89             :         }
      90       25845 :         if( ! aBmpEx.IsEmpty() )
      91       25845 :             ImplInit( aBmpEx );
      92             :     }
      93       25845 : }
      94             : 
      95     1260349 : Image::Image( const Image& rImage ) :
      96     1260349 :     mpImplData( rImage.mpImplData )
      97             : {
      98             : 
      99     1260349 :     if( mpImplData )
     100      553067 :         ++mpImplData->mnRefCount;
     101     1260349 : }
     102             : 
     103      109422 : Image::Image( const BitmapEx& rBitmapEx ) :
     104      109422 :     mpImplData( NULL )
     105             : {
     106             : 
     107      109422 :     ImplInit( rBitmapEx );
     108      109422 : }
     109             : 
     110        3397 : Image::Image( const Bitmap& rBitmap ) :
     111        3397 :     mpImplData( NULL )
     112             : {
     113             : 
     114        3397 :     ImplInit( rBitmap );
     115        3397 : }
     116             : 
     117           0 : Image::Image( const Bitmap& rBitmap, const Bitmap& rMaskBitmap ) :
     118           0 :     mpImplData( NULL )
     119             : {
     120             : 
     121           0 :     const BitmapEx aBmpEx( rBitmap, rMaskBitmap );
     122             : 
     123           0 :     ImplInit( aBmpEx );
     124           0 : }
     125             : 
     126           0 : Image::Image( const Bitmap& rBitmap, const Color& rColor ) :
     127           0 :     mpImplData( NULL )
     128             : {
     129             : 
     130           0 :     const BitmapEx aBmpEx( rBitmap, rColor );
     131             : 
     132           0 :     ImplInit( aBmpEx );
     133           0 : }
     134             : 
     135      184696 : Image::Image( const uno::Reference< graphic::XGraphic >& rxGraphic ) :
     136      184696 :     mpImplData( NULL )
     137             : {
     138             : 
     139      184696 :     const Graphic aGraphic( rxGraphic );
     140      184696 :     ImplInit( aGraphic.GetBitmapEx() );
     141      184696 : }
     142             : 
     143           3 : Image::Image( const OUString &rFileUrl ) :
     144           3 :     mpImplData( NULL )
     145             : {
     146           3 :     OUString aTmp;
     147           3 :     osl::FileBase::getSystemPathFromFileURL( rFileUrl, aTmp );
     148           6 :     Graphic aGraphic;
     149           6 :     const OUString aFilterName( IMP_PNG );
     150           3 :     if( GRFILTER_OK == GraphicFilter::LoadGraphic( aTmp, aFilterName, aGraphic ) )
     151             :     {
     152           3 :         ImplInit( aGraphic.GetBitmapEx() );
     153           3 :     }
     154           3 : }
     155             : 
     156     3708077 : Image::~Image()
     157             : {
     158             : 
     159     3708077 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     160      195831 :         delete mpImplData;
     161     3708077 : }
     162             : 
     163      323363 : void Image::ImplInit( const BitmapEx& rBmpEx )
     164             : {
     165      323363 :     if( !rBmpEx.IsEmpty() )
     166             :     {
     167      217857 :         mpImplData = new ImplImage;
     168             : 
     169      217857 :         if( rBmpEx.GetTransparentType() == TRANSPARENT_NONE )
     170             :         {
     171        3768 :             mpImplData->meType = IMAGETYPE_BITMAP;
     172        3768 :             mpImplData->mpData = new Bitmap( rBmpEx.GetBitmap() );
     173             :         }
     174             :         else
     175             :         {
     176      214089 :             mpImplData->meType = IMAGETYPE_IMAGE;
     177      214089 :             mpImplData->mpData = new ImplImageData( rBmpEx );
     178             :         }
     179             :     }
     180      323363 : }
     181             : 
     182      425050 : Size Image::GetSizePixel() const
     183             : {
     184             : 
     185      425050 :     Size aRet;
     186             : 
     187      425050 :     if( mpImplData )
     188             :     {
     189      359262 :         switch( mpImplData->meType )
     190             :         {
     191             :             case IMAGETYPE_BITMAP:
     192        6874 :                 aRet = static_cast< Bitmap* >( mpImplData->mpData )->GetSizePixel();
     193        6874 :             break;
     194             : 
     195             :             case IMAGETYPE_IMAGE:
     196      352388 :                 aRet = static_cast< ImplImageData* >( mpImplData->mpData )->maBmpEx.GetSizePixel();
     197      352388 :             break;
     198             :         }
     199             :     }
     200             : 
     201      425050 :     return aRet;
     202             : }
     203             : 
     204      193138 : BitmapEx Image::GetBitmapEx() const
     205             : {
     206             : 
     207      193138 :     BitmapEx aRet;
     208             : 
     209      193138 :     if( mpImplData )
     210             :     {
     211       86900 :         switch( mpImplData->meType )
     212             :         {
     213             :             case IMAGETYPE_BITMAP:
     214         333 :                 aRet = *static_cast< Bitmap* >( mpImplData->mpData );
     215         333 :             break;
     216             : 
     217             :             case IMAGETYPE_IMAGE:
     218       86567 :                 aRet = static_cast< ImplImageData* >( mpImplData->mpData )->maBmpEx;
     219       86567 :             break;
     220             :         }
     221             :     }
     222             : 
     223      193138 :     return aRet;
     224             : }
     225             : 
     226      185450 : uno::Reference< graphic::XGraphic > Image::GetXGraphic() const
     227             : {
     228      185450 :     const Graphic aGraphic( GetBitmapEx() );
     229             : 
     230      185453 :     return aGraphic.GetXGraphic();
     231             : }
     232             : 
     233      968687 : Image& Image::operator=( const Image& rImage )
     234             : {
     235             : 
     236      968687 :     if( rImage.mpImplData )
     237      408502 :         ++rImage.mpImplData->mnRefCount;
     238             : 
     239      968687 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     240        5183 :         delete mpImplData;
     241             : 
     242      968687 :     mpImplData = rImage.mpImplData;
     243             : 
     244      968687 :     return *this;
     245             : }
     246             : 
     247       11893 : bool Image::operator==( const Image& rImage ) const
     248             : {
     249             : 
     250       11893 :     bool bRet = false;
     251             : 
     252       11893 :     if( rImage.mpImplData == mpImplData )
     253         732 :         bRet = true;
     254       11161 :     else if( !rImage.mpImplData || !mpImplData )
     255       11071 :         bRet = false;
     256          90 :     else if( rImage.mpImplData->mpData == mpImplData->mpData )
     257           0 :         bRet = true;
     258          90 :     else if( rImage.mpImplData->meType == mpImplData->meType )
     259             :     {
     260          90 :         switch( mpImplData->meType )
     261             :         {
     262             :             case IMAGETYPE_BITMAP:
     263           0 :                 bRet = ( *static_cast< Bitmap* >( rImage.mpImplData->mpData ) == *static_cast< Bitmap* >( mpImplData->mpData ) );
     264           0 :             break;
     265             : 
     266             :             case IMAGETYPE_IMAGE:
     267          90 :                 bRet = static_cast< ImplImageData* >( rImage.mpImplData->mpData )->IsEqual( *static_cast< ImplImageData* >( mpImplData->mpData ) );
     268          90 :             break;
     269             : 
     270             :             default:
     271           0 :                 bRet = false;
     272           0 :             break;
     273             :         }
     274             :     }
     275             : 
     276       11893 :     return bRet;
     277             : }
     278             : 
     279       38115 : ImageList::ImageList( sal_uInt16 nInit, sal_uInt16 nGrow ) :
     280             :     mpImplData( NULL ),
     281             :     mnInitSize( nInit ),
     282       38115 :     mnGrowSize( nGrow )
     283             : {
     284       38115 : }
     285             : 
     286         124 : ImageList::ImageList( const ResId& rResId ) :
     287             :     mpImplData( NULL ),
     288             :     mnInitSize( 1 ),
     289         124 :     mnGrowSize( 4 )
     290             : {
     291             :     SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList( const ResId& rResId )" );
     292             : 
     293         124 :     rResId.SetRT( RSC_IMAGELIST );
     294             : 
     295         124 :     ResMgr* pResMgr = rResId.GetResMgr();
     296             : 
     297         124 :     if( pResMgr && pResMgr->GetResource( rResId ) )
     298             :     {
     299         124 :         pResMgr->Increment( sizeof( RSHEADER_TYPE ) );
     300             : 
     301         124 :         sal_uLong                               nObjMask = pResMgr->ReadLong();
     302         124 :         pResMgr->ReadString(); //skip string
     303         124 :         std::unique_ptr< Color >        xMaskColor;
     304             : 
     305         124 :         if( nObjMask & RSC_IMAGE_MASKCOLOR )
     306         124 :             xMaskColor.reset( new Color( ResId( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()), *pResMgr ) ) );
     307             : 
     308         124 :         pResMgr->Increment( ResMgr::GetObjSize( static_cast<RSHEADER_TYPE*>(pResMgr->GetClass()) ) );
     309             : 
     310         124 :         if( nObjMask & RSC_IMAGELIST_IDLIST )
     311             :         {
     312           0 :             for( sal_Int32 i = 0, nCount = pResMgr->ReadLong(); i < nCount; ++i )
     313           0 :                 pResMgr->ReadLong();
     314             :         }
     315             : 
     316         124 :         sal_Int32 nCount = pResMgr->ReadLong();
     317         124 :         ImplInit( static_cast< sal_uInt16 >( nCount ), Size() );
     318             : 
     319         248 :         BitmapEx aEmpty;
     320        3362 :         for( sal_Int32 i = 0; i < nCount; ++i )
     321             :         {
     322        3238 :             OUString aName = pResMgr->ReadString();
     323        3238 :             sal_uInt16 nId = static_cast< sal_uInt16 >( pResMgr->ReadLong() );
     324        3238 :             mpImplData->AddImage( aName, nId, aEmpty );
     325        3238 :         }
     326             : 
     327         124 :         if( nObjMask & RSC_IMAGELIST_IDCOUNT )
     328         248 :             pResMgr->ReadShort();
     329             :     }
     330         124 : }
     331             : 
     332         108 : ImageList::ImageList( const ::std::vector< OUString >& rNameVector,
     333             :                       const OUString& rPrefix,
     334             :                       const Color* ) :
     335             :     mpImplData( NULL ),
     336             :     mnInitSize( 1 ),
     337         108 :     mnGrowSize( 4 )
     338             : {
     339             :     SAL_INFO( "vcl.gdi", "vcl: ImageList::ImageList(const vector< OUString >& ..." );
     340             : 
     341         108 :     ImplInit( sal::static_int_cast< sal_uInt16 >( rNameVector.size() ), Size() );
     342             : 
     343         108 :     mpImplData->maPrefix = rPrefix;
     344       33726 :     for( size_t i = 0; i < rNameVector.size(); ++i )
     345             :     {
     346       33618 :         mpImplData->AddImage( rNameVector[ i ], static_cast< sal_uInt16 >( i ) + 1, BitmapEx() );
     347             :     }
     348         108 : }
     349             : 
     350           0 : ImageList::ImageList( const ImageList& rImageList ) :
     351             :     mpImplData( rImageList.mpImplData ),
     352             :     mnInitSize( rImageList.mnInitSize ),
     353           0 :     mnGrowSize( rImageList.mnGrowSize )
     354             : {
     355             : 
     356           0 :     if( mpImplData )
     357           0 :         ++mpImplData->mnRefCount;
     358           0 : }
     359             : 
     360       37363 : ImageList::~ImageList()
     361             : {
     362       37363 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     363         236 :         delete mpImplData;
     364       37363 : }
     365             : 
     366         267 : void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize )
     367             : {
     368         267 :     mpImplData = new ImplImageList;
     369         267 :     mpImplData->maImages.reserve( nItems );
     370         267 :     mpImplData->maImageSize = rSize;
     371         267 : }
     372             : 
     373        5587 : void ImageAryData::Load(const OUString &rPrefix)
     374             : {
     375        5587 :     static ImplImageTreeSingletonRef aImageTree;
     376             : 
     377        5587 :     OUString aIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme();
     378             : 
     379       11174 :     BitmapEx aBmpEx;
     380             : 
     381       11174 :     OUString aFileName = rPrefix;
     382        5587 :     aFileName += maName;
     383             : #if OSL_DEBUG_LEVEL > 0
     384             :     bool bSuccess =
     385             : #endif
     386       11174 :         aImageTree->loadImage( aFileName, aIconTheme, maBitmapEx, true );
     387             : #if OSL_DEBUG_LEVEL > 0
     388             :     if ( !bSuccess )
     389             :     {
     390             :         OStringBuffer aMessage;
     391             :         aMessage.append( "ImageAryData::Load: failed to load image '" );
     392             :         aMessage.append( OUStringToOString( aFileName, RTL_TEXTENCODING_UTF8 ).getStr() );
     393             :         aMessage.append( "'" );
     394             :         OSL_FAIL( aMessage.makeStringAndClear().getStr() );
     395             :     }
     396             : #endif
     397        5587 : }
     398             : 
     399             : // FIXME: Rather a performance hazard
     400           0 : BitmapEx ImageList::GetAsHorizontalStrip() const
     401             : {
     402           0 :     Size aSize( mpImplData->maImageSize );
     403           0 :     sal_uInt16 nCount = GetImageCount();
     404           0 :     if( !nCount )
     405           0 :         return BitmapEx();
     406           0 :     aSize.Width() *= nCount;
     407             : 
     408             :     // Load any stragglers
     409           0 :     for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
     410             :     {
     411           0 :         ImageAryData *pData = mpImplData->maImages[ nIdx ];
     412           0 :         if( pData->IsLoadable() )
     413           0 :             pData->Load( mpImplData->maPrefix );
     414             :     }
     415             : 
     416           0 :     BitmapEx aTempl = mpImplData->maImages[ 0 ]->maBitmapEx;
     417           0 :     BitmapEx aResult;
     418           0 :     Bitmap aPixels( aSize, aTempl.GetBitmap().GetBitCount() );
     419           0 :     if( aTempl.IsAlpha() )
     420           0 :         aResult = BitmapEx( aPixels, AlphaMask( aSize ) );
     421           0 :     else if( aTempl.IsTransparent() )
     422           0 :         aResult = BitmapEx( aPixels, Bitmap( aSize, aTempl.GetMask().GetBitCount() ) );
     423             :     else
     424           0 :         aResult = BitmapEx( aPixels );
     425             : 
     426           0 :     Rectangle aSrcRect( Point( 0, 0 ), mpImplData->maImageSize );
     427           0 :     for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
     428             :     {
     429           0 :         Rectangle aDestRect( Point( nIdx * mpImplData->maImageSize.Width(), 0 ),
     430           0 :                              mpImplData->maImageSize );
     431           0 :         ImageAryData *pData = mpImplData->maImages[ nIdx ];
     432           0 :         aResult.CopyPixel( aDestRect, aSrcRect, &pData->maBitmapEx);
     433             :     }
     434             : 
     435           0 :     return aResult;
     436             : }
     437             : 
     438          35 : void ImageList::InsertFromHorizontalStrip( const BitmapEx &rBitmapEx,
     439             :                                            const std::vector< OUString > &rNameVector )
     440             : {
     441          35 :     sal_uInt16 nItems = sal::static_int_cast< sal_uInt16 >( rNameVector.size() );
     442             : 
     443          35 :     if (!nItems)
     444          35 :             return;
     445             : 
     446          35 :     Size aSize( rBitmapEx.GetSizePixel() );
     447             :     DBG_ASSERT (rBitmapEx.GetSizePixel().Width() % nItems == 0,
     448             :                 "ImageList::InsertFromHorizontalStrip - very odd size");
     449          35 :     aSize.Width() /= nItems;
     450          35 :     ImplInit( nItems, aSize );
     451             : 
     452         320 :     for (sal_uInt16 nIdx = 0; nIdx < nItems; nIdx++)
     453             :     {
     454         285 :         BitmapEx aBitmap( rBitmapEx, Point( nIdx * aSize.Width(), 0 ), aSize );
     455         285 :         mpImplData->AddImage( rNameVector[ nIdx ], nIdx + 1, aBitmap );
     456         285 :     }
     457             : }
     458             : 
     459          35 : void ImageList::InsertFromHorizontalBitmap( const ResId& rResId,
     460             :                                             sal_uInt16       nCount,
     461             :                                             const Color *pMaskColor,
     462             :                                             const Color *pSearchColors,
     463             :                                             const Color *pReplaceColors,
     464             :                                             sal_uLong        nColorCount)
     465             : {
     466          35 :     BitmapEx aBmpEx( rResId );
     467          35 :     if (!aBmpEx.IsTransparent())
     468             :     {
     469          35 :         if( pMaskColor )
     470          35 :             aBmpEx = BitmapEx( aBmpEx.GetBitmap(), *pMaskColor );
     471             :         else
     472           0 :             aBmpEx = BitmapEx( aBmpEx.GetBitmap() );
     473             :     }
     474          35 :     if ( nColorCount && pSearchColors && pReplaceColors )
     475          35 :         aBmpEx.Replace( pSearchColors, pReplaceColors, nColorCount );
     476             : 
     477          70 :     std::vector< OUString > aNames( nCount );
     478          70 :     InsertFromHorizontalStrip( aBmpEx, aNames );
     479          35 : }
     480             : 
     481           0 : sal_uInt16 ImageList::ImplGetImageId( const OUString& rImageName ) const
     482             : {
     483             : 
     484           0 :     ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
     485           0 :     if( pImg )
     486           0 :         return pImg->mnId;
     487             :     else
     488           0 :         return 0;
     489             : }
     490             : 
     491           0 : void ImageList::AddImage( const OUString& rImageName, const Image& rImage )
     492             : {
     493             :     DBG_ASSERT( GetImagePos( rImageName ) == IMAGELIST_IMAGE_NOTFOUND, "ImageList::AddImage() - ImageName already exists" );
     494             : 
     495           0 :     if( !mpImplData )
     496           0 :         ImplInit( 0, rImage.GetSizePixel() );
     497             : 
     498           0 :     mpImplData->AddImage( rImageName, GetImageCount() + 1,
     499           0 :                           rImage.GetBitmapEx() );
     500           0 : }
     501             : 
     502           0 : void ImageList::ReplaceImage( const OUString& rImageName, const Image& rImage )
     503             : {
     504           0 :     const sal_uInt16 nId = ImplGetImageId( rImageName );
     505             : 
     506           0 :     if( nId )
     507             :     {
     508             :         //Just replace the bitmap rather than doing RemoveImage / AddImage
     509             :         //which breaks index-based iteration.
     510           0 :         ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
     511           0 :         pImg->maBitmapEx = rImage.GetBitmapEx();
     512             :     }
     513           0 : }
     514             : 
     515           0 : void ImageList::RemoveImage( sal_uInt16 nId )
     516             : {
     517             : 
     518           0 :     for( size_t i = 0; i < mpImplData->maImages.size(); ++i )
     519             :     {
     520           0 :         if( mpImplData->maImages[ i ]->mnId == nId )
     521             :         {
     522           0 :             mpImplData->RemoveImage( static_cast< sal_uInt16 >( i ) );
     523           0 :             break;
     524             :         }
     525             :     }
     526           0 : }
     527             : 
     528       17739 : Image ImageList::GetImage( sal_uInt16 nId ) const
     529             : {
     530             : 
     531       17739 :     Image aRet;
     532             : 
     533       17739 :     if( mpImplData )
     534             :     {
     535       17474 :         std::vector<ImageAryData *>::iterator aIter;
     536     2668374 :         for( aIter = mpImplData->maImages.begin();
     537     1778916 :              aIter != mpImplData->maImages.end(); ++aIter)
     538             :         {
     539      871984 :             if ((*aIter)->mnId == nId)
     540             :             {
     541       18613 :                 if( (*aIter)->IsLoadable() )
     542         844 :                     (*aIter)->Load( mpImplData->maPrefix );
     543             : 
     544       18613 :                 aRet = Image( (*aIter)->maBitmapEx );
     545             :             }
     546             :         }
     547             :     }
     548             : 
     549       17739 :     if (!aRet)
     550             :     {
     551         339 :         BitmapEx rBitmap;
     552         339 :         bool res = vcl::ImageRepository::loadDefaultImage(rBitmap);
     553         339 :         if (res)
     554           0 :             aRet =  Image(rBitmap);
     555             :     }
     556             : 
     557       17739 :     return aRet;
     558             : }
     559             : 
     560      255121 : Image ImageList::GetImage( const OUString& rImageName ) const
     561             : {
     562      255121 :     if( mpImplData )
     563             :     {
     564       74451 :         ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
     565             : 
     566       74451 :         if( pImg )
     567             :         {
     568       74451 :             if( pImg->IsLoadable() )
     569        4743 :                 pImg->Load( mpImplData->maPrefix );
     570       74451 :             return Image( pImg->maBitmapEx );
     571             :         }
     572             :     }
     573             : 
     574      180670 :     return Image();
     575             : }
     576             : 
     577          22 : sal_uInt16 ImageList::GetImageCount() const
     578             : {
     579             : 
     580          22 :     return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0;
     581             : }
     582             : 
     583       15952 : sal_uInt16 ImageList::GetImagePos( sal_uInt16 nId ) const
     584             : {
     585             : 
     586       15952 :     if( mpImplData && nId )
     587             :     {
     588      574493 :         for( size_t i = 0; i < mpImplData->maImages.size(); ++i )
     589             :         {
     590      573887 :             if (mpImplData->maImages[ i ]->mnId == nId)
     591       15346 :                 return static_cast< sal_uInt16 >( i );
     592             :         }
     593             :     }
     594             : 
     595         606 :     return IMAGELIST_IMAGE_NOTFOUND;
     596             : }
     597             : 
     598       15952 : bool ImageList::HasImageAtPos( sal_uInt16 nId ) const
     599             : {
     600       15952 :     return GetImagePos( nId ) != IMAGELIST_IMAGE_NOTFOUND;
     601             : }
     602             : 
     603           0 : sal_uInt16 ImageList::GetImagePos( const OUString& rImageName ) const
     604             : {
     605             : 
     606           0 :     if( mpImplData && !rImageName.isEmpty() )
     607             :     {
     608           0 :         for( size_t i = 0; i < mpImplData->maImages.size(); i++ )
     609             :         {
     610           0 :             if (mpImplData->maImages[i]->maName == rImageName)
     611           0 :                 return static_cast< sal_uInt16 >( i );
     612             :         }
     613             :     }
     614             : 
     615           0 :     return IMAGELIST_IMAGE_NOTFOUND;
     616             : }
     617             : 
     618           0 : sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const
     619             : {
     620             : 
     621           0 :     if( mpImplData && (nPos < GetImageCount()) )
     622           0 :         return mpImplData->maImages[ nPos ]->mnId;
     623             : 
     624           0 :     return 0;
     625             : }
     626             : 
     627           0 : OUString ImageList::GetImageName( sal_uInt16 nPos ) const
     628             : {
     629             : 
     630           0 :     if( mpImplData && (nPos < GetImageCount()) )
     631           0 :         return mpImplData->maImages[ nPos ]->maName;
     632             : 
     633           0 :     return OUString();
     634             : }
     635             : 
     636           0 : void ImageList::GetImageNames( ::std::vector< OUString >& rNames ) const
     637             : {
     638             :     SAL_INFO( "vcl.gdi", "vcl: ImageList::GetImageNames" );
     639             : 
     640           0 :     rNames = ::std::vector< OUString >();
     641             : 
     642           0 :     if( mpImplData )
     643             :     {
     644           0 :         for( size_t i = 0; i < mpImplData->maImages.size(); i++ )
     645             :         {
     646           0 :             const OUString& rName( mpImplData->maImages[ i ]->maName );
     647           0 :             if( !rName.isEmpty())
     648           0 :                 rNames.push_back( rName );
     649             :         }
     650             :     }
     651           0 : }
     652             : 
     653           0 : Size ImageList::GetImageSize() const
     654             : {
     655             : 
     656           0 :     Size aRet;
     657             : 
     658           0 :     if( mpImplData )
     659             :     {
     660           0 :         aRet = mpImplData->maImageSize;
     661             : 
     662             :         // force load of 1st image to see - uncommon case.
     663           0 :         if( aRet.Width() == 0 && aRet.Height() == 0 &&
     664           0 :             !mpImplData->maImages.empty() )
     665             :         {
     666           0 :             Image aTmp = GetImage( mpImplData->maImages[ 0 ]->mnId );
     667           0 :             aRet = mpImplData->maImageSize = aTmp.GetSizePixel();
     668             :         }
     669             :     }
     670           0 :     return aRet;
     671             : }
     672             : 
     673          29 : ImageList& ImageList::operator=( const ImageList& rImageList )
     674             : {
     675             : 
     676          29 :     if( rImageList.mpImplData )
     677          29 :         ++rImageList.mpImplData->mnRefCount;
     678             : 
     679          29 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     680           0 :         delete mpImplData;
     681             : 
     682          29 :     mpImplData = rImageList.mpImplData;
     683             : 
     684          29 :     return *this;
     685             : }
     686             : 
     687           0 : bool ImageList::operator==( const ImageList& rImageList ) const
     688             : {
     689             : 
     690           0 :     bool bRet = false;
     691             : 
     692           0 :     if( rImageList.mpImplData == mpImplData )
     693           0 :         bRet = true;
     694           0 :     else if( !rImageList.mpImplData || !mpImplData )
     695           0 :         bRet = false;
     696           0 :     else if( rImageList.GetImageCount() == GetImageCount() &&
     697           0 :               rImageList.mpImplData->maImageSize == mpImplData->maImageSize )
     698           0 :         bRet = true; // strange semantic
     699             : 
     700           0 :     return bRet;
     701         801 : }
     702             : 
     703             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11