LCOV - code coverage report
Current view: top level - libreoffice/vcl/source/gdi - image.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 73 327 22.3 %
Date: 2012-12-27 Functions: 16 41 39.0 %
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_ptr.hpp>
      21             : #include <boost/scoped_array.hpp>
      22             : 
      23             : #include <rtl/logfile.hxx>
      24             : 
      25             : #include <tools/debug.hxx>
      26             : #include <tools/stream.hxx>
      27             : #include <tools/rc.h>
      28             : #include <tools/rc.hxx>
      29             : #include <tools/resmgr.hxx>
      30             : #include <vcl/settings.hxx>
      31             : #include <vcl/outdev.hxx>
      32             : #include <vcl/graph.hxx>
      33             : #include <vcl/svapp.hxx>
      34             : #include <vcl/image.hxx>
      35             : #include <vcl/imagerepository.hxx>
      36             : #include <impimagetree.hxx>
      37             : #include <image.h>
      38             : 
      39             : #if OSL_DEBUG_LEVEL > 0
      40             : #include <rtl/strbuf.hxx>
      41             : #endif
      42             : 
      43             : DBG_NAME( Image )
      44             : DBG_NAME( ImageList )
      45             : 
      46             : using namespace ::com::sun::star;
      47             : 
      48             : // ---------
      49             : // - Image -
      50             : // ---------
      51             : 
      52       19779 : Image::Image() :
      53       19779 :     mpImplData( NULL )
      54             : {
      55             :     DBG_CTOR( Image, NULL );
      56       19779 : }
      57             : 
      58             : // -----------------------------------------------------------------------
      59             : 
      60         236 : Image::Image( const ResId& rResId ) :
      61         236 :     mpImplData( NULL )
      62             : {
      63             :     DBG_CTOR( Image, NULL );
      64             : 
      65         236 :     rResId.SetRT( RSC_IMAGE );
      66             : 
      67         236 :     ResMgr* pResMgr = rResId.GetResMgr();
      68         236 :     if( pResMgr && pResMgr->GetResource( rResId ) )
      69             :     {
      70         236 :         pResMgr->Increment( sizeof( RSHEADER_TYPE ) );
      71             : 
      72         236 :         BitmapEx    aBmpEx;
      73         236 :         sal_uLong       nObjMask = pResMgr->ReadLong();
      74             : 
      75         236 :         if( nObjMask & RSC_IMAGE_IMAGEBITMAP )
      76             :         {
      77         236 :             aBmpEx = BitmapEx( ResId( (RSHEADER_TYPE*)pResMgr->GetClass(), *pResMgr ) );
      78         236 :             pResMgr->Increment( pResMgr->GetObjSize( (RSHEADER_TYPE*)pResMgr->GetClass() ) );
      79             :         }
      80             : 
      81         236 :         if( nObjMask & RSC_IMAGE_MASKBITMAP )
      82             :         {
      83           0 :             if( !aBmpEx.IsEmpty() && aBmpEx.GetTransparentType() == TRANSPARENT_NONE )
      84             :             {
      85           0 :                 const Bitmap aMaskBitmap( ResId( (RSHEADER_TYPE*)pResMgr->GetClass(), *pResMgr ) );
      86           0 :                 aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aMaskBitmap );
      87             :             }
      88             : 
      89           0 :             pResMgr->Increment( pResMgr->GetObjSize( (RSHEADER_TYPE*)pResMgr->GetClass() ) );
      90             :         }
      91             : 
      92         236 :         if( nObjMask & RSC_IMAGE_MASKCOLOR )
      93             :         {
      94         236 :             if( !aBmpEx.IsEmpty() && aBmpEx.GetTransparentType() == TRANSPARENT_NONE )
      95             :             {
      96           0 :                 const Color aMaskColor( ResId( (RSHEADER_TYPE*)pResMgr->GetClass(), *pResMgr ) );
      97           0 :                 aBmpEx = BitmapEx( aBmpEx.GetBitmap(), aMaskColor );
      98             :             }
      99             : 
     100         236 :             pResMgr->Increment( pResMgr->GetObjSize( (RSHEADER_TYPE*)pResMgr->GetClass() ) );
     101             :         }
     102         236 :         if( ! aBmpEx.IsEmpty() )
     103           0 :             ImplInit( aBmpEx );
     104             :     }
     105         236 : }
     106             : 
     107             : // -----------------------------------------------------------------------
     108             : 
     109       13266 : Image::Image( const Image& rImage ) :
     110       13266 :     mpImplData( rImage.mpImplData )
     111             : {
     112             :     DBG_CTOR( Image, NULL );
     113             : 
     114       13266 :     if( mpImplData )
     115           0 :         ++mpImplData->mnRefCount;
     116       13266 : }
     117             : 
     118             : // -----------------------------------------------------------------------
     119             : 
     120         247 : Image::Image( const BitmapEx& rBitmapEx ) :
     121         247 :     mpImplData( NULL )
     122             : {
     123             :     DBG_CTOR( Image, NULL );
     124             : 
     125         247 :     ImplInit( rBitmapEx );
     126         247 : }
     127             : 
     128             : // -----------------------------------------------------------------------
     129             : 
     130         236 : Image::Image( const Bitmap& rBitmap ) :
     131         236 :     mpImplData( NULL )
     132             : {
     133             :     DBG_CTOR( Image, NULL );
     134             : 
     135         236 :     ImplInit( rBitmap );
     136         236 : }
     137             : 
     138             : // -----------------------------------------------------------------------
     139             : 
     140           0 : Image::Image( const Bitmap& rBitmap, const Bitmap& rMaskBitmap ) :
     141           0 :     mpImplData( NULL )
     142             : {
     143             :     DBG_CTOR( Image, NULL );
     144             : 
     145           0 :     const BitmapEx aBmpEx( rBitmap, rMaskBitmap );
     146             : 
     147           0 :     ImplInit( aBmpEx );
     148           0 : }
     149             : 
     150             : // -----------------------------------------------------------------------
     151             : 
     152           0 : Image::Image( const Bitmap& rBitmap, const Color& rColor ) :
     153           0 :     mpImplData( NULL )
     154             : {
     155             :     DBG_CTOR( Image, NULL );
     156             : 
     157           0 :     const BitmapEx aBmpEx( rBitmap, rColor );
     158             : 
     159           0 :     ImplInit( aBmpEx );
     160           0 : }
     161             : 
     162             : // -----------------------------------------------------------------------
     163             : 
     164        2360 : Image::Image( const uno::Reference< graphic::XGraphic >& rxGraphic ) :
     165        2360 :     mpImplData( NULL )
     166             : {
     167             :     DBG_CTOR( Image, NULL );
     168             : 
     169        2360 :     const Graphic aGraphic( rxGraphic );
     170        2360 :     ImplInit( aGraphic.GetBitmapEx() );
     171        2360 : }
     172             : 
     173             : // -----------------------------------------------------------------------
     174             : 
     175       29625 : Image::~Image()
     176             : {
     177             :     DBG_DTOR( Image, NULL );
     178             : 
     179       29625 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     180           0 :         delete mpImplData;
     181       29625 : }
     182             : 
     183             : // -----------------------------------------------------------------------
     184             : 
     185        2843 : void Image::ImplInit( const BitmapEx& rBmpEx )
     186             : {
     187        2843 :     if( !rBmpEx.IsEmpty() )
     188             :     {
     189           0 :         mpImplData = new ImplImage;
     190           0 :         mpImplData->mnRefCount = 1;
     191             : 
     192           0 :         if( rBmpEx.GetTransparentType() == TRANSPARENT_NONE )
     193             :         {
     194           0 :             mpImplData->meType = IMAGETYPE_BITMAP;
     195           0 :             mpImplData->mpData = new Bitmap( rBmpEx.GetBitmap() );
     196             :         }
     197             :         else
     198             :         {
     199           0 :             mpImplData->meType = IMAGETYPE_IMAGE;
     200           0 :             mpImplData->mpData = new ImplImageData( rBmpEx );
     201             :         }
     202             :     }
     203        2843 : }
     204             : 
     205             : // -----------------------------------------------------------------------
     206             : 
     207         930 : Size Image::GetSizePixel() const
     208             : {
     209             :     DBG_CHKTHIS( Image, NULL );
     210             : 
     211         930 :     Size aRet;
     212             : 
     213         930 :     if( mpImplData )
     214             :     {
     215           0 :         switch( mpImplData->meType )
     216             :         {
     217             :             case IMAGETYPE_BITMAP:
     218           0 :                 aRet = static_cast< Bitmap* >( mpImplData->mpData )->GetSizePixel();
     219           0 :             break;
     220             : 
     221             :             case IMAGETYPE_IMAGE:
     222           0 :                 aRet = static_cast< ImplImageData* >( mpImplData->mpData )->maBmpEx.GetSizePixel();
     223           0 :             break;
     224             :         }
     225             :     }
     226             : 
     227         930 :     return aRet;
     228             : }
     229             : 
     230             : // -----------------------------------------------------------------------
     231             : 
     232        2371 : BitmapEx Image::GetBitmapEx() const
     233             : {
     234             :     DBG_CHKTHIS( Image, NULL );
     235             : 
     236        2371 :     BitmapEx aRet;
     237             : 
     238        2371 :     if( mpImplData )
     239             :     {
     240           0 :         switch( mpImplData->meType )
     241             :         {
     242             :             case IMAGETYPE_BITMAP:
     243           0 :                 aRet = *static_cast< Bitmap* >( mpImplData->mpData );
     244           0 :             break;
     245             : 
     246             :             case IMAGETYPE_IMAGE:
     247           0 :                 aRet = static_cast< ImplImageData* >( mpImplData->mpData )->maBmpEx;
     248           0 :             break;
     249             :         }
     250             :     }
     251             : 
     252        2371 :     return aRet;
     253             : }
     254             : 
     255             : // -----------------------------------------------------------------------
     256             : 
     257        2360 : uno::Reference< graphic::XGraphic > Image::GetXGraphic() const
     258             : {
     259        2360 :     const Graphic aGraphic( GetBitmapEx() );
     260             : 
     261        2360 :     return aGraphic.GetXGraphic();
     262             : }
     263             : 
     264             : // -----------------------------------------------------------------------
     265             : 
     266        5023 : Image& Image::operator=( const Image& rImage )
     267             : {
     268             :     DBG_CHKTHIS( Image, NULL );
     269             :     DBG_CHKOBJ( &rImage, Image, NULL );
     270             : 
     271        5023 :     if( rImage.mpImplData )
     272           0 :         ++rImage.mpImplData->mnRefCount;
     273             : 
     274        5023 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     275           0 :         delete mpImplData;
     276             : 
     277        5023 :     mpImplData = rImage.mpImplData;
     278             : 
     279        5023 :     return *this;
     280             : }
     281             : 
     282             : // -----------------------------------------------------------------------
     283             : 
     284         236 : sal_Bool Image::operator==( const Image& rImage ) const
     285             : {
     286             :     DBG_CHKTHIS( Image, NULL );
     287             :     DBG_CHKOBJ( &rImage, Image, NULL );
     288             : 
     289         236 :     bool bRet = false;
     290             : 
     291         236 :     if( rImage.mpImplData == mpImplData )
     292         236 :         bRet = true;
     293           0 :     else if( !rImage.mpImplData || !mpImplData )
     294           0 :         bRet = false;
     295           0 :     else if( rImage.mpImplData->mpData == mpImplData->mpData )
     296           0 :         bRet = true;
     297           0 :     else if( rImage.mpImplData->meType == mpImplData->meType )
     298             :     {
     299           0 :         switch( mpImplData->meType )
     300             :         {
     301             :             case IMAGETYPE_BITMAP:
     302           0 :                 bRet = ( *static_cast< Bitmap* >( rImage.mpImplData->mpData ) == *static_cast< Bitmap* >( mpImplData->mpData ) );
     303           0 :             break;
     304             : 
     305             :             case IMAGETYPE_IMAGE:
     306           0 :                 bRet = static_cast< ImplImageData* >( rImage.mpImplData->mpData )->IsEqual( *static_cast< ImplImageData* >( mpImplData->mpData ) );
     307           0 :             break;
     308             : 
     309             :             default:
     310           0 :                 bRet = false;
     311           0 :             break;
     312             :         }
     313             :     }
     314             : 
     315         236 :     return bRet;
     316             : }
     317             : 
     318             : // -------------
     319             : // - ImageList -
     320             : // -------------
     321             : 
     322        1439 : ImageList::ImageList( sal_uInt16 nInit, sal_uInt16 nGrow ) :
     323             :     mpImplData( NULL ),
     324             :     mnInitSize( nInit ),
     325        1439 :     mnGrowSize( nGrow )
     326             : {
     327             :     DBG_CTOR( ImageList, NULL );
     328        1439 : }
     329             : 
     330             : // -----------------------------------------------------------------------
     331             : 
     332           0 : ImageList::ImageList( const ResId& rResId ) :
     333             :     mpImplData( NULL ),
     334             :     mnInitSize( 1 ),
     335           0 :     mnGrowSize( 4 )
     336             : {
     337             :     RTL_LOGFILE_CONTEXT( aLog, "vcl: ImageList::ImageList( const ResId& rResId )" );
     338             : 
     339             :     DBG_CTOR( ImageList, NULL );
     340             : 
     341           0 :     rResId.SetRT( RSC_IMAGELIST );
     342             : 
     343           0 :     ResMgr* pResMgr = rResId.GetResMgr();
     344             : 
     345           0 :     if( pResMgr && pResMgr->GetResource( rResId ) )
     346             :     {
     347           0 :         pResMgr->Increment( sizeof( RSHEADER_TYPE ) );
     348             : 
     349           0 :         sal_uLong                               nObjMask = pResMgr->ReadLong();
     350           0 :         const String                        aPrefix( pResMgr->ReadString() );
     351           0 :         ::boost::scoped_ptr< Color >        spMaskColor;
     352             : 
     353           0 :         if( nObjMask & RSC_IMAGE_MASKCOLOR )
     354           0 :             spMaskColor.reset( new Color( ResId( (RSHEADER_TYPE*)pResMgr->GetClass(), *pResMgr ) ) );
     355             : 
     356           0 :         pResMgr->Increment( pResMgr->GetObjSize( (RSHEADER_TYPE*)pResMgr->GetClass() ) );
     357             : 
     358           0 :         if( nObjMask & RSC_IMAGELIST_IDLIST )
     359             :         {
     360           0 :             for( sal_Int32 i = 0, nCount = pResMgr->ReadLong(); i < nCount; ++i )
     361           0 :                 pResMgr->ReadLong();
     362             :         }
     363             : 
     364           0 :         sal_Int32 nCount = pResMgr->ReadLong();
     365           0 :         ImplInit( static_cast< sal_uInt16 >( nCount ), Size() );
     366             : 
     367           0 :         BitmapEx aEmpty;
     368           0 :         for( sal_Int32 i = 0; i < nCount; ++i )
     369             :         {
     370           0 :             rtl::OUString aName = pResMgr->ReadString();
     371           0 :             sal_uInt16 nId = static_cast< sal_uInt16 >( pResMgr->ReadLong() );
     372           0 :             mpImplData->AddImage( aName, nId, aEmpty );
     373           0 :         }
     374             : 
     375           0 :         if( nObjMask & RSC_IMAGELIST_IDCOUNT )
     376           0 :             pResMgr->ReadShort();
     377             :     }
     378           0 : }
     379             : 
     380             : // -----------------------------------------------------------------------
     381             : 
     382           0 : ImageList::ImageList( const ::std::vector< ::rtl::OUString >& rNameVector,
     383             :                       const ::rtl::OUString& rPrefix,
     384             :                       const Color* ) :
     385             :     mpImplData( NULL ),
     386             :     mnInitSize( 1 ),
     387           0 :     mnGrowSize( 4 )
     388             : {
     389             :     RTL_LOGFILE_CONTEXT( aLog, "vcl: ImageList::ImageList(const vector< OUString >& ..." );
     390             : 
     391             :     DBG_CTOR( ImageList, NULL );
     392             : 
     393           0 :     ImplInit( sal::static_int_cast< sal_uInt16 >( rNameVector.size() ), Size() );
     394             : 
     395           0 :     mpImplData->maPrefix = rPrefix;
     396           0 :     for( sal_uInt32 i = 0; i < rNameVector.size(); ++i )
     397             :     {
     398           0 :         mpImplData->AddImage( rNameVector[ i ], static_cast< sal_uInt16 >( i ) + 1, BitmapEx() );
     399             :     }
     400           0 : }
     401             : 
     402             : // -----------------------------------------------------------------------
     403             : 
     404           0 : ImageList::ImageList( const ImageList& rImageList ) :
     405             :     mpImplData( rImageList.mpImplData ),
     406             :     mnInitSize( rImageList.mnInitSize ),
     407           0 :     mnGrowSize( rImageList.mnGrowSize )
     408             : {
     409             :     DBG_CTOR( ImageList, NULL );
     410             : 
     411           0 :     if( mpImplData )
     412           0 :         ++mpImplData->mnRefCount;
     413           0 : }
     414             : 
     415             : // -----------------------------------------------------------------------
     416             : 
     417         552 : ImageList::~ImageList()
     418             : {
     419             :     DBG_DTOR( ImageList, NULL );
     420             : 
     421         552 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     422           0 :         delete mpImplData;
     423         552 : }
     424             : 
     425           0 : void ImageList::ImplInit( sal_uInt16 nItems, const Size &rSize )
     426             : {
     427           0 :     mpImplData = new ImplImageList;
     428           0 :     mpImplData->mnRefCount = 1;
     429           0 :     mpImplData->maImages.reserve( nItems );
     430           0 :     mpImplData->maImageSize = rSize;
     431           0 : }
     432             : 
     433             : // -----------------------------------------------------------------------
     434             : 
     435           0 : void ImageAryData::Load(const rtl::OUString &rPrefix)
     436             : {
     437           0 :     static ImplImageTreeSingletonRef aImageTree;
     438             : 
     439           0 :     ::rtl::OUString aSymbolsStyle = Application::GetSettings().GetStyleSettings().GetCurrentSymbolsStyleName();
     440             : 
     441           0 :     BitmapEx aBmpEx;
     442             : 
     443           0 :     rtl::OUString aFileName = rPrefix;
     444           0 :     aFileName += maName;
     445             : #if OSL_DEBUG_LEVEL > 0
     446             :     bool bSuccess =
     447             : #endif
     448           0 :         aImageTree->loadImage( aFileName, aSymbolsStyle, maBitmapEx, true );
     449             : #if OSL_DEBUG_LEVEL > 0
     450             :     if ( !bSuccess )
     451             :     {
     452             :         ::rtl::OStringBuffer aMessage;
     453             :         aMessage.append( "ImageAryData::Load: failed to load image '" );
     454             :         aMessage.append( ::rtl::OUStringToOString( aFileName, RTL_TEXTENCODING_UTF8 ).getStr() );
     455             :         aMessage.append( "'" );
     456             :         OSL_FAIL( aMessage.makeStringAndClear().getStr() );
     457             :     }
     458             : #endif
     459           0 : }
     460             : 
     461             : // -----------------------------------------------------------------------
     462             : // Rather a performance hazard:
     463           0 : BitmapEx ImageList::GetAsHorizontalStrip() const
     464             : {
     465           0 :     Size aSize( mpImplData->maImageSize );
     466           0 :     sal_uInt16 nCount = GetImageCount();
     467           0 :     if( !nCount )
     468           0 :         return BitmapEx();
     469           0 :     aSize.Width() *= nCount;
     470             : 
     471             :     // Load any stragglers
     472           0 :     for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
     473             :     {
     474           0 :         ImageAryData *pData = mpImplData->maImages[ nIdx ];
     475           0 :         if( pData->IsLoadable() )
     476           0 :             pData->Load( mpImplData->maPrefix );
     477             :     }
     478             : 
     479           0 :     BitmapEx aTempl = mpImplData->maImages[ 0 ]->maBitmapEx;
     480           0 :     BitmapEx aResult;
     481           0 :     Bitmap aPixels( aSize, aTempl.GetBitmap().GetBitCount() );
     482           0 :     if( aTempl.IsAlpha() )
     483           0 :         aResult = BitmapEx( aPixels, AlphaMask( aSize ) );
     484           0 :     else if( aTempl.IsTransparent() )
     485           0 :         aResult = BitmapEx( aPixels, Bitmap( aSize, aTempl.GetMask().GetBitCount() ) );
     486             :     else
     487           0 :         aResult = BitmapEx( aPixels );
     488             : 
     489           0 :     Rectangle aSrcRect( Point( 0, 0 ), mpImplData->maImageSize );
     490           0 :     for (sal_uInt16 nIdx = 0; nIdx < nCount; nIdx++)
     491             :     {
     492           0 :         Rectangle aDestRect( Point( nIdx * mpImplData->maImageSize.Width(), 0 ),
     493           0 :                              mpImplData->maImageSize );
     494           0 :         ImageAryData *pData = mpImplData->maImages[ nIdx ];
     495           0 :         aResult.CopyPixel( aDestRect, aSrcRect, &pData->maBitmapEx);
     496             :     }
     497             : 
     498           0 :     return aResult;
     499             : }
     500             : 
     501             : // -----------------------------------------------------------------------
     502             : 
     503           0 : void ImageList::InsertFromHorizontalStrip( const BitmapEx &rBitmapEx,
     504             :                                            const std::vector< rtl::OUString > &rNameVector )
     505             : {
     506           0 :     sal_uInt16 nItems = sal::static_int_cast< sal_uInt16 >( rNameVector.size() );
     507             : 
     508           0 :     if (!nItems)
     509           0 :             return;
     510             : 
     511           0 :     Size aSize( rBitmapEx.GetSizePixel() );
     512             :     DBG_ASSERT (rBitmapEx.GetSizePixel().Width() % nItems == 0,
     513             :                 "ImageList::InsertFromHorizontalStrip - very odd size");
     514           0 :     aSize.Width() /= nItems;
     515           0 :     ImplInit( nItems, aSize );
     516             : 
     517           0 :     for (sal_uInt16 nIdx = 0; nIdx < nItems; nIdx++)
     518             :     {
     519           0 :         BitmapEx aBitmap( rBitmapEx, Point( nIdx * aSize.Width(), 0 ), aSize );
     520           0 :         mpImplData->AddImage( rNameVector[ nIdx ], nIdx + 1, aBitmap );
     521           0 :     }
     522             : }
     523             : 
     524             : // -----------------------------------------------------------------------
     525             : 
     526           0 : void ImageList::InsertFromHorizontalBitmap( const ResId& rResId,
     527             :                                             sal_uInt16       nCount,
     528             :                                             const Color *pMaskColor,
     529             :                                             const Color *pSearchColors,
     530             :                                             const Color *pReplaceColors,
     531             :                                             sal_uLong        nColorCount)
     532             : {
     533           0 :     BitmapEx aBmpEx( rResId );
     534           0 :     if (!aBmpEx.IsTransparent())
     535             :     {
     536           0 :         if( pMaskColor )
     537           0 :             aBmpEx = BitmapEx( aBmpEx.GetBitmap(), *pMaskColor );
     538             :         else
     539           0 :             aBmpEx = BitmapEx( aBmpEx.GetBitmap() );
     540             :     }
     541           0 :     if ( nColorCount && pSearchColors && pReplaceColors )
     542           0 :         aBmpEx.Replace( pSearchColors, pReplaceColors, nColorCount );
     543             : 
     544           0 :     std::vector< rtl::OUString > aNames( nCount );
     545           0 :     InsertFromHorizontalStrip( aBmpEx, aNames );
     546           0 : }
     547             : 
     548             : // -----------------------------------------------------------------------
     549             : 
     550           0 : sal_uInt16 ImageList::ImplGetImageId( const ::rtl::OUString& rImageName ) const
     551             : {
     552             :     DBG_CHKTHIS( ImageList, NULL );
     553             : 
     554           0 :     ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
     555           0 :     if( pImg )
     556           0 :         return pImg->mnId;
     557             :     else
     558           0 :         return 0;
     559             : }
     560             : 
     561             : // -----------------------------------------------------------------------
     562             : 
     563           0 : void ImageList::AddImage( const ::rtl::OUString& rImageName, const Image& rImage )
     564             : {
     565             :     DBG_ASSERT( GetImagePos( rImageName ) == IMAGELIST_IMAGE_NOTFOUND, "ImageList::AddImage() - ImageName already exists" );
     566             : 
     567           0 :     if( !mpImplData )
     568           0 :         ImplInit( 0, rImage.GetSizePixel() );
     569             : 
     570           0 :     mpImplData->AddImage( rImageName, GetImageCount() + 1,
     571           0 :                           rImage.GetBitmapEx() );
     572           0 : }
     573             : 
     574             : // -----------------------------------------------------------------------
     575             : 
     576           0 : void ImageList::ReplaceImage( const ::rtl::OUString& rImageName, const Image& rImage )
     577             : {
     578           0 :     const sal_uInt16 nId = ImplGetImageId( rImageName );
     579             : 
     580           0 :     if( nId )
     581             :     {
     582           0 :         RemoveImage( nId );
     583             : 
     584           0 :         if( !mpImplData )
     585           0 :             ImplInit( 0, rImage.GetSizePixel() );
     586           0 :         mpImplData->AddImage( rImageName, nId, rImage.GetBitmapEx());
     587             :     }
     588           0 : }
     589             : 
     590             : // -----------------------------------------------------------------------
     591             : 
     592           0 : void ImageList::RemoveImage( sal_uInt16 nId )
     593             : {
     594             :     DBG_CHKTHIS( ImageList, NULL );
     595             : 
     596           0 :     for( sal_uInt32 i = 0; i < mpImplData->maImages.size(); ++i )
     597             :     {
     598           0 :         if( mpImplData->maImages[ i ]->mnId == nId )
     599             :         {
     600           0 :             mpImplData->RemoveImage( static_cast< sal_uInt16 >( i ) );
     601           0 :             break;
     602             :         }
     603             :     }
     604           0 : }
     605             : 
     606             : // -----------------------------------------------------------------------
     607             : 
     608           0 : Image ImageList::GetImage( sal_uInt16 nId ) const
     609             : {
     610             :     DBG_CHKTHIS( ImageList, NULL );
     611             : 
     612           0 :     Image aRet;
     613             : 
     614           0 :     if( mpImplData )
     615             :     {
     616           0 :         std::vector<ImageAryData *>::iterator aIter;
     617           0 :         for( aIter = mpImplData->maImages.begin();
     618           0 :              aIter != mpImplData->maImages.end(); ++aIter)
     619             :         {
     620           0 :             if ((*aIter)->mnId == nId)
     621             :             {
     622           0 :                 if( (*aIter)->IsLoadable() )
     623           0 :                     (*aIter)->Load( mpImplData->maPrefix );
     624             : 
     625           0 :                 aRet = Image( (*aIter)->maBitmapEx );
     626             :             }
     627             :         }
     628             :     }
     629             : 
     630           0 :     if (!aRet)
     631             :     {
     632           0 :         BitmapEx rBitmap;
     633           0 :         bool res = ::vcl::ImageRepository::loadDefaultImage(rBitmap);
     634           0 :         if (res)
     635           0 :             aRet =  Image(rBitmap);
     636             :     }
     637             : 
     638           0 :     return aRet;
     639             : }
     640             : 
     641             : // -----------------------------------------------------------------------
     642             : 
     643        2360 : Image ImageList::GetImage( const ::rtl::OUString& rImageName ) const
     644             : {
     645        2360 :     if( mpImplData )
     646             :     {
     647           0 :         ImageAryData *pImg = mpImplData->maNameHash[ rImageName ];
     648             : 
     649           0 :         if( pImg )
     650             :         {
     651           0 :             if( pImg->IsLoadable() )
     652           0 :                 pImg->Load( mpImplData->maPrefix );
     653           0 :             return Image( pImg->maBitmapEx );
     654             :         }
     655             :     }
     656             : 
     657        2360 :     return Image();
     658             : }
     659             : 
     660             : // -----------------------------------------------------------------------
     661             : 
     662           0 : sal_uInt16 ImageList::GetImageCount() const
     663             : {
     664             :     DBG_CHKTHIS( ImageList, NULL );
     665             : 
     666           0 :     return mpImplData ? static_cast< sal_uInt16 >( mpImplData->maImages.size() ) : 0;
     667             : }
     668             : 
     669             : // -----------------------------------------------------------------------
     670             : 
     671           0 : sal_uInt16 ImageList::GetImagePos( sal_uInt16 nId ) const
     672             : {
     673             :     DBG_CHKTHIS( ImageList, NULL );
     674             : 
     675           0 :     if( mpImplData && nId )
     676             :     {
     677           0 :         for( sal_uInt32 i = 0; i < mpImplData->maImages.size(); ++i )
     678             :         {
     679           0 :             if (mpImplData->maImages[ i ]->mnId == nId)
     680           0 :                 return static_cast< sal_uInt16 >( i );
     681             :         }
     682             :     }
     683             : 
     684           0 :     return IMAGELIST_IMAGE_NOTFOUND;
     685             : }
     686             : 
     687           0 : bool ImageList::HasImageAtPos( sal_uInt16 nId ) const
     688             : {
     689           0 :     return GetImagePos( nId ) != IMAGELIST_IMAGE_NOTFOUND;
     690             : }
     691             : 
     692             : // -----------------------------------------------------------------------
     693             : 
     694           0 : sal_uInt16 ImageList::GetImagePos( const ::rtl::OUString& rImageName ) const
     695             : {
     696             :     DBG_CHKTHIS( ImageList, NULL );
     697             : 
     698           0 :     if( mpImplData && !rImageName.isEmpty() )
     699             :     {
     700           0 :         for( sal_uInt32 i = 0; i < mpImplData->maImages.size(); i++ )
     701             :         {
     702           0 :             if (mpImplData->maImages[i]->maName == rImageName)
     703           0 :                 return static_cast< sal_uInt16 >( i );
     704             :         }
     705             :     }
     706             : 
     707           0 :     return IMAGELIST_IMAGE_NOTFOUND;
     708             : }
     709             : 
     710             : // -----------------------------------------------------------------------
     711             : 
     712           0 : sal_uInt16 ImageList::GetImageId( sal_uInt16 nPos ) const
     713             : {
     714             :     DBG_CHKTHIS( ImageList, NULL );
     715             : 
     716           0 :     if( mpImplData && (nPos < GetImageCount()) )
     717           0 :         return mpImplData->maImages[ nPos ]->mnId;
     718             : 
     719           0 :     return 0;
     720             : }
     721             : 
     722             : // -----------------------------------------------------------------------
     723             : 
     724           0 : ::rtl::OUString ImageList::GetImageName( sal_uInt16 nPos ) const
     725             : {
     726             :     DBG_CHKTHIS( ImageList, NULL );
     727             : 
     728           0 :     if( mpImplData && (nPos < GetImageCount()) )
     729           0 :         return mpImplData->maImages[ nPos ]->maName;
     730             : 
     731           0 :     return ::rtl::OUString();
     732             : }
     733             : 
     734             : // -----------------------------------------------------------------------
     735             : 
     736           0 : void ImageList::GetImageNames( ::std::vector< ::rtl::OUString >& rNames ) const
     737             : {
     738             :     RTL_LOGFILE_CONTEXT( aLog, "vcl: ImageList::GetImageNames" );
     739             : 
     740             :     DBG_CHKTHIS( ImageList, NULL );
     741             : 
     742           0 :     rNames = ::std::vector< ::rtl::OUString >();
     743             : 
     744           0 :     if( mpImplData )
     745             :     {
     746           0 :         for( sal_uInt32 i = 0; i < mpImplData->maImages.size(); i++ )
     747             :         {
     748           0 :             const rtl::OUString& rName( mpImplData->maImages[ i ]->maName );
     749           0 :             if( !rName.isEmpty())
     750           0 :                 rNames.push_back( rName );
     751             :         }
     752             :     }
     753           0 : }
     754             : 
     755             : // -----------------------------------------------------------------------
     756             : 
     757           0 : Size ImageList::GetImageSize() const
     758             : {
     759             :     DBG_CHKTHIS( ImageList, NULL );
     760             : 
     761           0 :     Size aRet;
     762             : 
     763           0 :     if( mpImplData )
     764             :     {
     765           0 :         aRet = mpImplData->maImageSize;
     766             : 
     767             :         // force load of 1st image to see - uncommon case.
     768           0 :         if( aRet.Width() == 0 && aRet.Height() == 0 &&
     769           0 :             !mpImplData->maImages.empty() )
     770             :         {
     771           0 :             Image aTmp = GetImage( mpImplData->maImages[ 0 ]->mnId );
     772           0 :             aRet = mpImplData->maImageSize = aTmp.GetSizePixel();
     773             :         }
     774             :     }
     775           0 :     return aRet;
     776             : }
     777             : 
     778             : // -----------------------------------------------------------------------
     779             : 
     780           0 : ImageList& ImageList::operator=( const ImageList& rImageList )
     781             : {
     782             :     DBG_CHKTHIS( ImageList, NULL );
     783             :     DBG_CHKOBJ( &rImageList, ImageList, NULL );
     784             : 
     785           0 :     if( rImageList.mpImplData )
     786           0 :         ++rImageList.mpImplData->mnRefCount;
     787             : 
     788           0 :     if( mpImplData && ( 0 == --mpImplData->mnRefCount ) )
     789           0 :         delete mpImplData;
     790             : 
     791           0 :     mpImplData = rImageList.mpImplData;
     792             : 
     793           0 :     return *this;
     794             : }
     795             : 
     796             : // -----------------------------------------------------------------------
     797             : 
     798           0 : sal_Bool ImageList::operator==( const ImageList& rImageList ) const
     799             : {
     800             :     DBG_CHKTHIS( ImageList, NULL );
     801             :     DBG_CHKOBJ( &rImageList, ImageList, NULL );
     802             : 
     803           0 :     bool bRet = false;
     804             : 
     805           0 :     if( rImageList.mpImplData == mpImplData )
     806           0 :         bRet = true;
     807           0 :     else if( !rImageList.mpImplData || !mpImplData )
     808           0 :         bRet = false;
     809           0 :     else if( rImageList.GetImageCount() == GetImageCount() &&
     810           0 :               rImageList.mpImplData->maImageSize == mpImplData->maImageSize )
     811           0 :         bRet = true; // strange semantic
     812             : 
     813           0 :     return bRet;
     814             : }
     815             : 
     816             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10