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