xref: /AOO41X/main/vcl/source/gdi/impimage.cxx (revision 9f62ea84a806e17e6f2bbff75724a7257a0eb5d9)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <vcl/outdev.hxx>
28cdf0e10cSrcweir #include <vcl/bitmapex.hxx>
29cdf0e10cSrcweir #include <vcl/alpha.hxx>
30cdf0e10cSrcweir #include <vcl/window.hxx>
31cdf0e10cSrcweir #include <vcl/bmpacc.hxx>
32cdf0e10cSrcweir #include <vcl/virdev.hxx>
33cdf0e10cSrcweir #include <vcl/image.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <image.h>
36cdf0e10cSrcweir 
37cdf0e10cSrcweir // -----------
38cdf0e10cSrcweir // - Defines -
39cdf0e10cSrcweir // -----------
40cdf0e10cSrcweir 
41cdf0e10cSrcweir #define IMPSYSIMAGEITEM_MASK		( 0x01 )
42cdf0e10cSrcweir #define IMPSYSIMAGEITEM_ALPHA		( 0x02 )
43cdf0e10cSrcweir #define DISA_ALL					( 0xffff )
44cdf0e10cSrcweir 
45cdf0e10cSrcweir // ----------------
46cdf0e10cSrcweir // - ImageAryData -
47cdf0e10cSrcweir // ----------------
48cdf0e10cSrcweir 
ImageAryData()49cdf0e10cSrcweir ImageAryData::ImageAryData() :
50cdf0e10cSrcweir 	maName(),
51cdf0e10cSrcweir 	mnId( 0 ),
52cdf0e10cSrcweir 	maBitmapEx()
53cdf0e10cSrcweir {
54cdf0e10cSrcweir }
55cdf0e10cSrcweir 
56cdf0e10cSrcweir // -----------------------------------------------------------------------
57cdf0e10cSrcweir 
ImageAryData(const ImageAryData & rData)58cdf0e10cSrcweir ImageAryData::ImageAryData( const ImageAryData& rData ) :
59cdf0e10cSrcweir 	maName( rData.maName ),
60cdf0e10cSrcweir 	mnId( rData.mnId ),
61cdf0e10cSrcweir 	maBitmapEx( rData.maBitmapEx )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir }
64cdf0e10cSrcweir 
ImageAryData(const rtl::OUString & aName,sal_uInt16 nId,const BitmapEx & aBitmap)65cdf0e10cSrcweir ImageAryData::ImageAryData( const rtl::OUString &aName,
66cdf0e10cSrcweir 							sal_uInt16 nId, const BitmapEx &aBitmap )
67cdf0e10cSrcweir 		: maName( aName ), mnId( nId ), maBitmapEx( aBitmap )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir // -----------------------------------------------------------------------
72cdf0e10cSrcweir 
~ImageAryData()73cdf0e10cSrcweir ImageAryData::~ImageAryData()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir }
76cdf0e10cSrcweir 
77cdf0e10cSrcweir // -----------------------------------------------------------------------
78cdf0e10cSrcweir 
operator =(const ImageAryData & rData)79cdf0e10cSrcweir ImageAryData& ImageAryData::operator=( const ImageAryData& rData )
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	maName = rData.maName;
82cdf0e10cSrcweir 	mnId = rData.mnId;
83cdf0e10cSrcweir 	maBitmapEx = rData.maBitmapEx;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir 	return *this;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir // -----------------
89cdf0e10cSrcweir // - ImplImageList -
90cdf0e10cSrcweir // -----------------
91cdf0e10cSrcweir 
ImplImageList()92cdf0e10cSrcweir ImplImageList::ImplImageList()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
ImplImageList(const ImplImageList & aSrc)96cdf0e10cSrcweir ImplImageList::ImplImageList( const ImplImageList &aSrc ) :
97cdf0e10cSrcweir     maPrefix( aSrc.maPrefix ),
98cdf0e10cSrcweir     maImageSize( aSrc.maImageSize ),
99cdf0e10cSrcweir     mnRefCount( 1 )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	maImages.reserve( aSrc.maImages.size() );
102cdf0e10cSrcweir     for ( ImageAryDataVec::const_iterator aIt = aSrc.maImages.begin(), aEnd = aSrc.maImages.end(); aIt != aEnd; ++aIt )
103cdf0e10cSrcweir 	{
104cdf0e10cSrcweir         ImageAryData* pAryData = new ImageAryData( **aIt );
105cdf0e10cSrcweir         maImages.push_back( pAryData );
106cdf0e10cSrcweir         if( pAryData->maName.getLength() )
107cdf0e10cSrcweir             maNameHash [ pAryData->maName ] = pAryData;
108cdf0e10cSrcweir 	}
109cdf0e10cSrcweir }
110cdf0e10cSrcweir 
~ImplImageList()111cdf0e10cSrcweir ImplImageList::~ImplImageList()
112cdf0e10cSrcweir {
113cdf0e10cSrcweir     for ( ImageAryDataVec::iterator aIt = maImages.begin(), aEnd = maImages.end(); aIt != aEnd; ++aIt )
114cdf0e10cSrcweir         delete *aIt;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir 
AddImage(const::rtl::OUString & aName,sal_uInt16 nId,const BitmapEx & aBitmapEx)117cdf0e10cSrcweir void ImplImageList::AddImage( const ::rtl::OUString &aName,
118cdf0e10cSrcweir 							  sal_uInt16 nId, const BitmapEx &aBitmapEx )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	ImageAryData *pImg = new ImageAryData( aName, nId, aBitmapEx );
121cdf0e10cSrcweir 	maImages.push_back( pImg );
122cdf0e10cSrcweir 	if( aName.getLength() )
123cdf0e10cSrcweir 		maNameHash [ aName ] = pImg;
124cdf0e10cSrcweir }
125cdf0e10cSrcweir 
RemoveImage(sal_uInt16 nPos)126cdf0e10cSrcweir void ImplImageList::RemoveImage( sal_uInt16 nPos )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir 	ImageAryData *pImg = maImages[ nPos ];
129cdf0e10cSrcweir 	if( pImg->maName.getLength() )
130cdf0e10cSrcweir 		maNameHash.erase( pImg->maName );
131cdf0e10cSrcweir 	maImages.erase( maImages.begin() + nPos );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
GetImageCount() const134cdf0e10cSrcweir sal_uInt16 ImplImageList::GetImageCount() const
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     return sal::static_int_cast< sal_uInt16 >( maImages.size() );
137cdf0e10cSrcweir }
138cdf0e10cSrcweir 
139cdf0e10cSrcweir // -----------------
140cdf0e10cSrcweir // - ImplImageData -
141cdf0e10cSrcweir // -----------------
142cdf0e10cSrcweir 
ImplImageData(const BitmapEx & rBmpEx)143cdf0e10cSrcweir ImplImageData::ImplImageData( const BitmapEx& rBmpEx ) :
144cdf0e10cSrcweir 	mpImageBitmap( NULL ),
145cdf0e10cSrcweir 	maBmpEx( rBmpEx )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir // -----------------------------------------------------------------------
150cdf0e10cSrcweir 
~ImplImageData()151cdf0e10cSrcweir ImplImageData::~ImplImageData()
152cdf0e10cSrcweir {
153cdf0e10cSrcweir 	delete mpImageBitmap;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
156cdf0e10cSrcweir // -----------------
157cdf0e10cSrcweir // - ImplImageData -
158cdf0e10cSrcweir // -----------------
159cdf0e10cSrcweir 
IsEqual(const ImplImageData & rData)160cdf0e10cSrcweir sal_Bool ImplImageData::IsEqual( const ImplImageData& rData )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir 	return( maBmpEx == rData.maBmpEx );
163cdf0e10cSrcweir }
164cdf0e10cSrcweir 
165cdf0e10cSrcweir // -------------
166cdf0e10cSrcweir // - ImplImage -
167cdf0e10cSrcweir // -------------
168cdf0e10cSrcweir 
ImplImage()169cdf0e10cSrcweir ImplImage::ImplImage()
170cdf0e10cSrcweir {
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir // ------------------------------------------------------------------------------
174cdf0e10cSrcweir 
~ImplImage()175cdf0e10cSrcweir ImplImage::~ImplImage()
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	switch( meType )
178cdf0e10cSrcweir 	{
179cdf0e10cSrcweir 		case IMAGETYPE_BITMAP:
180cdf0e10cSrcweir 			delete static_cast< Bitmap* >( mpData );
181cdf0e10cSrcweir 		break;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 		case IMAGETYPE_IMAGE:
184cdf0e10cSrcweir 			delete static_cast< ImplImageData* >( mpData );
185cdf0e10cSrcweir 		break;
186cdf0e10cSrcweir 	}
187cdf0e10cSrcweir }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir // ----------------
190cdf0e10cSrcweir // - ImplImageBmp -
191cdf0e10cSrcweir // ----------------
192cdf0e10cSrcweir 
ImplImageBmp()193cdf0e10cSrcweir ImplImageBmp::ImplImageBmp() :
194cdf0e10cSrcweir 	mpDisplayBmp( NULL ),
195cdf0e10cSrcweir 	mpInfoAry( NULL ),
196cdf0e10cSrcweir 	mnSize( 0 )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir }
199cdf0e10cSrcweir 
200cdf0e10cSrcweir // -------------
201cdf0e10cSrcweir // - ImplImage -
202cdf0e10cSrcweir // -------------
203cdf0e10cSrcweir 
~ImplImageBmp()204cdf0e10cSrcweir ImplImageBmp::~ImplImageBmp()
205cdf0e10cSrcweir {
206cdf0e10cSrcweir 	delete[] mpInfoAry;
207cdf0e10cSrcweir 	delete mpDisplayBmp;
208cdf0e10cSrcweir }
209cdf0e10cSrcweir 
210cdf0e10cSrcweir // -----------------------------------------------------------------------
211cdf0e10cSrcweir 
Create(long nItemWidth,long nItemHeight,sal_uInt16 nInitSize)212cdf0e10cSrcweir void ImplImageBmp::Create( long nItemWidth, long nItemHeight, sal_uInt16 nInitSize )
213cdf0e10cSrcweir {
214cdf0e10cSrcweir 	const Size aTotalSize( nInitSize * nItemWidth, nItemHeight );
215cdf0e10cSrcweir 
216cdf0e10cSrcweir 	maBmpEx = Bitmap( aTotalSize, 24 );
217cdf0e10cSrcweir 	maDisabledBmpEx.SetEmpty();
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	delete mpDisplayBmp;
220cdf0e10cSrcweir 	mpDisplayBmp = NULL;
221cdf0e10cSrcweir 
222cdf0e10cSrcweir 	maSize = Size( nItemWidth, nItemHeight );
223cdf0e10cSrcweir 	mnSize = nInitSize;
224cdf0e10cSrcweir 
225cdf0e10cSrcweir 	delete[] mpInfoAry;
226cdf0e10cSrcweir 	mpInfoAry = new sal_uInt8[ mnSize ];
227cdf0e10cSrcweir 	memset( mpInfoAry, 0, mnSize );
228cdf0e10cSrcweir }
229cdf0e10cSrcweir 
230cdf0e10cSrcweir // -----------------------------------------------------------------------
231cdf0e10cSrcweir 
Create(const BitmapEx & rBmpEx,long nItemWidth,long nItemHeight,sal_uInt16 nInitSize)232cdf0e10cSrcweir void ImplImageBmp::Create( const BitmapEx& rBmpEx, long nItemWidth, long nItemHeight, sal_uInt16 nInitSize )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir 	maBmpEx = rBmpEx;
235cdf0e10cSrcweir 	maDisabledBmpEx.SetEmpty();
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 	delete mpDisplayBmp;
238cdf0e10cSrcweir 	mpDisplayBmp = NULL;
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	maSize = Size( nItemWidth, nItemHeight );
241cdf0e10cSrcweir 	mnSize = nInitSize;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir 	delete[] mpInfoAry;
244cdf0e10cSrcweir 	mpInfoAry = new sal_uInt8[ mnSize ];
245cdf0e10cSrcweir 	memset( mpInfoAry,
246cdf0e10cSrcweir 			rBmpEx.IsAlpha() ? IMPSYSIMAGEITEM_ALPHA : ( rBmpEx.IsTransparent() ? IMPSYSIMAGEITEM_MASK : 0 ),
247cdf0e10cSrcweir 			mnSize );
248cdf0e10cSrcweir }
249cdf0e10cSrcweir 
250cdf0e10cSrcweir // -----------------------------------------------------------------------
251cdf0e10cSrcweir 
Expand(sal_uInt16 nGrowSize)252cdf0e10cSrcweir void ImplImageBmp::Expand( sal_uInt16 nGrowSize )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir 	const sal_uLong 	nDX = nGrowSize * maSize.Width();
255cdf0e10cSrcweir 	const sal_uInt16	nOldSize = mnSize;
256cdf0e10cSrcweir 	sal_uInt8*			pNewAry = new sal_uInt8[ mnSize = sal::static_int_cast<sal_uInt16>(mnSize+nGrowSize) ];
257cdf0e10cSrcweir 
258cdf0e10cSrcweir 	maBmpEx.Expand( nDX, 0UL );
259cdf0e10cSrcweir 
260cdf0e10cSrcweir 	if( !maDisabledBmpEx.IsEmpty() )
261cdf0e10cSrcweir 		maDisabledBmpEx.Expand( nDX, 0UL );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 	delete mpDisplayBmp;
264cdf0e10cSrcweir 	mpDisplayBmp = NULL;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir 	memset( pNewAry, 0, mnSize );
267cdf0e10cSrcweir 	memcpy( pNewAry, mpInfoAry, nOldSize );
268cdf0e10cSrcweir 	delete[] mpInfoAry;
269cdf0e10cSrcweir 	mpInfoAry = pNewAry;
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir // -----------------------------------------------------------------------
273cdf0e10cSrcweir 
Invert()274cdf0e10cSrcweir void ImplImageBmp::Invert()
275cdf0e10cSrcweir {
276cdf0e10cSrcweir 	delete mpDisplayBmp;
277cdf0e10cSrcweir 	mpDisplayBmp = NULL;
278cdf0e10cSrcweir 
279cdf0e10cSrcweir     maBmpEx.Invert();
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir // -----------------------------------------------------------------------
283cdf0e10cSrcweir 
Replace(sal_uInt16 nPos,sal_uInt16 nSrcPos)284cdf0e10cSrcweir void ImplImageBmp::Replace( sal_uInt16 nPos, sal_uInt16 nSrcPos )
285cdf0e10cSrcweir {
286cdf0e10cSrcweir     const Point     aSrcPos( nSrcPos * maSize.Width(), 0L ), aPos( nPos * maSize.Width(), 0L );
287cdf0e10cSrcweir 	const Rectangle aSrcRect( aSrcPos, maSize );
288cdf0e10cSrcweir 	const Rectangle aDstRect( aPos, maSize );
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	maBmpEx.CopyPixel( aDstRect, aSrcRect );
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 	if( !maDisabledBmpEx.IsEmpty() )
293cdf0e10cSrcweir 		maDisabledBmpEx.CopyPixel( aDstRect, aSrcRect );
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 	delete mpDisplayBmp;
296cdf0e10cSrcweir 	mpDisplayBmp = NULL;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 	mpInfoAry[ nPos ] = mpInfoAry[ nSrcPos ];
299cdf0e10cSrcweir }
300cdf0e10cSrcweir 
301cdf0e10cSrcweir // -----------------------------------------------------------------------
302cdf0e10cSrcweir 
Replace(sal_uInt16 nPos,const ImplImageBmp & rImageBmp,sal_uInt16 nSrcPos)303cdf0e10cSrcweir void ImplImageBmp::Replace( sal_uInt16 nPos, const ImplImageBmp& rImageBmp, sal_uInt16 nSrcPos )
304cdf0e10cSrcweir {
305cdf0e10cSrcweir     const Point     aSrcPos( nSrcPos * maSize.Width(), 0L ), aPos( nPos * maSize.Width(), 0L );
306cdf0e10cSrcweir 	const Rectangle aSrcRect( aSrcPos, maSize );
307cdf0e10cSrcweir 	const Rectangle aDstRect( aPos, maSize );
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 	maBmpEx.CopyPixel( aDstRect, aSrcRect, &rImageBmp.maBmpEx );
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 	ImplUpdateDisabledBmpEx( nPos );
312cdf0e10cSrcweir 	delete mpDisplayBmp;
313cdf0e10cSrcweir 	mpDisplayBmp = NULL;
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 	mpInfoAry[ nPos ] = rImageBmp.mpInfoAry[ nSrcPos ];
316cdf0e10cSrcweir }
317cdf0e10cSrcweir 
318cdf0e10cSrcweir // -----------------------------------------------------------------------
319cdf0e10cSrcweir 
Replace(sal_uInt16 nPos,const BitmapEx & rBmpEx)320cdf0e10cSrcweir void ImplImageBmp::Replace( sal_uInt16 nPos, const BitmapEx& rBmpEx )
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     const Point     aNullPos, aPos( nPos * maSize.Width(), 0L );
323cdf0e10cSrcweir 	const Rectangle aSrcRect( aNullPos, maSize );
324cdf0e10cSrcweir 	const Rectangle aDstRect( aPos, maSize );
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 	maBmpEx.CopyPixel( aDstRect, aSrcRect, &rBmpEx );
327cdf0e10cSrcweir 
328cdf0e10cSrcweir 	ImplUpdateDisabledBmpEx( nPos );
329cdf0e10cSrcweir 	delete mpDisplayBmp;
330cdf0e10cSrcweir 	mpDisplayBmp = NULL;
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	mpInfoAry[ nPos ] &= ~( IMPSYSIMAGEITEM_MASK | IMPSYSIMAGEITEM_ALPHA );
333cdf0e10cSrcweir 	mpInfoAry[ nPos ] |= ( rBmpEx.IsAlpha() ? IMPSYSIMAGEITEM_ALPHA : ( rBmpEx.IsTransparent() ? IMPSYSIMAGEITEM_MASK : 0 ) );
334cdf0e10cSrcweir }
335cdf0e10cSrcweir 
336cdf0e10cSrcweir // -----------------------------------------------------------------------
337cdf0e10cSrcweir 
ReplaceColors(const Color * pSrcColors,const Color * pDstColors,sal_uLong nColorCount)338cdf0e10cSrcweir void ImplImageBmp::ReplaceColors( const Color* pSrcColors, const Color* pDstColors, sal_uLong nColorCount )
339cdf0e10cSrcweir {
340cdf0e10cSrcweir 	maBmpEx.Replace( pSrcColors, pDstColors, nColorCount );
341cdf0e10cSrcweir 	delete mpDisplayBmp;
342cdf0e10cSrcweir 	mpDisplayBmp = NULL;
343cdf0e10cSrcweir }
344cdf0e10cSrcweir 
345cdf0e10cSrcweir // -----------------------------------------------------------------------
346cdf0e10cSrcweir 
ColorTransform(BmpColorMode eColorMode)347cdf0e10cSrcweir void ImplImageBmp::ColorTransform( BmpColorMode eColorMode )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir 	maBmpEx = maBmpEx.GetColorTransformedBitmapEx( eColorMode );
350cdf0e10cSrcweir 	delete mpDisplayBmp;
351cdf0e10cSrcweir 	mpDisplayBmp = NULL;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir 
354cdf0e10cSrcweir // -----------------------------------------------------------------------
355cdf0e10cSrcweir 
GetBitmapEx(sal_uInt16 nPosCount,sal_uInt16 * pPosAry) const356cdf0e10cSrcweir BitmapEx ImplImageBmp::GetBitmapEx( sal_uInt16 nPosCount, sal_uInt16* pPosAry ) const
357cdf0e10cSrcweir {
358cdf0e10cSrcweir 	const Bitmap	aNewBmp( Size( nPosCount * maSize.Width(), maSize.Height() ),  maBmpEx.GetBitmap().GetBitCount() );
359cdf0e10cSrcweir 	BitmapEx 		aRet;
360cdf0e10cSrcweir     if( maBmpEx.IsAlpha() )
361cdf0e10cSrcweir     {
362cdf0e10cSrcweir         // initialize target bitmap with an empty alpha mask
363cdf0e10cSrcweir         // which allows for using an optimized copypixel later on (see AlphaMask::CopyPixel)
364cdf0e10cSrcweir         // that avoids palette lookups
365cdf0e10cSrcweir         AlphaMask aAlpha( Size( nPosCount * maSize.Width(), maSize.Height() ) );
366cdf0e10cSrcweir         aRet = BitmapEx( aNewBmp, aAlpha );
367cdf0e10cSrcweir     }
368cdf0e10cSrcweir     else
369cdf0e10cSrcweir         aRet  = BitmapEx( aNewBmp );
370cdf0e10cSrcweir 
371cdf0e10cSrcweir 	for( sal_uInt16 i = 0; i < nPosCount; i++ )
372cdf0e10cSrcweir 	{
373cdf0e10cSrcweir         const Point     aSrcPos( pPosAry[ i ] * maSize.Width(), 0L );
374cdf0e10cSrcweir 		const Point		aPos( i * maSize.Width(), 0L );
375cdf0e10cSrcweir 		const Rectangle aSrcRect( aSrcPos, maSize );
376cdf0e10cSrcweir 		const Rectangle aDstRect( aPos, maSize );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 		aRet.CopyPixel( aDstRect, aSrcRect, &maBmpEx );
379cdf0e10cSrcweir 	}
380cdf0e10cSrcweir 
381cdf0e10cSrcweir 	return aRet;
382cdf0e10cSrcweir }
383cdf0e10cSrcweir 
384cdf0e10cSrcweir // -----------------------------------------------------------------------
385cdf0e10cSrcweir 
Draw(sal_uInt16 nPos,OutputDevice * pOutDev,const Point & rPos,sal_uInt16 nStyle,const Size * pSize)386cdf0e10cSrcweir void ImplImageBmp::Draw( sal_uInt16 nPos, OutputDevice* pOutDev,
387cdf0e10cSrcweir 						 const Point& rPos, sal_uInt16 nStyle,
388cdf0e10cSrcweir 						 const Size* pSize )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	if( pOutDev->IsDeviceOutputNecessary() )
391cdf0e10cSrcweir 	{
392cdf0e10cSrcweir         const Point aSrcPos( nPos * maSize.Width(), 0 );
393cdf0e10cSrcweir 		Size 		aOutSize;
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 		aOutSize = ( pSize ? *pSize : pOutDev->PixelToLogic( maSize ) );
396cdf0e10cSrcweir 
397cdf0e10cSrcweir 		if( nStyle & IMAGE_DRAW_DISABLE )
398cdf0e10cSrcweir 		{
399cdf0e10cSrcweir             ImplUpdateDisabledBmpEx( nPos);
400cdf0e10cSrcweir             pOutDev->DrawBitmapEx( rPos, aOutSize, aSrcPos, maSize, maDisabledBmpEx );
401cdf0e10cSrcweir 		}
402cdf0e10cSrcweir 		else
403cdf0e10cSrcweir 		{
404cdf0e10cSrcweir 			if( nStyle & ( IMAGE_DRAW_COLORTRANSFORM |
405cdf0e10cSrcweir 						   IMAGE_DRAW_MONOCHROME_BLACK | IMAGE_DRAW_MONOCHROME_WHITE |
406cdf0e10cSrcweir 						   IMAGE_DRAW_HIGHLIGHT | IMAGE_DRAW_DEACTIVE | IMAGE_DRAW_SEMITRANSPARENT ) )
407cdf0e10cSrcweir 			{
408cdf0e10cSrcweir 				BitmapEx        aTmpBmpEx;
409cdf0e10cSrcweir 				const Rectangle aCropRect( aSrcPos, maSize );
410cdf0e10cSrcweir 
411cdf0e10cSrcweir 				if( mpInfoAry[ nPos ] & ( IMPSYSIMAGEITEM_MASK | IMPSYSIMAGEITEM_ALPHA ) )
412cdf0e10cSrcweir 					aTmpBmpEx = maBmpEx;
413cdf0e10cSrcweir 				else
414cdf0e10cSrcweir 					aTmpBmpEx = maBmpEx.GetBitmap();
415cdf0e10cSrcweir 
416cdf0e10cSrcweir 				aTmpBmpEx.Crop( aCropRect );
417cdf0e10cSrcweir 
418cdf0e10cSrcweir 				if( nStyle & ( IMAGE_DRAW_COLORTRANSFORM | IMAGE_DRAW_MONOCHROME_BLACK | IMAGE_DRAW_MONOCHROME_WHITE ) )
419cdf0e10cSrcweir 				{
420cdf0e10cSrcweir 					const BmpColorMode eMode = ( nStyle & IMAGE_DRAW_COLORTRANSFORM ) ? BMP_COLOR_HIGHCONTRAST :
421cdf0e10cSrcweir 										 	   ( ( nStyle & IMAGE_DRAW_MONOCHROME_BLACK ) ? BMP_COLOR_MONOCHROME_BLACK : BMP_COLOR_MONOCHROME_WHITE );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir 					aTmpBmpEx = aTmpBmpEx.GetColorTransformedBitmapEx( eMode );
424cdf0e10cSrcweir 				}
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 				Bitmap aTmpBmp( aTmpBmpEx.GetBitmap() );
427cdf0e10cSrcweir 
428cdf0e10cSrcweir 				if( nStyle & ( IMAGE_DRAW_HIGHLIGHT | IMAGE_DRAW_DEACTIVE ) )
429cdf0e10cSrcweir 				{
430cdf0e10cSrcweir 					BitmapWriteAccess* pAcc = aTmpBmp.AcquireWriteAccess();
431cdf0e10cSrcweir 
432cdf0e10cSrcweir 					if( pAcc )
433cdf0e10cSrcweir 					{
434cdf0e10cSrcweir 						const StyleSettings&	rSettings = pOutDev->GetSettings().GetStyleSettings();
435cdf0e10cSrcweir 						Color					aColor;
436cdf0e10cSrcweir 						BitmapColor				aCol;
437cdf0e10cSrcweir 						const long				nW = pAcc->Width();
438cdf0e10cSrcweir 						const long				nH = pAcc->Height();
439cdf0e10cSrcweir 						sal_uInt8*					pMapR = new sal_uInt8[ 256 ];
440cdf0e10cSrcweir 						sal_uInt8*					pMapG = new sal_uInt8[ 256 ];
441cdf0e10cSrcweir 						sal_uInt8*					pMapB = new sal_uInt8[ 256 ];
442cdf0e10cSrcweir 						long					nX, nY;
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 						if( nStyle & IMAGE_DRAW_HIGHLIGHT )
445cdf0e10cSrcweir 							aColor = rSettings.GetHighlightColor();
446cdf0e10cSrcweir 						else
447cdf0e10cSrcweir 							aColor = rSettings.GetDeactiveColor();
448cdf0e10cSrcweir 
449cdf0e10cSrcweir 						const sal_uInt8 cR = aColor.GetRed();
450cdf0e10cSrcweir 						const sal_uInt8 cG = aColor.GetGreen();
451cdf0e10cSrcweir 						const sal_uInt8 cB = aColor.GetBlue();
452cdf0e10cSrcweir 
453cdf0e10cSrcweir 						for( nX = 0L; nX < 256L; nX++ )
454cdf0e10cSrcweir 						{
455cdf0e10cSrcweir 							pMapR[ nX ] = (sal_uInt8) ( ( ( nY = ( nX + cR ) >> 1 ) > 255 ) ? 255 : nY );
456cdf0e10cSrcweir 							pMapG[ nX ] = (sal_uInt8) ( ( ( nY = ( nX + cG ) >> 1 ) > 255 ) ? 255 : nY );
457cdf0e10cSrcweir 							pMapB[ nX ] = (sal_uInt8) ( ( ( nY = ( nX + cB ) >> 1 ) > 255 ) ? 255 : nY );
458cdf0e10cSrcweir 						}
459cdf0e10cSrcweir 
460cdf0e10cSrcweir 						if( pAcc->HasPalette() )
461cdf0e10cSrcweir 						{
462cdf0e10cSrcweir 							for( sal_uInt16 i = 0, nCount = pAcc->GetPaletteEntryCount(); i < nCount; i++ )
463cdf0e10cSrcweir 							{
464cdf0e10cSrcweir 								const BitmapColor& rCol = pAcc->GetPaletteColor( i );
465cdf0e10cSrcweir 								aCol.SetRed( pMapR[ rCol.GetRed() ] );
466cdf0e10cSrcweir 								aCol.SetGreen( pMapG[ rCol.GetGreen() ] );
467cdf0e10cSrcweir 								aCol.SetBlue( pMapB[ rCol.GetBlue() ] );
468cdf0e10cSrcweir 								pAcc->SetPaletteColor( i, aCol );
469cdf0e10cSrcweir 							}
470cdf0e10cSrcweir 						}
471cdf0e10cSrcweir 						else if( pAcc->GetScanlineFormat() == BMP_FORMAT_24BIT_TC_BGR )
472cdf0e10cSrcweir 						{
473cdf0e10cSrcweir 							for( nY = 0L; nY < nH; nY++ )
474cdf0e10cSrcweir 							{
475cdf0e10cSrcweir 								Scanline pScan = pAcc->GetScanline( nY );
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 								for( nX = 0L; nX < nW; nX++ )
478cdf0e10cSrcweir 								{
479cdf0e10cSrcweir 									*pScan = pMapB[ *pScan ]; pScan++;
480cdf0e10cSrcweir 									*pScan = pMapG[ *pScan ]; pScan++;
481cdf0e10cSrcweir 									*pScan = pMapR[ *pScan ]; pScan++;
482cdf0e10cSrcweir 								}
483cdf0e10cSrcweir 							}
484cdf0e10cSrcweir 						}
485cdf0e10cSrcweir 						else
486cdf0e10cSrcweir 						{
487cdf0e10cSrcweir 							for( nY = 0L; nY < nH; nY++ )
488cdf0e10cSrcweir 							{
489cdf0e10cSrcweir 								for( nX = 0L; nX < nW; nX++ )
490cdf0e10cSrcweir 								{
491cdf0e10cSrcweir 									aCol = pAcc->GetPixel( nY, nX );
492cdf0e10cSrcweir 									aCol.SetRed( pMapR[ aCol.GetRed() ] );
493cdf0e10cSrcweir 									aCol.SetGreen( pMapG[ aCol.GetGreen() ] );
494cdf0e10cSrcweir 									aCol.SetBlue( pMapB[ aCol.GetBlue() ] );
495cdf0e10cSrcweir 									pAcc->SetPixel( nY, nX, aCol );
496cdf0e10cSrcweir 								}
497cdf0e10cSrcweir 							}
498cdf0e10cSrcweir 						}
499cdf0e10cSrcweir 
500cdf0e10cSrcweir 						delete[] pMapR;
501cdf0e10cSrcweir 						delete[] pMapG;
502cdf0e10cSrcweir 						delete[] pMapB;
503cdf0e10cSrcweir 						aTmpBmp.ReleaseAccess( pAcc );
504cdf0e10cSrcweir 					}
505cdf0e10cSrcweir 				}
506cdf0e10cSrcweir 
507cdf0e10cSrcweir 				if( nStyle & IMAGE_DRAW_SEMITRANSPARENT )
508cdf0e10cSrcweir 				{
509cdf0e10cSrcweir 					if( aTmpBmpEx.IsTransparent()  )
510cdf0e10cSrcweir 					{
511cdf0e10cSrcweir 						Bitmap aAlphaBmp( aTmpBmpEx.GetAlpha().GetBitmap() );
512cdf0e10cSrcweir 
513cdf0e10cSrcweir 						aAlphaBmp.Adjust( 50 );
514cdf0e10cSrcweir 						aTmpBmpEx = BitmapEx( aTmpBmp, AlphaMask( aAlphaBmp ) );
515cdf0e10cSrcweir 					}
516cdf0e10cSrcweir 					else
517cdf0e10cSrcweir 					{
518cdf0e10cSrcweir 						sal_uInt8 cErase = 128;
519cdf0e10cSrcweir 						aTmpBmpEx = BitmapEx( aTmpBmp, AlphaMask( aTmpBmp.GetSizePixel(),  &cErase ) );
520cdf0e10cSrcweir 					}
521cdf0e10cSrcweir 				}
522cdf0e10cSrcweir 				else
523cdf0e10cSrcweir 				{
524cdf0e10cSrcweir 					if( aTmpBmpEx.IsAlpha() )
525cdf0e10cSrcweir 						aTmpBmpEx = BitmapEx( aTmpBmp, aTmpBmpEx.GetAlpha() );
526cdf0e10cSrcweir 					else if( aTmpBmpEx.IsAlpha() )
527cdf0e10cSrcweir 						aTmpBmpEx = BitmapEx( aTmpBmp, aTmpBmpEx.GetMask() );
528cdf0e10cSrcweir 				}
529cdf0e10cSrcweir 
530cdf0e10cSrcweir 				pOutDev->DrawBitmapEx( rPos, aOutSize, aTmpBmpEx );
531cdf0e10cSrcweir 			}
532cdf0e10cSrcweir 			else
533cdf0e10cSrcweir 			{
534cdf0e10cSrcweir 				const BitmapEx* pOutputBmp;
535cdf0e10cSrcweir 
536cdf0e10cSrcweir 				if( pOutDev->GetOutDevType() == OUTDEV_WINDOW )
537cdf0e10cSrcweir 				{
538cdf0e10cSrcweir 					ImplUpdateDisplayBmp( pOutDev );
539cdf0e10cSrcweir 					pOutputBmp = mpDisplayBmp;
540cdf0e10cSrcweir 				}
541cdf0e10cSrcweir 				else
542cdf0e10cSrcweir 					pOutputBmp = &maBmpEx;
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 				if( pOutputBmp )
545cdf0e10cSrcweir 					pOutDev->DrawBitmapEx( rPos, aOutSize, aSrcPos, maSize, *pOutputBmp );
546cdf0e10cSrcweir 			}
547cdf0e10cSrcweir 		}
548cdf0e10cSrcweir 	}
549cdf0e10cSrcweir }
550cdf0e10cSrcweir 
551cdf0e10cSrcweir // -----------------------------------------------------------------------
552cdf0e10cSrcweir 
ImplUpdateDisplayBmp(OutputDevice * pOutDev)553cdf0e10cSrcweir void ImplImageBmp::ImplUpdateDisplayBmp( OutputDevice*
554cdf0e10cSrcweir #if defined WNT
555cdf0e10cSrcweir pOutDev
556cdf0e10cSrcweir #endif
557cdf0e10cSrcweir )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir 	if( !mpDisplayBmp && !maBmpEx.IsEmpty() )
560cdf0e10cSrcweir 	{
561cdf0e10cSrcweir #if defined WNT
562cdf0e10cSrcweir 		if( maBmpEx.IsAlpha() )
563cdf0e10cSrcweir 			mpDisplayBmp = new BitmapEx( maBmpEx );
564cdf0e10cSrcweir 		else
565cdf0e10cSrcweir 		{
566cdf0e10cSrcweir 			const Bitmap aBmp( maBmpEx.GetBitmap().CreateDisplayBitmap( pOutDev ) );
567cdf0e10cSrcweir 
568cdf0e10cSrcweir 			if( maBmpEx.IsTransparent() )
569cdf0e10cSrcweir 				mpDisplayBmp = new BitmapEx( aBmp, maBmpEx.GetMask().CreateDisplayBitmap( pOutDev ) );
570cdf0e10cSrcweir 			else
571cdf0e10cSrcweir 				mpDisplayBmp = new BitmapEx( aBmp );
572cdf0e10cSrcweir 		}
573cdf0e10cSrcweir #else
574cdf0e10cSrcweir 		mpDisplayBmp = new BitmapEx( maBmpEx );
575cdf0e10cSrcweir #endif
576cdf0e10cSrcweir 	}
577cdf0e10cSrcweir }
578cdf0e10cSrcweir 
579cdf0e10cSrcweir // -----------------------------------------------------------------------
580cdf0e10cSrcweir 
ImplUpdateDisabledBmpEx(int nPos)581cdf0e10cSrcweir void ImplImageBmp::ImplUpdateDisabledBmpEx( int nPos )
582cdf0e10cSrcweir {
583cdf0e10cSrcweir     const Size aTotalSize( maBmpEx.GetSizePixel() );
584cdf0e10cSrcweir 
585cdf0e10cSrcweir     if( maDisabledBmpEx.IsEmpty() )
586cdf0e10cSrcweir     {
587cdf0e10cSrcweir         Bitmap      aGrey( aTotalSize, 8, &Bitmap::GetGreyPalette( 256 ) );
588cdf0e10cSrcweir         AlphaMask   aGreyAlphaMask( aTotalSize );
589cdf0e10cSrcweir 
590cdf0e10cSrcweir         maDisabledBmpEx = BitmapEx( aGrey, aGreyAlphaMask );
591cdf0e10cSrcweir         nPos = -1;
592cdf0e10cSrcweir     }
593cdf0e10cSrcweir 
594cdf0e10cSrcweir     Bitmap              aBmp( maBmpEx.GetBitmap() );
595cdf0e10cSrcweir     BitmapReadAccess*   pBmp( aBmp.AcquireReadAccess() );
596cdf0e10cSrcweir     AlphaMask           aBmpAlphaMask( maBmpEx.GetAlpha() );
597cdf0e10cSrcweir     BitmapReadAccess*   pBmpAlphaMask( aBmpAlphaMask.AcquireReadAccess() );
598cdf0e10cSrcweir     Bitmap              aGrey( maDisabledBmpEx.GetBitmap() );
599cdf0e10cSrcweir     BitmapWriteAccess*  pGrey( aGrey.AcquireWriteAccess() );
600cdf0e10cSrcweir     AlphaMask           aGreyAlphaMask( maDisabledBmpEx.GetAlpha() );
601cdf0e10cSrcweir     BitmapWriteAccess*  pGreyAlphaMask( aGreyAlphaMask.AcquireWriteAccess() );
602cdf0e10cSrcweir 
603cdf0e10cSrcweir     if( pBmp && pBmpAlphaMask && pGrey && pGreyAlphaMask )
604cdf0e10cSrcweir     {
605cdf0e10cSrcweir         BitmapColor	aGreyVal( 0 );
606cdf0e10cSrcweir         BitmapColor aGreyAlphaMaskVal( 0 );
607cdf0e10cSrcweir         const Point aPos( ( nPos < 0 ) ? 0 : ( nPos * maSize.Width() ), 0 );
608cdf0e10cSrcweir         const int  nLeft = aPos.X(), nRight = nLeft + ( ( nPos < 0 ) ? aTotalSize.Width() : maSize.Width() );
609cdf0e10cSrcweir         const int  nTop = aPos.Y(), nBottom = nTop + maSize.Height();
610cdf0e10cSrcweir 
611cdf0e10cSrcweir         for( int nY = nTop; nY < nBottom; ++nY )
612cdf0e10cSrcweir         {
613cdf0e10cSrcweir             for( int nX = nLeft; nX < nRight; ++nX )
614cdf0e10cSrcweir             {
615cdf0e10cSrcweir                 aGreyVal.SetIndex( pBmp->GetLuminance( nY, nX ) );
616cdf0e10cSrcweir                 pGrey->SetPixel( nY, nX, aGreyVal );
617cdf0e10cSrcweir 
618cdf0e10cSrcweir                 const BitmapColor aBmpAlphaMaskVal( pBmpAlphaMask->GetPixel( nY, nX ) );
619cdf0e10cSrcweir 
620cdf0e10cSrcweir                 aGreyAlphaMaskVal.SetIndex( static_cast< sal_uInt8 >( ::std::min( aBmpAlphaMaskVal.GetIndex() + 178ul, 255ul ) ) );
621cdf0e10cSrcweir                 pGreyAlphaMask->SetPixel( nY, nX, aGreyAlphaMaskVal );
622cdf0e10cSrcweir             }
623cdf0e10cSrcweir         }
624cdf0e10cSrcweir     }
625cdf0e10cSrcweir 
626cdf0e10cSrcweir     aBmp.ReleaseAccess( pBmp );
627cdf0e10cSrcweir     aBmpAlphaMask.ReleaseAccess( pBmpAlphaMask );
628cdf0e10cSrcweir     aGrey.ReleaseAccess( pGrey );
629cdf0e10cSrcweir     aGreyAlphaMask.ReleaseAccess( pGreyAlphaMask );
630cdf0e10cSrcweir 
631cdf0e10cSrcweir     maDisabledBmpEx = BitmapEx( aGrey, aGreyAlphaMask );
632cdf0e10cSrcweir }
633