xref: /aoo4110/main/vcl/source/gdi/alpha.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
27*b1cdbd2cSJim Jagielski #include <vcl/bmpacc.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/color.hxx>
29*b1cdbd2cSJim Jagielski #include <vcl/alpha.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski // -------------
32*b1cdbd2cSJim Jagielski // - AlphaMask -
33*b1cdbd2cSJim Jagielski // -------------
34*b1cdbd2cSJim Jagielski 
AlphaMask()35*b1cdbd2cSJim Jagielski AlphaMask::AlphaMask()
36*b1cdbd2cSJim Jagielski {
37*b1cdbd2cSJim Jagielski }
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
40*b1cdbd2cSJim Jagielski 
AlphaMask(const Bitmap & rBitmap)41*b1cdbd2cSJim Jagielski AlphaMask::AlphaMask( const Bitmap& rBitmap ) :
42*b1cdbd2cSJim Jagielski 	Bitmap( rBitmap )
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski 	if( !!rBitmap )
45*b1cdbd2cSJim Jagielski 		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
49*b1cdbd2cSJim Jagielski 
AlphaMask(const AlphaMask & rAlphaMask)50*b1cdbd2cSJim Jagielski AlphaMask::AlphaMask( const AlphaMask& rAlphaMask ) :
51*b1cdbd2cSJim Jagielski 	Bitmap( rAlphaMask )
52*b1cdbd2cSJim Jagielski {
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
56*b1cdbd2cSJim Jagielski 
AlphaMask(const Size & rSizePixel,sal_uInt8 * pEraseTransparency)57*b1cdbd2cSJim Jagielski AlphaMask::AlphaMask( const Size& rSizePixel, sal_uInt8* pEraseTransparency ) :
58*b1cdbd2cSJim Jagielski 	Bitmap( rSizePixel, 8, &Bitmap::GetGreyPalette( 256 ) )
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski 	if( pEraseTransparency )
61*b1cdbd2cSJim Jagielski 		Bitmap::Erase( Color( *pEraseTransparency, *pEraseTransparency, *pEraseTransparency ) );
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
65*b1cdbd2cSJim Jagielski 
~AlphaMask()66*b1cdbd2cSJim Jagielski AlphaMask::~AlphaMask()
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
71*b1cdbd2cSJim Jagielski 
operator =(const Bitmap & rBitmap)72*b1cdbd2cSJim Jagielski AlphaMask& AlphaMask::operator=( const Bitmap& rBitmap )
73*b1cdbd2cSJim Jagielski {
74*b1cdbd2cSJim Jagielski 	*(Bitmap*) this = rBitmap;
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 	if( !!rBitmap )
77*b1cdbd2cSJim Jagielski 		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski 	return *this;
80*b1cdbd2cSJim Jagielski }
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
83*b1cdbd2cSJim Jagielski 
ImplGetBitmap() const84*b1cdbd2cSJim Jagielski const Bitmap& AlphaMask::ImplGetBitmap() const
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski 	return( (const Bitmap&) *this );
87*b1cdbd2cSJim Jagielski }
88*b1cdbd2cSJim Jagielski 
89*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
90*b1cdbd2cSJim Jagielski 
ImplSetBitmap(const Bitmap & rBitmap)91*b1cdbd2cSJim Jagielski void AlphaMask::ImplSetBitmap( const Bitmap& rBitmap )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski     DBG_ASSERT( ( 8 == rBitmap.GetBitCount() ) && rBitmap.HasGreyPalette(), "AlphaMask::ImplSetBitmap: invalid bitmap" );
94*b1cdbd2cSJim Jagielski 	*(Bitmap*) this = rBitmap;
95*b1cdbd2cSJim Jagielski }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
98*b1cdbd2cSJim Jagielski 
GetBitmap() const99*b1cdbd2cSJim Jagielski Bitmap AlphaMask::GetBitmap() const
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski 	return ImplGetBitmap();
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
105*b1cdbd2cSJim Jagielski 
Crop(const Rectangle & rRectPixel)106*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Crop( const Rectangle& rRectPixel )
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski 	return Bitmap::Crop( rRectPixel );
109*b1cdbd2cSJim Jagielski }
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
112*b1cdbd2cSJim Jagielski 
Expand(sal_uLong nDX,sal_uLong nDY,sal_uInt8 * pInitTransparency)113*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Expand( sal_uLong nDX, sal_uLong nDY, sal_uInt8* pInitTransparency )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski 	Color aColor;
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	if( pInitTransparency )
118*b1cdbd2cSJim Jagielski 		aColor = Color( *pInitTransparency, *pInitTransparency, *pInitTransparency );
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski 	return Bitmap::Expand( nDX, nDY, pInitTransparency ? &aColor : NULL );
121*b1cdbd2cSJim Jagielski }
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
124*b1cdbd2cSJim Jagielski 
CopyPixel(const Rectangle & rRectDst,const Rectangle & rRectSrc,const AlphaMask * pAlphaSrc)125*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::CopyPixel( const Rectangle& rRectDst, const Rectangle& rRectSrc,
126*b1cdbd2cSJim Jagielski 						   const AlphaMask* pAlphaSrc )
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski     // Note: this code is copied from Bitmap::CopyPixel but avoids any palette lookups
129*b1cdbd2cSJim Jagielski     // this optimization is possible because the palettes of AlphaMasks are always identical (8bit GreyPalette, see ctor)
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 	const Size	aSizePix( GetSizePixel() );
132*b1cdbd2cSJim Jagielski 	Rectangle	aRectDst( rRectDst );
133*b1cdbd2cSJim Jagielski 	sal_Bool		bRet = sal_False;
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 	aRectDst.Intersection( Rectangle( Point(), aSizePix ) );
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski 	if( !aRectDst.IsEmpty() )
138*b1cdbd2cSJim Jagielski 	{
139*b1cdbd2cSJim Jagielski 		if( pAlphaSrc && ( *pAlphaSrc != *this ) )
140*b1cdbd2cSJim Jagielski 		{
141*b1cdbd2cSJim Jagielski 			Bitmap* 		pSrc = (Bitmap*) pAlphaSrc;
142*b1cdbd2cSJim Jagielski 			const Size		aCopySizePix( pSrc->GetSizePixel() );
143*b1cdbd2cSJim Jagielski 			Rectangle		aRectSrc( rRectSrc );
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 			aRectSrc.Intersection( Rectangle( Point(), aCopySizePix ) );
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 			if( !aRectSrc.IsEmpty() )
148*b1cdbd2cSJim Jagielski 			{
149*b1cdbd2cSJim Jagielski 				BitmapReadAccess* pReadAcc = pSrc->AcquireReadAccess();
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 				if( pReadAcc )
152*b1cdbd2cSJim Jagielski 				{
153*b1cdbd2cSJim Jagielski 					BitmapWriteAccess* pWriteAcc = AcquireWriteAccess();
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 					if( pWriteAcc )
156*b1cdbd2cSJim Jagielski 					{
157*b1cdbd2cSJim Jagielski 						const long	nWidth = Min( aRectSrc.GetWidth(), aRectDst.GetWidth() );
158*b1cdbd2cSJim Jagielski 						const long	nHeight = Min( aRectSrc.GetHeight(), aRectDst.GetHeight() );
159*b1cdbd2cSJim Jagielski 						const long	nSrcEndX = aRectSrc.Left() + nWidth;
160*b1cdbd2cSJim Jagielski 						const long	nSrcEndY = aRectSrc.Top() + nHeight;
161*b1cdbd2cSJim Jagielski 						long		nDstY = aRectDst.Top();
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 						for( long nSrcY = aRectSrc.Top(); nSrcY < nSrcEndY; nSrcY++, nDstY++ )
164*b1cdbd2cSJim Jagielski 							for( long nSrcX = aRectSrc.Left(), nDstX = aRectDst.Left(); nSrcX < nSrcEndX; nSrcX++, nDstX++ )
165*b1cdbd2cSJim Jagielski 								pWriteAcc->SetPixel( nDstY, nDstX, pReadAcc->GetPixel( nSrcY, nSrcX ) );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 						ReleaseAccess( pWriteAcc );
168*b1cdbd2cSJim Jagielski 						bRet = ( nWidth > 0L ) && ( nHeight > 0L );
169*b1cdbd2cSJim Jagielski 					}
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski 					pSrc->ReleaseAccess( pReadAcc );
172*b1cdbd2cSJim Jagielski 				}
173*b1cdbd2cSJim Jagielski 			}
174*b1cdbd2cSJim Jagielski 		}
175*b1cdbd2cSJim Jagielski 		else
176*b1cdbd2cSJim Jagielski 		{
177*b1cdbd2cSJim Jagielski 			Rectangle aRectSrc( rRectSrc );
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 			aRectSrc.Intersection( Rectangle( Point(), aSizePix ) );
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski 			if( !aRectSrc.IsEmpty() && ( aRectSrc != aRectDst ) )
182*b1cdbd2cSJim Jagielski 			{
183*b1cdbd2cSJim Jagielski 				BitmapWriteAccess*	pWriteAcc = AcquireWriteAccess();
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 				if( pWriteAcc )
186*b1cdbd2cSJim Jagielski 				{
187*b1cdbd2cSJim Jagielski 					const long	nWidth = Min( aRectSrc.GetWidth(), aRectDst.GetWidth() );
188*b1cdbd2cSJim Jagielski 					const long	nHeight = Min( aRectSrc.GetHeight(), aRectDst.GetHeight() );
189*b1cdbd2cSJim Jagielski 					const long	nSrcX = aRectSrc.Left();
190*b1cdbd2cSJim Jagielski 					const long	nSrcY = aRectSrc.Top();
191*b1cdbd2cSJim Jagielski 					const long	nSrcEndX1 = nSrcX + nWidth - 1L;
192*b1cdbd2cSJim Jagielski 					const long	nSrcEndY1 = nSrcY + nHeight - 1L;
193*b1cdbd2cSJim Jagielski 					const long	nDstX = aRectDst.Left();
194*b1cdbd2cSJim Jagielski 					const long	nDstY = aRectDst.Top();
195*b1cdbd2cSJim Jagielski 					const long	nDstEndX1 = nDstX + nWidth - 1L;
196*b1cdbd2cSJim Jagielski 					const long	nDstEndY1 = nDstY + nHeight - 1L;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 					if( ( nDstX <= nSrcX ) && ( nDstY <= nSrcY ) )
199*b1cdbd2cSJim Jagielski 					{
200*b1cdbd2cSJim Jagielski 						for( long nY = nSrcY, nYN = nDstY; nY <= nSrcEndY1; nY++, nYN++ )
201*b1cdbd2cSJim Jagielski 							for( long nX = nSrcX, nXN = nDstX; nX <= nSrcEndX1; nX++, nXN++ )
202*b1cdbd2cSJim Jagielski 								pWriteAcc->SetPixel( nYN, nXN, pWriteAcc->GetPixel( nY, nX ) );
203*b1cdbd2cSJim Jagielski 					}
204*b1cdbd2cSJim Jagielski 					else if( ( nDstX <= nSrcX ) && ( nDstY >= nSrcY ) )
205*b1cdbd2cSJim Jagielski 					{
206*b1cdbd2cSJim Jagielski 						for( long nY = nSrcEndY1, nYN = nDstEndY1; nY >= nSrcY; nY--, nYN-- )
207*b1cdbd2cSJim Jagielski 							for( long nX = nSrcX, nXN = nDstX; nX <= nSrcEndX1; nX++, nXN++ )
208*b1cdbd2cSJim Jagielski 								pWriteAcc->SetPixel( nYN, nXN, pWriteAcc->GetPixel( nY, nX ) );
209*b1cdbd2cSJim Jagielski 					}
210*b1cdbd2cSJim Jagielski 					else if( ( nDstX >= nSrcX ) && ( nDstY <= nSrcY ) )
211*b1cdbd2cSJim Jagielski 					{
212*b1cdbd2cSJim Jagielski 						for( long nY = nSrcY, nYN = nDstY; nY <= nSrcEndY1; nY++, nYN++ )
213*b1cdbd2cSJim Jagielski 							for( long nX = nSrcEndX1, nXN = nDstEndX1; nX >= nSrcX; nX--, nXN-- )
214*b1cdbd2cSJim Jagielski 								pWriteAcc->SetPixel( nYN, nXN, pWriteAcc->GetPixel( nY, nX ) );
215*b1cdbd2cSJim Jagielski 					}
216*b1cdbd2cSJim Jagielski 					else
217*b1cdbd2cSJim Jagielski 					{
218*b1cdbd2cSJim Jagielski 						for( long nY = nSrcEndY1, nYN = nDstEndY1; nY >= nSrcY; nY--, nYN-- )
219*b1cdbd2cSJim Jagielski 							for( long nX = nSrcEndX1, nXN = nDstEndX1; nX >= nSrcX; nX--, nXN-- )
220*b1cdbd2cSJim Jagielski 								pWriteAcc->SetPixel( nYN, nXN, pWriteAcc->GetPixel( nY, nX ) );
221*b1cdbd2cSJim Jagielski 					}
222*b1cdbd2cSJim Jagielski 
223*b1cdbd2cSJim Jagielski 					ReleaseAccess( pWriteAcc );
224*b1cdbd2cSJim Jagielski 					bRet = sal_True;
225*b1cdbd2cSJim Jagielski 				}
226*b1cdbd2cSJim Jagielski 			}
227*b1cdbd2cSJim Jagielski 		}
228*b1cdbd2cSJim Jagielski 	}
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski 	return bRet;
231*b1cdbd2cSJim Jagielski 
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
235*b1cdbd2cSJim Jagielski 
Erase(sal_uInt8 cTransparency)236*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Erase( sal_uInt8 cTransparency )
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski 	return Bitmap::Erase( Color( cTransparency, cTransparency, cTransparency ) );
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
242*b1cdbd2cSJim Jagielski 
Invert()243*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Invert()
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski 	BitmapWriteAccess*	pAcc = AcquireWriteAccess();
246*b1cdbd2cSJim Jagielski 	sal_Bool				bRet = sal_False;
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 	if( pAcc && pAcc->GetBitCount() == 8 )
249*b1cdbd2cSJim Jagielski 	{
250*b1cdbd2cSJim Jagielski 		BitmapColor	aCol( 0 );
251*b1cdbd2cSJim Jagielski 		const long	nWidth = pAcc->Width(),	nHeight = pAcc->Height();
252*b1cdbd2cSJim Jagielski 		sal_uInt8*		pMap = new sal_uInt8[ 256 ];
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 		for( long i = 0; i < 256; i++ )
255*b1cdbd2cSJim Jagielski 			pMap[ i ] = ~(sal_uInt8) i;
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 		for( long nY = 0L; nY < nHeight; nY++ )
258*b1cdbd2cSJim Jagielski 		{
259*b1cdbd2cSJim Jagielski 			for( long nX = 0L; nX < nWidth; nX++ )
260*b1cdbd2cSJim Jagielski 			{
261*b1cdbd2cSJim Jagielski 				aCol.SetIndex( pMap[ pAcc->GetPixel( nY, nX ).GetIndex() ] );
262*b1cdbd2cSJim Jagielski 				pAcc->SetPixel( nY, nX, aCol );
263*b1cdbd2cSJim Jagielski 			}
264*b1cdbd2cSJim Jagielski 		}
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 		delete[] pMap;
267*b1cdbd2cSJim Jagielski 		bRet = sal_True;
268*b1cdbd2cSJim Jagielski 	}
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 	if( pAcc )
271*b1cdbd2cSJim Jagielski 		ReleaseAccess( pAcc );
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski 	return bRet;
274*b1cdbd2cSJim Jagielski }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
277*b1cdbd2cSJim Jagielski 
Mirror(sal_uLong nMirrorFlags)278*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Mirror( sal_uLong nMirrorFlags )
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski 	return Bitmap::Mirror( nMirrorFlags );
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
284*b1cdbd2cSJim Jagielski 
Scale(const Size & rNewSize,sal_uInt32 nScaleFlag)285*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Scale( const Size& rNewSize, sal_uInt32 nScaleFlag )
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski 	sal_Bool bRet = Bitmap::Scale( rNewSize, nScaleFlag );
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 	if( bRet && ( nScaleFlag == BMP_SCALE_INTERPOLATE ) )
290*b1cdbd2cSJim Jagielski 		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	return bRet;
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
296*b1cdbd2cSJim Jagielski 
Scale(const double & rScaleX,const double & rScaleY,sal_uInt32 nScaleFlag)297*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Scale( const double& rScaleX, const double& rScaleY, sal_uInt32 nScaleFlag )
298*b1cdbd2cSJim Jagielski {
299*b1cdbd2cSJim Jagielski 	sal_Bool bRet = Bitmap::Scale( rScaleX, rScaleY, nScaleFlag );
300*b1cdbd2cSJim Jagielski 
301*b1cdbd2cSJim Jagielski 	if( bRet && ( nScaleFlag == BMP_SCALE_INTERPOLATE ) )
302*b1cdbd2cSJim Jagielski 		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski 	return bRet;
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
308*b1cdbd2cSJim Jagielski 
Rotate(long nAngle10,sal_uInt8 cFillTransparency)309*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Rotate( long nAngle10, sal_uInt8 cFillTransparency )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski 	return Bitmap::Rotate( nAngle10, Color( cFillTransparency, cFillTransparency, cFillTransparency ) );
312*b1cdbd2cSJim Jagielski }
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
315*b1cdbd2cSJim Jagielski 
Replace(const Bitmap & rMask,sal_uInt8 cReplaceTransparency)316*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Replace( const Bitmap& rMask, sal_uInt8 cReplaceTransparency )
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski 	BitmapReadAccess*	pMaskAcc = ( (Bitmap&) rMask ).AcquireReadAccess();
319*b1cdbd2cSJim Jagielski 	BitmapWriteAccess*	pAcc = AcquireWriteAccess();
320*b1cdbd2cSJim Jagielski 	sal_Bool				bRet = sal_False;
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 	if( pMaskAcc && pAcc )
323*b1cdbd2cSJim Jagielski 	{
324*b1cdbd2cSJim Jagielski 		const BitmapColor	aReplace( cReplaceTransparency );
325*b1cdbd2cSJim Jagielski 		const long			nWidth = Min( pMaskAcc->Width(), pAcc->Width() );
326*b1cdbd2cSJim Jagielski 		const long			nHeight = Min( pMaskAcc->Height(), pAcc->Height() );
327*b1cdbd2cSJim Jagielski 		const BitmapColor	aMaskWhite( pMaskAcc->GetBestMatchingColor( Color( COL_WHITE ) ) );
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 		for( long nY = 0L; nY < nHeight; nY++ )
330*b1cdbd2cSJim Jagielski 			for( long nX = 0L; nX < nWidth; nX++ )
331*b1cdbd2cSJim Jagielski 				if( pMaskAcc->GetPixel( nY, nX ) == aMaskWhite )
332*b1cdbd2cSJim Jagielski 					pAcc->SetPixel( nY, nX, aReplace );
333*b1cdbd2cSJim Jagielski 	}
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	( (Bitmap&) rMask ).ReleaseAccess( pMaskAcc );
336*b1cdbd2cSJim Jagielski 	ReleaseAccess( pAcc );
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 	return bRet;
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
342*b1cdbd2cSJim Jagielski 
Replace(sal_uInt8 cSearchTransparency,sal_uInt8 cReplaceTransparency,sal_uLong nTol)343*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Replace( sal_uInt8 cSearchTransparency, sal_uInt8 cReplaceTransparency, sal_uLong
344*b1cdbd2cSJim Jagielski #ifdef DBG_UTIL
345*b1cdbd2cSJim Jagielski nTol
346*b1cdbd2cSJim Jagielski #endif
347*b1cdbd2cSJim Jagielski )
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	BitmapWriteAccess*	pAcc = AcquireWriteAccess();
350*b1cdbd2cSJim Jagielski 	sal_Bool				bRet = sal_False;
351*b1cdbd2cSJim Jagielski 
352*b1cdbd2cSJim Jagielski 	DBG_ASSERT( !nTol, "AlphaMask::Replace: nTol not used yet" );
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	if( pAcc && pAcc->GetBitCount() == 8 )
355*b1cdbd2cSJim Jagielski 	{
356*b1cdbd2cSJim Jagielski 		const long nWidth = pAcc->Width(), nHeight = pAcc->Height();
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 		if( pAcc->GetScanlineFormat() == BMP_FORMAT_8BIT_PAL )
359*b1cdbd2cSJim Jagielski 		{
360*b1cdbd2cSJim Jagielski 			for( long nY = 0L; nY < nHeight; nY++ )
361*b1cdbd2cSJim Jagielski 			{
362*b1cdbd2cSJim Jagielski 				Scanline pScan = pAcc->GetScanline( nY );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 				for( long nX = 0L; nX < nWidth; nX++, pScan++ )
365*b1cdbd2cSJim Jagielski 				{
366*b1cdbd2cSJim Jagielski 					if( *pScan == cSearchTransparency )
367*b1cdbd2cSJim Jagielski 						*pScan = cReplaceTransparency;
368*b1cdbd2cSJim Jagielski 				}
369*b1cdbd2cSJim Jagielski 			}
370*b1cdbd2cSJim Jagielski 		}
371*b1cdbd2cSJim Jagielski 		else
372*b1cdbd2cSJim Jagielski 		{
373*b1cdbd2cSJim Jagielski 			BitmapColor	aReplace( cReplaceTransparency );
374*b1cdbd2cSJim Jagielski 
375*b1cdbd2cSJim Jagielski 			for( long nY = 0L; nY < nHeight; nY++ )
376*b1cdbd2cSJim Jagielski 			{
377*b1cdbd2cSJim Jagielski 				for( long nX = 0L; nX < nWidth; nX++ )
378*b1cdbd2cSJim Jagielski 				{
379*b1cdbd2cSJim Jagielski 					if( pAcc->GetPixel( nY, nX ).GetIndex() == cSearchTransparency )
380*b1cdbd2cSJim Jagielski 						pAcc->SetPixel( nY, nX, aReplace );
381*b1cdbd2cSJim Jagielski 				}
382*b1cdbd2cSJim Jagielski 			}
383*b1cdbd2cSJim Jagielski 		}
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski 		bRet = sal_True;
386*b1cdbd2cSJim Jagielski 	}
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 	if( pAcc )
389*b1cdbd2cSJim Jagielski 		ReleaseAccess( pAcc );
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 	return bRet;
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
395*b1cdbd2cSJim Jagielski 
Replace(sal_uInt8 * pSearchTransparencies,sal_uInt8 * pReplaceTransparencies,sal_uLong nColorCount,sal_uLong * pTols)396*b1cdbd2cSJim Jagielski sal_Bool AlphaMask::Replace( sal_uInt8* pSearchTransparencies, sal_uInt8* pReplaceTransparencies,
397*b1cdbd2cSJim Jagielski 						 sal_uLong nColorCount, sal_uLong* pTols )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski 	Color*	pSearchColors = new Color[ nColorCount ];
400*b1cdbd2cSJim Jagielski 	Color*	pReplaceColors = new Color[ nColorCount ];
401*b1cdbd2cSJim Jagielski 	sal_Bool	bRet;
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 	for( sal_uLong i = 0; i < nColorCount; i++ )
404*b1cdbd2cSJim Jagielski 	{
405*b1cdbd2cSJim Jagielski 		const sal_uInt8 cSearchTransparency = pSearchTransparencies[ i ];
406*b1cdbd2cSJim Jagielski 		const sal_uInt8 cReplaceTransparency = pReplaceTransparencies[ i ];
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 		pSearchColors[ i ] = Color( cSearchTransparency, cSearchTransparency, cSearchTransparency );
409*b1cdbd2cSJim Jagielski 		pReplaceColors[ i ] = Color( cReplaceTransparency, cReplaceTransparency, cReplaceTransparency );
410*b1cdbd2cSJim Jagielski 	}
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	bRet = Bitmap::Replace( pSearchColors, pReplaceColors, nColorCount, pTols ) &&
413*b1cdbd2cSJim Jagielski 		   Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	delete[] pSearchColors;
416*b1cdbd2cSJim Jagielski 	delete[] pReplaceColors;
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 	return bRet;
419*b1cdbd2cSJim Jagielski }
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
422*b1cdbd2cSJim Jagielski 
ReleaseAccess(BitmapReadAccess * pAccess)423*b1cdbd2cSJim Jagielski void AlphaMask::ReleaseAccess( BitmapReadAccess* pAccess )
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski 	if( pAccess )
426*b1cdbd2cSJim Jagielski 	{
427*b1cdbd2cSJim Jagielski 		Bitmap::ReleaseAccess( pAccess );
428*b1cdbd2cSJim Jagielski 		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
429*b1cdbd2cSJim Jagielski 	}
430*b1cdbd2cSJim Jagielski }
431