summaryrefslogtreecommitdiff
path: root/vcl/inc
diff options
context:
space:
mode:
authorVladimir Glazounov <vg@openoffice.org>2007-04-11 17:05:20 +0000
committerVladimir Glazounov <vg@openoffice.org>2007-04-11 17:05:20 +0000
commitca23d37093352cd390de814939a1c451d7ba91ff (patch)
treebb09946bcd2e8d3d65af9bb71e8f1e4fdf347368 /vcl/inc
parentd6f8420f16b7b504c2064d6476cd180d9a719b7a (diff)
INTEGRATION: CWS hedaburemove01 (1.1.2); FILE ADDED
2007/04/04 14:57:23 vg 1.1.2.2: resync to SRC680_m207 2007/02/09 16:11:04 vg 1.1.2.1: #72503# get rid of hedabu procedure: Moving headers to vcl/inc/vcl and correspondent necessary changes
Diffstat (limited to 'vcl/inc')
-rw-r--r--vcl/inc/vcl/salbtype.hxx950
1 files changed, 950 insertions, 0 deletions
diff --git a/vcl/inc/vcl/salbtype.hxx b/vcl/inc/vcl/salbtype.hxx
new file mode 100644
index 000000000000..62dd14eecc69
--- /dev/null
+++ b/vcl/inc/vcl/salbtype.hxx
@@ -0,0 +1,950 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: salbtype.hxx,v $
+ *
+ * $Revision: 1.2 $
+ *
+ * last change: $Author: vg $ $Date: 2007-04-11 18:05:20 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ************************************************************************/
+
+#ifndef _SV_SALBTYPE_HXX
+#define _SV_SALBTYPE_HXX
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#ifndef _OSL_ENDIAN_H_
+#include <osl/endian.h>
+#endif
+#ifndef _DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+#ifndef _SV_SALGTYPE_HXX
+#include <vcl/salgtype.hxx>
+#endif
+#ifndef _TOOLS_COLOR_HXX
+#include <tools/color.hxx>
+#endif
+#ifndef _SV_SV_H
+#include <vcl/sv.h>
+#endif
+#ifndef _VCL_DLLAPI_H
+#include <vcl/dllapi.h>
+#endif
+
+// ----------
+// - Memory -
+// ----------
+
+typedef BYTE* HPBYTE;
+typedef HPBYTE Scanline;
+typedef const BYTE* ConstHPBYTE;
+typedef ConstHPBYTE ConstScanline;
+
+// --------------------
+// - Helper functions -
+// --------------------
+
+inline long MinMax( long nVal, long nMin, long nMax );
+inline long AlignedWidth4Bytes( long nWidthBits );
+inline long FRound( double fVal );
+
+// ------------------
+// - Bitmap formats -
+// ------------------
+
+#define BMP_FORMAT_BOTTOM_UP 0x00000000UL
+#define BMP_FORMAT_TOP_DOWN 0x80000000UL
+
+#define BMP_FORMAT_1BIT_MSB_PAL 0x00000001UL
+#define BMP_FORMAT_1BIT_LSB_PAL 0x00000002UL
+
+#define BMP_FORMAT_4BIT_MSN_PAL 0x00000004UL
+#define BMP_FORMAT_4BIT_LSN_PAL 0x00000008UL
+
+#define BMP_FORMAT_8BIT_PAL 0x00000010UL
+#define BMP_FORMAT_8BIT_TC_MASK 0x00000020UL
+
+// #define BMP_FORMAT_16BIT_TC_MASK 0x00000040UL
+
+#define BMP_FORMAT_24BIT_TC_BGR 0x00000080UL
+#define BMP_FORMAT_24BIT_TC_RGB 0x00000100UL
+#define BMP_FORMAT_24BIT_TC_MASK 0x00000200UL
+
+#define BMP_FORMAT_32BIT_TC_ABGR 0x00000400UL
+#define BMP_FORMAT_32BIT_TC_ARGB 0x00000800UL
+#define BMP_FORMAT_32BIT_TC_BGRA 0x00001000UL
+#define BMP_FORMAT_32BIT_TC_RGBA 0x00002000UL
+#define BMP_FORMAT_32BIT_TC_MASK 0x00004000UL
+
+#define BMP_FORMAT_16BIT_TC_MSB_MASK 0x00008000UL
+#define BMP_FORMAT_16BIT_TC_LSB_MASK 0x00010000UL
+
+#define BMP_SCANLINE_ADJUSTMENT( Mac_nBmpFormat ) ( (Mac_nBmpFormat) & 0x80000000UL )
+#define BMP_SCANLINE_FORMAT( Mac_nBmpFormat ) ( (Mac_nBmpFormat) & 0x7FFFFFFFUL )
+
+// ------------------------------------------------------------------
+
+#define MASK_TO_COLOR( d_nVal, d_RM, d_GM, d_BM, d_RS, d_GS, d_BS, d_Col ) \
+ULONG _def_cR = (BYTE) ( d_RS < 0L ? ( (d_nVal) & d_RM ) << -d_RS : ( (d_nVal) & d_RM ) >> d_RS ); \
+ULONG _def_cG = (BYTE) ( d_GS < 0L ? ( (d_nVal) & d_GM ) << -d_GS : ( (d_nVal) & d_GM ) >> d_GS ); \
+ULONG _def_cB = (BYTE) ( d_BS < 0L ? ( (d_nVal) & d_BM ) << -d_BS : ( (d_nVal) & d_BM ) >> d_BS ); \
+d_Col = BitmapColor( (BYTE) ( _def_cR | ( ( _def_cR & mnROr ) >> mnROrShift ) ), \
+ (BYTE) ( _def_cG | ( ( _def_cG & mnGOr ) >> mnGOrShift ) ), \
+ (BYTE) ( _def_cB | ( ( _def_cB & mnBOr ) >> mnBOrShift ) ) );
+
+// ------------------------------------------------------------------
+
+#define COLOR_TO_MASK( d_rCol, d_RM, d_GM, d_BM, d_RS, d_GS, d_BS ) \
+( ( ( ( d_RS < 0L ) ? ( (UINT32) (d_rCol).GetRed() >> -d_RS ) : \
+ ( (UINT32) (d_rCol).GetRed() << d_RS ) ) & d_RM ) | \
+ ( ( ( d_GS < 0L ) ? ( (UINT32) (d_rCol).GetGreen() >> -d_GS ) : \
+ ( (UINT32) (d_rCol).GetGreen() << d_GS ) ) & d_GM ) | \
+ ( ( ( d_BS < 0L ) ? ( (UINT32) (d_rCol).GetBlue() >> -d_BS ) : \
+ ( (UINT32) (d_rCol).GetBlue() << d_BS ) ) & d_BM ) )
+
+// ---------------
+// - BitmapColor -
+// ---------------
+
+class Color;
+
+class VCL_DLLPUBLIC BitmapColor
+{
+private:
+
+// !!! Achtung:
+// !!! da auf die Member dieser Klasse via memcpy
+// !!! zugegriffen wird, darf diese Klasse weder
+// !!! in der Groesse noch der Reihenfolge der
+// !!! Member veraendert werden (KA 02.09.97)
+ BYTE mcBlueOrIndex;
+ BYTE mcGreen;
+ BYTE mcRed;
+ BYTE mbIndex;
+
+public:
+
+ inline BitmapColor();
+ inline BitmapColor( const BitmapColor& rBitmapColor );
+ inline BitmapColor( BYTE cRed, BYTE cGreen, BYTE cBlue );
+ inline BitmapColor( const Color& rColor );
+ inline BitmapColor( BYTE cIndex );
+ inline ~BitmapColor() {};
+
+ inline BOOL operator==( const BitmapColor& rBitmapColor ) const;
+ inline BOOL operator!=( const BitmapColor& rBitmapColor ) const;
+ inline BitmapColor& operator=( const BitmapColor& rBitmapColor );
+
+ inline BOOL IsIndex() const;
+
+ inline BYTE GetRed() const;
+ inline void SetRed( BYTE cRed );
+
+ inline BYTE GetGreen() const;
+ inline void SetGreen( BYTE cGreen );
+
+ inline BYTE GetBlue() const;
+ inline void SetBlue( BYTE cBlue );
+
+ inline BYTE GetIndex() const;
+ inline void SetIndex( BYTE cIndex );
+
+ operator Color() const;
+ inline operator BYTE() const;
+
+ inline BYTE GetBlueOrIndex() const;
+
+ inline BitmapColor& Invert();
+
+ inline BYTE GetLuminance() const;
+ inline BitmapColor& IncreaseLuminance( BYTE cGreyInc );
+ inline BitmapColor& DecreaseLuminance( BYTE cGreyDec );
+
+ inline BitmapColor& Merge( const BitmapColor& rColor, BYTE cTransparency );
+ inline BitmapColor& Merge( BYTE cR, BYTE cG, BYTE cB, BYTE cTransparency );
+
+ inline ULONG GetColorError( const BitmapColor& rBitmapColor ) const;
+};
+
+// ---------------
+// - BitmapPalette -
+// ---------------
+
+class Palette;
+
+class VCL_DLLPUBLIC BitmapPalette
+{
+ friend class SalBitmap;
+ friend class BitmapAccess;
+
+private:
+
+ BitmapColor* mpBitmapColor;
+ USHORT mnCount;
+
+//#if 0 // _SOLAR__PRIVATE
+
+public:
+
+ SAL_DLLPRIVATE inline BitmapColor* ImplGetColorBuffer() const;
+
+//#endif // __PRIVATE
+
+public:
+
+ inline BitmapPalette();
+ inline BitmapPalette( const BitmapPalette& rBitmapPalette );
+ inline BitmapPalette( USHORT nCount );
+ inline ~BitmapPalette();
+
+ inline BitmapPalette& operator=( const BitmapPalette& rBitmapPalette );
+ inline BOOL operator==( const BitmapPalette& rBitmapPalette ) const;
+ inline BOOL operator!=( const BitmapPalette& rBitmapPalette ) const;
+ inline BOOL operator!();
+
+ inline USHORT GetEntryCount() const;
+ inline void SetEntryCount( USHORT nCount );
+
+ inline const BitmapColor& operator[]( USHORT nIndex ) const;
+ inline BitmapColor& operator[]( USHORT nIndex );
+
+ inline USHORT GetBestIndex( const BitmapColor& rCol ) const;
+};
+
+// ---------------
+// - ColorMask -
+// ---------------
+
+class VCL_DLLPUBLIC ColorMask
+{
+ ULONG mnRMask;
+ ULONG mnGMask;
+ ULONG mnBMask;
+ long mnRShift;
+ long mnGShift;
+ long mnBShift;
+ ULONG mnROrShift;
+ ULONG mnGOrShift;
+ ULONG mnBOrShift;
+ ULONG mnROr;
+ ULONG mnGOr;
+ ULONG mnBOr;
+
+ SAL_DLLPRIVATE inline long ImplCalcMaskShift( ULONG nMask, ULONG& rOr, ULONG& rOrShift ) const;
+
+public:
+
+ inline ColorMask( ULONG nRedMask = 0UL, ULONG nGreenMask = 0UL, ULONG nBlueMask = 0UL );
+ inline ~ColorMask() {}
+
+ inline ULONG GetRedMask() const;
+ inline ULONG GetGreenMask() const;
+ inline ULONG GetBlueMask() const;
+
+ inline void GetColorFor8Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
+ inline void SetColorFor8Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
+
+ inline void GetColorFor16BitMSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
+ inline void SetColorFor16BitMSB( const BitmapColor& rColor, HPBYTE pPixel ) const;
+ inline void GetColorFor16BitLSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
+ inline void SetColorFor16BitLSB( const BitmapColor& rColor, HPBYTE pPixel ) const;
+
+ inline void GetColorFor24Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
+ inline void SetColorFor24Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
+
+ inline void GetColorFor32Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
+ inline void SetColorFor32Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
+};
+
+// ---------------
+// - BitmapBuffer -
+// ---------------
+
+struct VCL_DLLPUBLIC BitmapBuffer
+{
+ ULONG mnFormat;
+ long mnWidth;
+ long mnHeight;
+ long mnScanlineSize;
+ USHORT mnBitCount;
+ ColorMask maColorMask;
+ BitmapPalette maPalette;
+ BYTE* mpBits;
+
+ BitmapBuffer(){}
+ ~BitmapBuffer() {}
+};
+
+// ---------------------
+// - StretchAndConvert -
+// ---------------------
+
+VCL_DLLPUBLIC BitmapBuffer* StretchAndConvert( const BitmapBuffer& rSrcBuffer, const SalTwoRect& rTwoRect,
+ ULONG nDstBitmapFormat, BitmapPalette* pDstPal = NULL, ColorMask* pDstMask = NULL );
+
+// ---------------
+// - Inlines -
+// ---------------
+
+inline long MinMax( long nVal, long nMin, long nMax )
+{
+ return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin );
+}
+
+// ------------------------------------------------------------------
+
+inline long AlignedWidth4Bytes( long nWidthBits )
+{
+ return( ( ( nWidthBits + 31 ) >> 5 ) << 2 );
+}
+
+// ------------------------------------------------------------------
+
+inline long FRound( double fVal )
+{
+ return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) );
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::BitmapColor() :
+ mcBlueOrIndex ( 0 ),
+ mcGreen ( 0 ),
+ mcRed ( 0 ),
+ mbIndex ( FALSE )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::BitmapColor( BYTE cRed, BYTE cGreen, BYTE cBlue ) :
+ mcBlueOrIndex ( cBlue ),
+ mcGreen ( cGreen ),
+ mcRed ( cRed ),
+ mbIndex ( FALSE )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::BitmapColor( const BitmapColor& rBitmapColor ) :
+ mcBlueOrIndex ( rBitmapColor.mcBlueOrIndex ),
+ mcGreen ( rBitmapColor.mcGreen ),
+ mcRed ( rBitmapColor.mcRed ),
+ mbIndex ( rBitmapColor.mbIndex )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::BitmapColor( const Color& rColor ) :
+ mcBlueOrIndex ( rColor.GetBlue() ),
+ mcGreen ( rColor.GetGreen() ),
+ mcRed ( rColor.GetRed() ),
+ mbIndex ( 0 )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::BitmapColor( BYTE cIndex ) :
+ mcBlueOrIndex ( cIndex ),
+ mcGreen ( 0 ),
+ mcRed ( 0 ),
+ mbIndex ( TRUE )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapColor::operator==( const BitmapColor& rBitmapColor ) const
+{
+ return( ( mcBlueOrIndex == rBitmapColor.mcBlueOrIndex ) &&
+ ( mbIndex ? rBitmapColor.mbIndex :
+ ( mcGreen == rBitmapColor.mcGreen && mcRed == rBitmapColor.mcRed ) ) );
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapColor::operator!=( const BitmapColor& rBitmapColor ) const
+{
+ return !( *this == rBitmapColor );
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::operator=( const BitmapColor& rBitmapColor )
+{
+ mcBlueOrIndex = rBitmapColor.mcBlueOrIndex;
+ mcGreen = rBitmapColor.mcGreen;
+ mcRed = rBitmapColor.mcRed;
+ mbIndex = rBitmapColor.mbIndex;
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapColor::IsIndex() const
+{
+ return mbIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetRed() const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ return mcRed;
+}
+
+// ------------------------------------------------------------------
+
+inline void BitmapColor::SetRed( BYTE cRed )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcRed = cRed;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetGreen() const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ return mcGreen;
+}
+
+// ------------------------------------------------------------------
+
+inline void BitmapColor::SetGreen( BYTE cGreen )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcGreen = cGreen;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetBlue() const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ return mcBlueOrIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline void BitmapColor::SetBlue( BYTE cBlue )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = cBlue;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetIndex() const
+{
+ DBG_ASSERT( mbIndex, "Pixel represents color values!" );
+ return mcBlueOrIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline void BitmapColor::SetIndex( BYTE cIndex )
+{
+ DBG_ASSERT( mbIndex, "Pixel represents color values!" );
+ mcBlueOrIndex = cIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::operator Color() const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ return Color( mcRed, mcGreen, mcBlueOrIndex );
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor::operator BYTE() const
+{
+ DBG_ASSERT( mbIndex, "Pixel represents color values!" );
+ return mcBlueOrIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetBlueOrIndex() const
+{
+ // #i47518# Yield a value regardless of mbIndex
+ return mcBlueOrIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::Invert()
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = ~mcBlueOrIndex, mcGreen = ~mcGreen, mcRed = ~mcRed;
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BYTE BitmapColor::GetLuminance() const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ return( (BYTE) ( ( mcBlueOrIndex * 28UL + mcGreen * 151UL + mcRed * 77UL ) >> 8UL ) );
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::IncreaseLuminance( BYTE cGreyInc )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = (BYTE) MinMax( (long) mcBlueOrIndex + cGreyInc, 0L, 255L );
+ mcGreen = (BYTE) MinMax( (long) mcGreen + cGreyInc, 0L, 255L );
+ mcRed = (BYTE) MinMax( (long) mcRed + cGreyInc, 0L, 255L );
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::DecreaseLuminance( BYTE cGreyDec )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = (BYTE) MinMax( (long) mcBlueOrIndex - cGreyDec, 0L, 255L );
+ mcGreen = (BYTE) MinMax( (long) mcGreen - cGreyDec, 0L, 255L );
+ mcRed = (BYTE) MinMax( (long) mcRed - cGreyDec, 0L, 255L );
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::Merge( const BitmapColor& rBitmapColor, BYTE cTransparency )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ DBG_ASSERT( !rBitmapColor.mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = COLOR_CHANNEL_MERGE( mcBlueOrIndex, rBitmapColor.mcBlueOrIndex, cTransparency );
+ mcGreen = COLOR_CHANNEL_MERGE( mcGreen, rBitmapColor.mcGreen, cTransparency );
+ mcRed = COLOR_CHANNEL_MERGE( mcRed, rBitmapColor.mcRed, cTransparency );
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapColor::Merge( BYTE cR, BYTE cG, BYTE cB, BYTE cTransparency )
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ mcBlueOrIndex = COLOR_CHANNEL_MERGE( mcBlueOrIndex, cB, cTransparency );
+ mcGreen = COLOR_CHANNEL_MERGE( mcGreen, cG, cTransparency );
+ mcRed = COLOR_CHANNEL_MERGE( mcRed, cR, cTransparency );
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline ULONG BitmapColor::GetColorError( const BitmapColor& rBitmapColor ) const
+{
+ DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
+ DBG_ASSERT( !rBitmapColor.mbIndex, "Pixel represents index into colortable!" );
+ return( (ULONG) ( labs( mcBlueOrIndex - rBitmapColor.mcBlueOrIndex ) +
+ labs( mcGreen - rBitmapColor.mcGreen ) +
+ labs( mcRed - rBitmapColor.mcRed ) ) );
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapPalette::BitmapPalette() :
+ mpBitmapColor ( NULL ),
+ mnCount ( 0 )
+{
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapPalette::BitmapPalette( const BitmapPalette& rBitmapPalette ) :
+ mnCount( rBitmapPalette.mnCount )
+{
+ if( mnCount )
+ {
+ const ULONG nSize = mnCount * sizeof( BitmapColor );
+ mpBitmapColor = (BitmapColor*) new BYTE[ nSize ];
+ memcpy( mpBitmapColor, rBitmapPalette.mpBitmapColor, nSize );
+ }
+ else
+ mpBitmapColor = NULL;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapPalette::BitmapPalette( USHORT nCount ) :
+ mnCount( nCount )
+{
+ if( mnCount )
+ {
+ const ULONG nSize = mnCount * sizeof( BitmapColor );
+ mpBitmapColor = (BitmapColor*) new BYTE[ nSize ];
+ memset( mpBitmapColor, 0, nSize );
+ }
+ else
+ mpBitmapColor = NULL;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapPalette::~BitmapPalette()
+{
+ delete[] (BYTE*) mpBitmapColor;
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapPalette& BitmapPalette::operator=( const BitmapPalette& rBitmapPalette )
+{
+ delete[] (BYTE*) mpBitmapColor;
+ mnCount = rBitmapPalette.mnCount;
+
+ if( mnCount )
+ {
+ const ULONG nSize = mnCount * sizeof( BitmapColor );
+ mpBitmapColor = (BitmapColor*) new BYTE[ nSize ];
+ memcpy( mpBitmapColor, rBitmapPalette.mpBitmapColor, nSize );
+ }
+ else
+ mpBitmapColor = NULL;
+
+ return *this;
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapPalette::operator==( const BitmapPalette& rBitmapPalette ) const
+{
+ BOOL bRet = FALSE;
+
+ if( rBitmapPalette.mnCount == mnCount )
+ {
+ bRet = TRUE;
+
+ for( USHORT i = 0; i < mnCount; i++ )
+ {
+ if( mpBitmapColor[ i ] != rBitmapPalette.mpBitmapColor[ i ] )
+ {
+ bRet = FALSE;
+ break;
+ }
+ }
+ }
+
+ return bRet;
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapPalette::operator!=( const BitmapPalette& rBitmapPalette ) const
+{
+ return !( *this == rBitmapPalette );
+}
+
+// ------------------------------------------------------------------
+
+inline BOOL BitmapPalette::operator!()
+{
+ return( !mnCount || !mpBitmapColor );
+}
+
+// ------------------------------------------------------------------
+
+inline USHORT BitmapPalette::GetEntryCount() const
+{
+ return mnCount;
+}
+
+// ------------------------------------------------------------------
+
+inline void BitmapPalette::SetEntryCount( USHORT nCount )
+{
+ if( !nCount )
+ {
+ delete[] (BYTE*) mpBitmapColor;
+ mpBitmapColor = NULL;
+ mnCount = 0;
+ }
+ else if( nCount != mnCount )
+ {
+ const ULONG nNewSize = nCount * sizeof( BitmapColor );
+ const ULONG nMinSize = Min( mnCount, nCount ) * sizeof( BitmapColor );
+ BYTE* pNewColor = new BYTE[ nNewSize ];
+
+ if ( nMinSize && mpBitmapColor )
+ memcpy( pNewColor, mpBitmapColor, nMinSize );
+ delete[] (BYTE*) mpBitmapColor;
+ memset( pNewColor + nMinSize, 0, nNewSize - nMinSize );
+ mpBitmapColor = (BitmapColor*) pNewColor;
+ mnCount = nCount;
+ }
+}
+
+// ------------------------------------------------------------------
+
+inline const BitmapColor& BitmapPalette::operator[]( USHORT nIndex ) const
+{
+ DBG_ASSERT( nIndex < mnCount, "Palette index is out of range!" );
+ return mpBitmapColor[ nIndex ];
+}
+
+// ------------------------------------------------------------------
+
+inline BitmapColor& BitmapPalette::operator[]( USHORT nIndex )
+{
+ DBG_ASSERT( nIndex < mnCount, "Palette index is out of range!" );
+ return mpBitmapColor[ nIndex ];
+}
+
+// ------------------------------------------------------------------
+
+//#if 0 // _SOLAR__PRIVATE
+inline BitmapColor* BitmapPalette::ImplGetColorBuffer() const
+{
+ DBG_ASSERT( mpBitmapColor, "No color buffer available!" );
+ return mpBitmapColor;
+}
+//#endif
+// ------------------------------------------------------------------
+
+inline USHORT BitmapPalette::GetBestIndex( const BitmapColor& rCol ) const
+{
+ USHORT nRetIndex = 0;
+
+ if( mpBitmapColor && mnCount )
+ {
+ BOOL bFound = FALSE;
+
+ for( long j = 0L; ( j < mnCount ) && !bFound; j++ )
+ if( rCol == mpBitmapColor[ j ] )
+ nRetIndex = ( (USHORT) j ), bFound = TRUE;
+
+ if( !bFound )
+ {
+ long nActErr, nLastErr = rCol.GetColorError( mpBitmapColor[ nRetIndex = mnCount - 1 ] );
+
+ for( long i = nRetIndex - 1; i >= 0L; i-- )
+ if ( ( nActErr = rCol.GetColorError( mpBitmapColor[ i ] ) ) < nLastErr )
+ nLastErr = nActErr, nRetIndex = (USHORT) i;
+ }
+ }
+
+ return nRetIndex;
+}
+
+// ------------------------------------------------------------------
+
+inline ColorMask::ColorMask( ULONG nRedMask, ULONG nGreenMask, ULONG nBlueMask ) :
+ mnRMask( nRedMask ),
+ mnGMask( nGreenMask ),
+ mnBMask( nBlueMask ),
+ mnROrShift( 0L ),
+ mnGOrShift( 0L ),
+ mnBOrShift( 0L ),
+ mnROr( 0L ),
+ mnGOr( 0L ),
+ mnBOr( 0L )
+{
+ mnRShift = ( mnRMask ? ImplCalcMaskShift( mnRMask, mnROr, mnROrShift ) : 0L );
+ mnGShift = ( mnGMask ? ImplCalcMaskShift( mnGMask, mnGOr, mnGOrShift ) : 0L );
+ mnBShift = ( mnBMask ? ImplCalcMaskShift( mnBMask, mnBOr, mnBOrShift ) : 0L );
+}
+
+// ------------------------------------------------------------------
+
+inline long ColorMask::ImplCalcMaskShift( ULONG nMask, ULONG& rOr, ULONG& rOrShift ) const
+{
+ long nShift;
+ long nRet;
+ ULONG nLen = 0UL;
+
+ // bei welchen Bits faengt die Maske an
+ for( nShift = 31L; ( nShift >= 0L ) && !( nMask & ( 1 << (ULONG) nShift ) ); nShift-- )
+ {}
+
+ nRet = nShift;
+
+ // XXX Anzahl der gesetzten Bits ermitteln => nach rechts bis Null laufen
+ while( ( nShift >= 0L ) && ( nMask & ( 1 << (ULONG) nShift ) ) )
+ {
+ nShift--;
+ nLen++;
+ }
+
+ rOrShift = 8L - nLen;
+ rOr = (BYTE) ( ( 0xffUL >> nLen ) << rOrShift );
+
+ return( nRet -= 7 );
+}
+
+// ------------------------------------------------------------------
+
+inline ULONG ColorMask::GetRedMask() const
+{
+ return mnRMask;
+}
+
+// ------------------------------------------------------------------
+
+inline ULONG ColorMask::GetGreenMask() const
+{
+ return mnGMask;
+}
+
+// ------------------------------------------------------------------
+
+inline ULONG ColorMask::GetBlueMask() const
+{
+ return mnBMask;
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::GetColorFor8Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
+{
+ const UINT32 nVal = *pPixel;
+ MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::SetColorFor8Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
+{
+ *pPixel = (BYTE) COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::GetColorFor16BitMSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const
+{
+#ifdef OSL_BIGENDIAN
+ const UINT32 nVal = *(UINT16*) pPixel;
+#else
+ const UINT32 nVal = pPixel[ 1 ] | ( (UINT32) pPixel[ 0 ] << 8UL );
+#endif
+
+ MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::SetColorFor16BitMSB( const BitmapColor& rColor, HPBYTE pPixel ) const
+{
+ const UINT16 nVal = (UINT16)COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+
+#ifdef OSL_BIGENDIAN
+ *(UINT16*) pPixel = nVal;
+#else
+ pPixel[ 0 ] = (BYTE)(nVal >> 8U);
+ pPixel[ 1 ] = (BYTE) nVal;
+#endif
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::GetColorFor16BitLSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const
+{
+#ifdef OSL_BIGENDIAN
+ const UINT32 nVal = pPixel[ 0 ] | ( (UINT32) pPixel[ 1 ] << 8UL );
+#else
+ const UINT32 nVal = *(UINT16*) pPixel;
+#endif
+
+ MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::SetColorFor16BitLSB( const BitmapColor& rColor, HPBYTE pPixel ) const
+{
+ const UINT16 nVal = (UINT16)COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+
+#ifdef OSL_BIGENDIAN
+ pPixel[ 0 ] = (BYTE) nVal;
+ pPixel[ 1 ] = (BYTE)(nVal >> 8U);
+#else
+ *(UINT16*) pPixel = nVal;
+#endif
+}
+
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::GetColorFor24Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
+{
+ const UINT32 nVal = pPixel[ 0 ] | ( (UINT32) pPixel[ 1 ] << 8UL ) | ( (UINT32) pPixel[ 2 ] << 16UL );
+ MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::SetColorFor24Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
+{
+ const UINT32 nVal = COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+ pPixel[ 0 ] = (BYTE) nVal; pPixel[ 1 ] = (BYTE) ( nVal >> 8UL ); pPixel[ 2 ] = (BYTE) ( nVal >> 16UL );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::GetColorFor32Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
+{
+#ifdef OSL_BIGENDIAN
+ const UINT32 nVal = (UINT32) pPixel[ 0 ] | ( (UINT32) pPixel[ 1 ] << 8UL ) |
+ ( (UINT32) pPixel[ 2 ] << 16UL ) | ( (UINT32) pPixel[ 3 ] << 24UL );
+#else
+ const UINT32 nVal = *(UINT32*) pPixel;
+#endif
+
+ MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
+}
+
+// ------------------------------------------------------------------
+
+inline void ColorMask::SetColorFor32Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
+{
+#ifdef OSL_BIGENDIAN
+ const UINT32 nVal = COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+ pPixel[ 0 ] = (BYTE) nVal; pPixel[ 1 ] = (BYTE) ( nVal >> 8UL );
+ pPixel[ 2 ] = (BYTE) ( nVal >> 16UL ); pPixel[ 3 ] = (BYTE) ( nVal >> 24UL );
+#else
+ *(UINT32*) pPixel = COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift );
+#endif
+}
+
+#endif // _SV_SALBTYPE_HXX