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