Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37836509
en ru br
Репозитории ALT
5.1: 3.2.0.7-alt0.M51.1
4.1: 3.0.0.10-alt1.M41.1
4.0: 2.4.1.7-alt0.M40.1
3.0: 1.1.5-alt1
www.altlinux.org/Changes

Группа :: Офис
Пакет: openoffice.org

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: bmp32.diff
Скачать


Index: vcl/source/gdi/impbmp.cxx
===================================================================
RCS file: /cvs/oo/gsl/vcl/source/gdi/impbmp.cxx,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 impbmp.cxx
--- vcl/source/gdi/impbmp.cxx	2000/09/18 17:05:37	1.1.1.1
+++ vcl/source/gdi/impbmp.cxx	2002/11/05 20:13:01
@@ -177,7 +177,7 @@
 #endif
 		nBitCount = mpSalBitmap->GetBitCount();
 
-	return( ( nBitCount <= 1 ) ? 1 : ( nBitCount <= 4 ) ? 4 : ( nBitCount <= 8 ) ? 8 : 24 );
+	return( ( nBitCount <= 1 ) ? 1 : ( nBitCount <= 4 ) ? 4 : ( nBitCount <= 8 ) ? 8 : ( nBitCount <= 24 ) ? 24 : 32 );
 }
 
 // -----------------------------------------------------------------------
Index: vcl/unx/source/gdi/salbmp.cxx
===================================================================
RCS file: /cvs/oo/gsl/vcl/unx/source/gdi/salbmp.cxx,v
retrieving revision 1.8
diff -u -r1.8 salbmp.cxx
--- vcl/unx/source/gdi/salbmp.cxx	2001/09/11 15:52:22	1.8
+++ vcl/unx/source/gdi/salbmp.cxx	2002/11/05 20:13:05
@@ -150,7 +150,7 @@
 
 BitmapBuffer* SalBitmap::ImplCreateDIB( const Size& rSize, USHORT nBitCount, const BitmapPalette& rPal )
 {
-	DBG_ASSERT( nBitCount == 1 || nBitCount == 4 || nBitCount == 8 || nBitCount == 24, "Unsupported BitCount!" );
+	DBG_ASSERT( nBitCount == 1 || nBitCount == 4 || nBitCount == 8 || nBitCount == 24 || nBitCount == 32, "Unsupported BitCount!" );
 
 	BitmapBuffer* pDIB;
 
@@ -169,9 +169,10 @@
 				case( 1 ): pDIB->mnFormat |= BMP_FORMAT_1BIT_MSB_PAL; break;
 				case( 4 ): pDIB->mnFormat |= BMP_FORMAT_4BIT_MSN_PAL; break;
 				case( 8 ): pDIB->mnFormat |= BMP_FORMAT_8BIT_PAL; break;
+				case( 24 ): pDIB->mnFormat |= BMP_FORMAT_24BIT_TC_BGR; break;
 			
 				default:
-					pDIB->mnFormat |= BMP_FORMAT_24BIT_TC_BGR;
+					pDIB->mnFormat |= BMP_FORMAT_32BIT_TC_BGRA;
 				break;
 			}
 
@@ -802,8 +803,10 @@
 				nBitCount = 4;
 			else if( nBitCount <= 8 )
 				nBitCount = 8;
-			else
+			else if ( nBitCount <= 24)
 				nBitCount = 24;
+			else
+				nBitCount = 32;
 		}
 	}
 	else
Index: svtools/bmpmaker/bmpcore.cxx
===================================================================
RCS file: /cvs/util/svtools/bmpmaker/bmpcore.cxx,v
retrieving revision 1.12
diff -u -p -u -r1.12 bmpcore.cxx
--- svtools/bmpmaker/bmpcore.cxx	24 Apr 2003 13:01:46 -0000	1.12
+++ svtools/bmpmaker/bmpcore.cxx	26 Sep 2003 10:58:13 -0000
@@ -107,7 +107,8 @@ void BmpCreator::ImplCreate( SvStream& r
                              const ::std::vector< DirEntry >& rInDirs, 
                              const DirEntry& rOut, 
                              const String& rName, 
-                             const LangInfo& rLang )
+                             const LangInfo& rLang,
+							 const Color& rMaskColor)
 {
     const sal_uInt32    nOldPos = pSRS->Tell();
    	const char*         pCollectFile = getenv( "BMP_COLLECT_FILE" );
@@ -215,7 +216,7 @@ void BmpCreator::ImplCreate( SvStream& r
 			            SvFileStream    aIStm( aFileName, STREAM_READ );
 			            aIStm >> aBmp;
                         aIStm.Close();
-                        
+
                         if( pCollectStm && !aBmp.IsEmpty() )
                         {
                             const ByteString aCollectString( aFileName, RTL_TEXTENCODING_ASCII_US );
@@ -237,6 +238,26 @@ void BmpCreator::ImplCreate( SvStream& r
 				}
                 else
                 {
+				    if (aBmp.GetBitCount () != 32)
+					{
+						aBmp.Convert (BMP_CONVERSION_32BIT);
+
+						BitmapWriteAccess *pUpd = aBmp.AcquireWriteAccess();
+						
+						for( long nY = 0; nY < aSize.Height(); nY++ ) {
+								for( long nX = 0; nX < aSize.Width(); nX++ ) {
+										BitmapColor aCol;
+										aCol = pUpd->GetPixel( nY, nX );
+										if( aCol == rMaskColor )
+												pUpd->SetAlpha( nY, nX, 0 );
+										else
+												pUpd->SetAlpha( nY, nX, 255 );
+								}
+						}
+
+						aBmp.ReleaseAccess( pUpd );
+					}
+						
 		            if( aTotalBmp.IsEmpty() )
 		            {
                         // first bitmap determines metrics of total bitmap
@@ -267,6 +286,15 @@ void BmpCreator::ImplCreate( SvStream& r
                                 aBmp.Convert( BMP_CONVERSION_24BIT );
                         
 				            aTotalBmp.CopyPixel( aDst, aSrc, &aBmp );
+
+							BitmapReadAccess *pSrc = aBmp.AcquireWriteAccess();
+							BitmapWriteAccess *pDst = aTotalBmp.AcquireWriteAccess();
+							for( long nY = 0; nY < aSize.Height(); nY++ )
+									for( long nX = 0; nX < aSize.Width(); nX++ )
+											pDst->SetAlpha( nY, nX + aDst.Left(), pSrc->GetAlpha( nY, nX ) );
+							aTotalBmp.ReleaseAccess( pDst );
+							aBmp.ReleaseAccess( pSrc );
+							
                             aValidBmpBitVector[ n ] = true;
                         }
 		            }
@@ -335,6 +363,13 @@ void BmpCreator::ImplCreate( SvStream& r
 
 // -----------------------------------------------------------------------------
 
+static sal_Int32 GetColorVal( const ByteString &rLine )
+{
+    ByteString aVal( rLine.GetToken( 1, '=' ) );
+	aVal.EraseLeadingChars();
+	return aVal.ToInt32() / 256;
+}
+
 void BmpCreator::Create( const String& rSRSName, 
                          const ::std::vector< String >& rInDirs,
 			             const String& rOutName, 
@@ -395,6 +430,8 @@ void BmpCreator::Create( const String& r
 
 			const String aName( aText.GetToken( 1, '"' ) );
 
+			Color aMaskColor;
+
 			do
 			{
 				if( !bLangDep &&
@@ -405,6 +442,13 @@ void BmpCreator::Create( const String& r
 					bLangDep = TRUE;
 				}
 
+				if( aByteText.Search( "Red" ) != STRING_NOTFOUND )
+					aMaskColor.SetRed( GetColorVal( aByteText ) );
+				if( aByteText.Search( "Green" ) != STRING_NOTFOUND )
+					aMaskColor.SetGreen( GetColorVal( aByteText ) );
+				if( aByteText.Search( "Blue" ) != STRING_NOTFOUND )
+					aMaskColor.SetBlue( GetColorVal( aByteText ) );
+
 				if (!pSRS->ReadLine(aByteText))
 					 break;
 			}
@@ -415,7 +459,7 @@ void BmpCreator::Create( const String& r
 			if( aText.Len() )
 			{
 				bDone = TRUE;
- 				ImplCreate( *pSRS, aInDirs, aOutDir, aName, rLang );
+ 				ImplCreate( *pSRS, aInDirs, aOutDir, aName, rLang, aMaskColor );
 			}
 			else if( ( rLang.mnLangNum != 49 ) && !bLangDep )
 			{
Index: vcl/source/gdi/bitmap.cxx
===================================================================
RCS file: /cvs/gsl/vcl/source/gdi/bitmap.cxx,v
retrieving revision 1.7
diff -u -p -u -r1.7 bitmap.cxx
--- vcl/source/gdi/bitmap.cxx	24 Apr 2003 14:56:22 -0000	1.7
+++ vcl/source/gdi/bitmap.cxx	12 Sep 2003 14:18:51 -0000
@@ -980,7 +984,9 @@ BOOL Bitmap::CopyPixel( const Rectangle&
 			{
 				long nNextIndex = 0L;
 
-				if( ( nSrcBitCount == 24 ) && ( nDstBitCount < 24 ) )
+				if (nSrcBitCount == 32 && nDstBitCount < 32)
+					Convert (BMP_CONVERSION_32BIT);
+				else if( ( nSrcBitCount == 24 ) && ( nDstBitCount < 24 ) )
 					Convert( BMP_CONVERSION_24BIT );
 				else if( ( nSrcBitCount == 8 ) && ( nDstBitCount < 8 ) )
 				{
@@ -1772,20 +1778,58 @@ Bitmap Bitmap::CreateDisplayBitmap( Outp
 
 // ------------------------------------------------------------------
 
+static BYTE doSaturate( BYTE c, BYTE i)
+{
+    int v = 1.2 * c - 0.2 * i;
+	if( v < 0 )
+        return 0;
+	else if( v > 255 )
+        return 255;
+	else
+        return v;
+}
+
 Bitmap Bitmap::GetColorTransformedBitmap( BmpColorMode eColorMode ) const
 {
     Bitmap  aRet( *this );
-    Color*  pSrcColors = NULL;
-    Color*  pDstColors = NULL;
-    ULONG   nColorCount = 0;
-
-    Image::GetColorTransformArrays( (ImageColorTransform) eColorMode, pSrcColors, pDstColors, nColorCount );
 
-    if( nColorCount && pSrcColors && pDstColors )
-        aRet.Replace( pSrcColors, pDstColors, nColorCount ); 
+    if (eColorMode == BMP_COLOR_HIGHCONTRAST && GetBitCount() >= 24) {
 
-    delete[] pSrcColors;
-    delete[] pDstColors;
+	    // Yet another special case for icons
+	    BitmapReadAccess* pAcc = AcquireReadAccess();
+	    BitmapWriteAccess* pDis = aRet.AcquireWriteAccess();
+
+	    Size aSize = GetSizePixel();
+
+	    for( long nY = 0; nY < aSize.Height(); nY++ ) {
+		    for( long nX = 0; nX < aSize.Width(); nX++ ) {
+			    BitmapColor col = pAcc->GetPixel( nY, nX );
+			    BYTE i = ( col.GetRed() * 0.3 + // magic numbers from gdk-pixbuf
+						   col.GetGreen() * 0.59 +
+						   col.GetBlue () * 0.11 );
+			    col.SetRed   (doSaturate ( col.GetRed(), i ) );
+			    col.SetGreen (doSaturate ( col.GetGreen(), i ) );
+			    col.SetBlue  (doSaturate ( col.GetBlue(), i ) );
+			    pDis->SetPixel( nY, nX, col );
+		    }
+	    }
+
+	    aRet.ReleaseAccess( pDis );
+	    ReleaseAccess( pAcc );
+    } else {
+	
+		Color*  pSrcColors = NULL;
+	    Color*  pDstColors = NULL;
+	    ULONG   nColorCount = 0;
+	    
+	    Image::GetColorTransformArrays( (ImageColorTransform) eColorMode, pSrcColors, pDstColors, nColorCount );
+	    
+	    if( nColorCount && pSrcColors && pDstColors )
+		    aRet.Replace( pSrcColors, pDstColors, nColorCount ); 
+	    
+	    delete[] pSrcColors;
+	    delete[] pDstColors;
+    }
 
     return aRet;
 }
Index: vcl/inc/bitmap.hxx
===================================================================
RCS file: /cvs/gsl/vcl/inc/bitmap.hxx,v
retrieving revision 1.8
diff -u -p -u -r1.8 bitmap.hxx
--- vcl/inc/bitmap.hxx	24 Apr 2003 14:56:11 -0000	1.8
+++ vcl/inc/bitmap.hxx	13 Sep 2003 10:30:56 -0000
@@ -125,7 +125,8 @@ enum BmpConversion
     BMP_CONVERSION_24BIT = 7,
     BMP_CONVERSION_4BIT_TRANS = 8,
     BMP_CONVERSION_8BIT_TRANS = 9,
-    BMP_CONVERSION_GHOSTED = 10
+    BMP_CONVERSION_GHOSTED = 10,
+    BMP_CONVERSION_32BIT = 11
 };
 
 // ------------------------------------------------------------------------
@@ -389,6 +390,7 @@ public:
 	ULONG					GetChecksum() const;
 
     Bitmap                  CreateDisplayBitmap( OutputDevice* pDisplay );
+    Bitmap                  GetAlphaMask() const;
     Bitmap                  GetColorTransformedBitmap( BmpColorMode eColorMode ) const;
 
 	static const BitmapPalette& GetGreyPalette( USHORT nEntries );
Index: svtools/bmpmaker/bmpcore.hxx
===================================================================
RCS file: /cvs/util/svtools/bmpmaker/bmpcore.hxx,v
retrieving revision 1.3
diff -u -p -u -r1.3 bmpcore.hxx
--- svtools/bmpmaker/bmpcore.hxx	30 Oct 2002 16:27:55 -0000	1.3
+++ svtools/bmpmaker/bmpcore.hxx	13 Sep 2003 11:10:27 -0000
@@ -112,7 +112,8 @@ private:
                                 const ::std::vector< DirEntry >& rInDirs, 
                                 const DirEntry& rOut, 
                                 const String& rName, 
-                                const LangInfo& rLang );
+                                const LangInfo& rLang,
+								const Color& rMaskColor );
 
 protected:
 
Index: vcl/inc/bmpacc.hxx
===================================================================
RCS file: /cvs/gsl/vcl/inc/bmpacc.hxx,v
retrieving revision 1.3
diff -u -p -u -r1.3 bmpacc.hxx
--- vcl/inc/bmpacc.hxx	28 Jun 2001 13:08:49 -0000	1.3
+++ vcl/inc/bmpacc.hxx	24 Sep 2003 16:36:25 -0000
@@ -203,6 +203,7 @@ public:
     inline BitmapColor          GetPixel( long nY, long nX ) const;
 	inline BitmapColor			GetColor( long nY, long nX ) const;
 	inline BYTE					GetLuminance( long nY, long nX ) const;
+    inline BYTE                 GetAlpha( long nY, long nX ) const;
 };
 
 // ---------------------
@@ -235,6 +236,7 @@ public:
     inline void                 SetPaletteColor( USHORT nColor, const BitmapColor& rBitmapColor );
 
     inline void                 SetPixel( long nY, long nX, const BitmapColor& rBitmapColor );
+    inline void                 SetAlpha( long nY, long nX, const BYTE nAlpha );
 
     inline void                 SetLineColor( const BitmapColor& rColor );
     inline const BitmapColor&   GetLineColor() const;
@@ -455,6 +457,16 @@ inline BYTE BitmapReadAccess::GetLuminan
 
 // ------------------------------------------------------------------
 
+inline BYTE BitmapReadAccess::GetAlpha( long nY, long nX ) const
+{
+    if( maBitmap.GetBitCount() != 32 )
+		return 255;
+	else
+        return mpScanBuf[ nY ] [ ( nX << 2 ) + 3 ];
+}
+
+// ------------------------------------------------------------------
+
 inline BitmapWriteAccess::BitmapWriteAccess( Bitmap& rBitmap ) :
             BitmapReadAccess( rBitmap, TRUE ),
             maLineColor     ( 0, 0, 0 ),
@@ -541,6 +553,12 @@ inline void BitmapWriteAccess::SetPixel(
     BMP_ASSERT( nX < mpBuffer->mnWidth, "x-coordinate out of range!" );
     BMP_ASSERT( nY < mpBuffer->mnHeight, "y-coordinate out of range!" );
     mFncSetPixel( mpScanBuf[ nY ], nX, rBitmapColor, maColorMask );
+}
+
+inline void BitmapWriteAccess::SetAlpha( long nY, long nX, const BYTE nAlpha )
+{
+    if( maBitmap.GetBitCount() == 32 )
+		mpScanBuf[ nY ] [ ( nX << 2 ) + 3 ] = nAlpha;
 }
 
 #endif // _SV_BMPACC_HXX
Index: vcl/source/gdi/bmpacc2.cxx
===================================================================
RCS file: /cvs/gsl/vcl/source/gdi/bmpacc2.cxx,v
retrieving revision 1.2
diff -u -p -u -r1.2 bmpacc2.cxx
--- vcl/source/gdi/bmpacc2.cxx	28 Jun 2001 13:10:36 -0000	1.2
+++ vcl/source/gdi/bmpacc2.cxx	24 Sep 2003 16:36:49 -0000
@@ -277,7 +278,7 @@ IMPL_FORMAT_GETPIXEL( _32BIT_TC_ABGR )
 
 IMPL_FORMAT_SETPIXEL( _32BIT_TC_ABGR )
 {
-	*( pScanline = pScanline + ( nX << 2 ) )++ = 0;
+    pScanline += ( nX << 2 ) + 1;
 	*pScanline++ = rBitmapColor.GetBlue();
 	*pScanline++ = rBitmapColor.GetGreen();
 	*pScanline = rBitmapColor.GetRed();
@@ -300,7 +302,7 @@ IMPL_FORMAT_GETPIXEL( _32BIT_TC_ARGB )
 
 IMPL_FORMAT_SETPIXEL( _32BIT_TC_ARGB )
 {
-	*( pScanline = pScanline + ( nX << 2 ) )++ = 0;
+    pScanline = pScanline + ( nX << 2 ) + 1;
 	*pScanline++ = rBitmapColor.GetRed();
 	*pScanline++ = rBitmapColor.GetGreen();
 	*pScanline = rBitmapColor.GetBlue();
@@ -326,7 +328,6 @@ IMPL_FORMAT_SETPIXEL( _32BIT_TC_BGRA )
 	*( pScanline = pScanline + ( nX << 2 ) )++ = rBitmapColor.GetBlue();
 	*pScanline++ = rBitmapColor.GetGreen();
 	*pScanline++ = rBitmapColor.GetRed();
-	*pScanline = 0;
 }
 
 // ------------------------------------------------------------------
@@ -349,7 +350,6 @@ IMPL_FORMAT_SETPIXEL( _32BIT_TC_RGBA )
 	*( pScanline = pScanline + ( nX << 2 ) )++ = rBitmapColor.GetRed();
 	*pScanline++ = rBitmapColor.GetGreen();
 	*pScanline++ = rBitmapColor.GetBlue();
-	*pScanline = 0;
 }
 
 // ------------------------------------------------------------------
Index: vcl/source/gdi/bitmap3.cxx
===================================================================
RCS file: /cvs/gsl/vcl/source/gdi/bitmap3.cxx,v
retrieving revision 1.3
diff -u -p -u -r1.3 bitmap3.cxx
--- vcl/source/gdi/bitmap3.cxx	27 Aug 2001 12:57:08 -0000	1.3
+++ vcl/source/gdi/bitmap3.cxx	24 Sep 2003 16:39:29 -0000
@@ -401,6 +401,13 @@ BOOL Bitmap::Convert( BmpConversion eCon
 			bRet = ImplConvertGhosted();
 		break;
 
+		case BMP_CONVERSION_32BIT:
+			if (nBitCount < 32)
+				bRet = ImplConvertUp (32, FALSE);
+			else
+				bRet = TRUE;
+			break;
+
 		default:
 			DBG_ERROR( "Bitmap::Convert(): Unsupported conversion" );
 		break;
@@ -1074,7 +1081,8 @@ BOOL Bitmap::ImplScaleInterpolate( const
 		BitmapReadAccess*	pReadAcc = AcquireReadAccess();
 		long				nWidth = pReadAcc->Width();
 		long				nHeight = pReadAcc->Height();
-		Bitmap				aNewBmp( Size( nNewWidth, nHeight ), 24 );
+		Bitmap				aNewBmp( Size( nNewWidth, nHeight ),
+							 GetBitCount() == 32 ? 32 : 24 );
 		BitmapWriteAccess*	pWriteAcc = aNewBmp.AcquireWriteAccess();
 		long*				pLutInt;
 		long*				pLutFrac;
@@ -1184,7 +1192,8 @@ BOOL Bitmap::ImplScaleInterpolate( const
 			bRet = FALSE;
 			ImplAssignWithSize( aNewBmp );
 			pReadAcc = AcquireReadAccess();
-			aNewBmp = Bitmap( Size( nNewWidth, nNewHeight ), 24 );
+			aNewBmp = Bitmap( Size( nNewWidth, nNewHeight ),
+					  GetBitCount() == 32 ? 32 : 24 );
 			pWriteAcc = aNewBmp.AcquireWriteAccess();
 
 			if( pReadAcc && pWriteAcc )
Index: vcl/source/gdi/bitmap2.cxx
===================================================================
RCS file: /cvs/gsl/vcl/source/gdi/bitmap2.cxx,v
retrieving revision 1.4
diff -u -p -u -r1.4 bitmap2.cxx
--- vcl/source/gdi/bitmap2.cxx	24 Apr 2003 13:17:58 -0000	1.4
+++ vcl/source/gdi/bitmap2.cxx	24 Sep 2003 16:40:07 -0000
@@ -204,7 +204,8 @@ BOOL Bitmap::ImplReadDIB( SvStream& rISt
 	{
 		USHORT nBitCount = ( aHeader.nBitCount <= 1 ) ? 1 :
 						   ( aHeader.nBitCount <= 4 ) ? 4 :
-						   ( aHeader.nBitCount <= 8 ) ? 8 : 24;
+						   ( aHeader.nBitCount <= 8 ) ? 8 : 
+						   ( aHeader.nBitCount <= 24 ) ? 24 : 32;
 
 		const Size			aSizePixel( aHeader.nWidth, aHeader.nHeight );
 		BitmapPalette		aDummyPal;
@@ -640,6 +641,7 @@ BOOL Bitmap::ImplReadDIBBits( SvStream& 
 					ColorMask	aMask( nRMask, nGMask, nBMask );
 					BitmapColor aColor;
 					UINT32* 	pTmp32;
+					UINT32      nCol;
 
 					for( long nY = rHeader.nHeight - 1L; nY >= 0L; nY-- )
 					{
@@ -647,8 +649,10 @@ BOOL Bitmap::ImplReadDIBBits( SvStream& 
 
 						for( long nX = 0L; nX < nWidth; nX++ )
 						{
-							aMask.GetColorFor32Bit( aColor, (BYTE*) pTmp32++ );
+							BYTE *pPix = (BYTE *) pTmp32++;
+							aMask.GetColorFor32Bit( aColor, pPix );
 							rAcc.SetPixel( nY, nX, aColor );
+							rAcc.SetAlpha( nY, nX, pPix[ 3 ] );
 						}
 					}
 				}
@@ -1009,6 +1013,27 @@ BOOL Bitmap::ImplWriteDIBBits( SvStream&
 				}
 				break;
 
+				case 24:
+				{
+					BitmapColor aPixelColor;
+
+					for( long nY = nHeight - 1; nY >= 0L; nY-- )
+					{
+						pTmp = pBuf;
+
+						for( long nX = 0L; nX < nWidth; nX++ )
+						{
+							aPixelColor = rAcc.GetPixel( nY, nX );
+							*pTmp++ = aPixelColor.GetBlue();
+							*pTmp++ = aPixelColor.GetGreen();
+							*pTmp++ = aPixelColor.GetRed();
+						}
+
+						rOStm.Write( pBuf, nAlignedWidth );
+					}
+				}
+				break;
+
 				default:
 				{
 					BitmapColor aPixelColor;
@@ -1023,6 +1048,7 @@ BOOL Bitmap::ImplWriteDIBBits( SvStream&
 							*pTmp++ = aPixelColor.GetBlue();
 							*pTmp++ = aPixelColor.GetGreen();
 							*pTmp++ = aPixelColor.GetRed();
+							*pTmp++ = rAcc.GetAlpha( nY, nX );
 						}
 
 						rOStm.Write( pBuf, nAlignedWidth );
@@ -1038,6 +1064,38 @@ BOOL Bitmap::ImplWriteDIBBits( SvStream&
 	rImageSize = rOStm.Tell() - rImageSize;
 
 	return( rOStm.GetError() == 0UL );
+}
+
+// ------------------------------------------------------------------
+
+Bitmap
+Bitmap::GetAlphaMask() const
+{
+	if( GetBitCount() < 32 )
+        return Bitmap();
+
+    Size aSize = GetSizePixel();
+    Bitmap aAlpha( aSize, 8, &GetGreyPalette( 256 ) );
+
+	aAlpha.Erase( COL_WHITE );
+
+	BitmapReadAccess *pSrc = AcquireReadAccess();
+	BitmapWriteAccess *pDst = aAlpha.AcquireWriteAccess();
+
+	for( long nY = 0; nY < aSize.Height(); nY++ )
+	{
+		for( long nX = 0; nX < aSize.Width(); nX++ )
+		{
+            BitmapColor aCol;
+			aCol = pSrc->GetPixel( nY, nX );
+			pDst->SetPixel( nY, nX, BitmapColor( 255 - pSrc->GetAlpha( nY, nX ) ) );
+		}
+	}
+	
+	ReleaseAccess( pSrc );
+	ReleaseAccess( pDst );
+		
+	return aAlpha;
 }
 
 // ------------------------------------------------------------------
--- /opt/OpenOffice/openoffice/build/OOO_1_1_3_fix2/vcl/source/gdi/alpha.cxx	2004-09-02 12:52:10.000000000 +0100
+++ vcl/source/gdi/alpha.cxx	2004-09-08 08:25:13.012597552 +0100
@@ -135,6 +135,9 @@
 void AlphaMask::ImplSetBitmap( const Bitmap& rBitmap )
 {
 	*(Bitmap*) this = rBitmap;
+
+	if( !!rBitmap )
+		Bitmap::Convert( BMP_CONVERSION_8BIT_GREYS );
 }
 
 // -----------------------------------------------------------------------------
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin