LCOV - code coverage report
Current view: top level - include/vcl - salbtype.hxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 187 231 81.0 %
Date: 2014-11-03 Functions: 49 59 83.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #ifndef INCLUDED_VCL_SALBTYPE_HXX
      21             : #define INCLUDED_VCL_SALBTYPE_HXX
      22             : #include <stdio.h>
      23             : #include <string.h>
      24             : #include <stdlib.h>
      25             : #include <tools/debug.hxx>
      26             : #include <vcl/salgtype.hxx>
      27             : #include <tools/color.hxx>
      28             : #include <tools/helpers.hxx>
      29             : #include <tools/solar.h>
      30             : #include <vcl/dllapi.h>
      31             : 
      32             : 
      33             : // - Memory -
      34             : 
      35             : 
      36             : typedef sal_uInt8*      HPBYTE;
      37             : typedef HPBYTE      Scanline;
      38             : typedef const sal_uInt8*    ConstHPBYTE;
      39             : typedef ConstHPBYTE ConstScanline;
      40             : 
      41             : 
      42             : // - Bitmap formats -
      43             : 
      44             : 
      45             : #define BMP_FORMAT_BOTTOM_UP                        0x00000000UL
      46             : #define BMP_FORMAT_TOP_DOWN                         0x80000000UL
      47             : 
      48             : #define BMP_FORMAT_1BIT_MSB_PAL                     0x00000001UL
      49             : #define BMP_FORMAT_1BIT_LSB_PAL                     0x00000002UL
      50             : 
      51             : #define BMP_FORMAT_4BIT_MSN_PAL                     0x00000004UL
      52             : #define BMP_FORMAT_4BIT_LSN_PAL                     0x00000008UL
      53             : 
      54             : #define BMP_FORMAT_8BIT_PAL                         0x00000010UL
      55             : #define BMP_FORMAT_8BIT_TC_MASK                     0x00000020UL
      56             : 
      57             : // #define BMP_FORMAT_16BIT_TC_MASK                 0x00000040UL
      58             : 
      59             : #define BMP_FORMAT_24BIT_TC_BGR                     0x00000080UL
      60             : #define BMP_FORMAT_24BIT_TC_RGB                     0x00000100UL
      61             : #define BMP_FORMAT_24BIT_TC_MASK                    0x00000200UL
      62             : 
      63             : #define BMP_FORMAT_32BIT_TC_ABGR                    0x00000400UL
      64             : #define BMP_FORMAT_32BIT_TC_ARGB                    0x00000800UL
      65             : #define BMP_FORMAT_32BIT_TC_BGRA                    0x00001000UL
      66             : #define BMP_FORMAT_32BIT_TC_RGBA                    0x00002000UL
      67             : #define BMP_FORMAT_32BIT_TC_MASK                    0x00004000UL
      68             : 
      69             : #define BMP_FORMAT_16BIT_TC_MSB_MASK                0x00008000UL
      70             : #define BMP_FORMAT_16BIT_TC_LSB_MASK                0x00010000UL
      71             : 
      72             : #define BMP_SCANLINE_ADJUSTMENT( Mac_nBmpFormat )   ( (Mac_nBmpFormat) & 0x80000000UL )
      73             : #define BMP_SCANLINE_FORMAT( Mac_nBmpFormat )       ( (Mac_nBmpFormat) & 0x7FFFFFFFUL )
      74             : 
      75             : 
      76             : 
      77             : #define MASK_TO_COLOR( d_nVal, d_RM, d_GM, d_BM, d_RS, d_GS, d_BS, d_Col )                          \
      78             : sal_uLong _def_cR = (sal_uInt8) ( d_RS < 0L ? ( (d_nVal) & d_RM ) << -d_RS : ( (d_nVal) & d_RM ) >> d_RS ); \
      79             : sal_uLong _def_cG = (sal_uInt8) ( d_GS < 0L ? ( (d_nVal) & d_GM ) << -d_GS : ( (d_nVal) & d_GM ) >> d_GS ); \
      80             : sal_uLong _def_cB = (sal_uInt8) ( d_BS < 0L ? ( (d_nVal) & d_BM ) << -d_BS : ( (d_nVal) & d_BM ) >> d_BS ); \
      81             : d_Col = BitmapColor( (sal_uInt8) ( _def_cR | ( ( _def_cR & mnROr ) >> mnROrShift ) ),                   \
      82             :                      (sal_uInt8) ( _def_cG | ( ( _def_cG & mnGOr ) >> mnGOrShift ) ),                   \
      83             :                      (sal_uInt8) ( _def_cB | ( ( _def_cB & mnBOr ) >> mnBOrShift ) ) );
      84             : 
      85             : 
      86             : 
      87             : #define COLOR_TO_MASK( d_rCol, d_RM, d_GM, d_BM, d_RS, d_GS, d_BS, d_ALPHA ) \
      88             : ( ( ( ( d_RS < 0L ) ? ( (sal_uInt32) (d_rCol).GetRed() >> -d_RS ) :     \
      89             :     ( (sal_uInt32) (d_rCol).GetRed() << d_RS ) ) & d_RM ) |             \
      90             :   ( ( ( d_GS < 0L ) ? ( (sal_uInt32) (d_rCol).GetGreen() >> -d_GS ) :   \
      91             :     ( (sal_uInt32) (d_rCol).GetGreen() << d_GS ) ) & d_GM ) |           \
      92             :   ( ( ( d_BS < 0L ) ? ( (sal_uInt32) (d_rCol).GetBlue() >> -d_BS ) :    \
      93             :     ( (sal_uInt32) (d_rCol).GetBlue() << d_BS ) ) & d_BM ) | \
      94             :     d_ALPHA )
      95             : 
      96             : 
      97             : // - BitmapColor -
      98             : 
      99             : 
     100             : class Color;
     101             : 
     102             : class VCL_DLLPUBLIC BitmapColor
     103             : {
     104             : private:
     105             : 
     106             : // ATTENTION:
     107             : //   Because the members of this class are accessed via memcpy,
     108             : //   you MUST NOT CHANGE the order of the members or the size of this class!
     109             :     sal_uInt8               mcBlueOrIndex;
     110             :     sal_uInt8               mcGreen;
     111             :     sal_uInt8               mcRed;
     112             :     sal_uInt8               mbIndex;
     113             : 
     114             : public:
     115             : 
     116             :     inline              BitmapColor();
     117             :     inline              BitmapColor( const BitmapColor& rBitmapColor );
     118             :     inline              BitmapColor( sal_uInt8 cRed, sal_uInt8 cGreen, sal_uInt8 cBlue );
     119             :     inline              BitmapColor( const Color& rColor );
     120             :     explicit inline     BitmapColor( sal_uInt8 cIndex );
     121             : 
     122  2246383431 :     inline              ~BitmapColor() {};
     123             : 
     124             :     inline bool         operator==( const BitmapColor& rBitmapColor ) const;
     125             :     inline bool         operator!=( const BitmapColor& rBitmapColor ) const;
     126             :     inline BitmapColor& operator=( const BitmapColor& rBitmapColor );
     127             : 
     128             :     inline bool         IsIndex() const;
     129             : 
     130             :     inline sal_uInt8        GetRed() const;
     131             :     inline void         SetRed( sal_uInt8 cRed );
     132             : 
     133             :     inline sal_uInt8        GetGreen() const;
     134             :     inline void         SetGreen( sal_uInt8 cGreen );
     135             : 
     136             :     inline sal_uInt8        GetBlue() const;
     137             :     inline void         SetBlue( sal_uInt8 cBlue );
     138             : 
     139             :     inline sal_uInt8        GetIndex() const;
     140             :     inline void         SetIndex( sal_uInt8 cIndex );
     141             : 
     142             :     operator            Color() const;
     143             : 
     144             :     inline sal_uInt8         GetBlueOrIndex() const;
     145             : 
     146             :     inline BitmapColor& Invert();
     147             : 
     148             :     inline sal_uInt8        GetLuminance() const;
     149             :     inline BitmapColor& IncreaseLuminance( sal_uInt8 cGreyInc );
     150             :     inline BitmapColor& DecreaseLuminance( sal_uInt8 cGreyDec );
     151             : 
     152             :     inline BitmapColor& Merge( const BitmapColor& rColor, sal_uInt8 cTransparency );
     153             :     inline BitmapColor& Merge( sal_uInt8 cR, sal_uInt8 cG, sal_uInt8 cB, sal_uInt8 cTransparency );
     154             : 
     155             :     inline sal_uLong        GetColorError( const BitmapColor& rBitmapColor ) const;
     156             : };
     157             : 
     158             : 
     159             : // - BitmapPalette -
     160             : 
     161             : 
     162             : class Palette;
     163             : 
     164             : class VCL_DLLPUBLIC BitmapPalette
     165             : {
     166             :     friend class SalBitmap;
     167             :     friend class BitmapAccess;
     168             : 
     169             : private:
     170             : 
     171             :     BitmapColor*                mpBitmapColor;
     172             :     sal_uInt16                  mnCount;
     173             : 
     174             : public:
     175             : 
     176             :     SAL_DLLPRIVATE inline BitmapColor* ImplGetColorBuffer() const;
     177             : 
     178             : 
     179             : public:
     180             : 
     181             :     inline                      BitmapPalette();
     182             :     inline                      BitmapPalette( const BitmapPalette& rBitmapPalette );
     183             :     inline                      BitmapPalette( sal_uInt16 nCount );
     184             :     inline                      ~BitmapPalette();
     185             : 
     186             :     inline BitmapPalette&       operator=( const BitmapPalette& rBitmapPalette );
     187             :     inline bool             operator==( const BitmapPalette& rBitmapPalette ) const;
     188             :     inline bool             operator!=( const BitmapPalette& rBitmapPalette ) const;
     189             :     inline bool             operator!();
     190             : 
     191             :     inline sal_uInt16           GetEntryCount() const;
     192             :     inline void                 SetEntryCount( sal_uInt16 nCount );
     193             : 
     194             :     inline const BitmapColor&   operator[]( sal_uInt16 nIndex ) const;
     195             :     inline BitmapColor&         operator[]( sal_uInt16 nIndex );
     196             : 
     197             :     inline sal_uInt16           GetBestIndex( const BitmapColor& rCol ) const;
     198             :     bool                        IsGreyPalette() const;
     199             : };
     200             : 
     201             : 
     202             : // - ColorMask -
     203             : 
     204             : 
     205             : class VCL_DLLPUBLIC ColorMask
     206             : {
     207             :     sal_uLong               mnRMask;
     208             :     sal_uLong               mnGMask;
     209             :     sal_uLong               mnBMask;
     210             :     long                mnRShift;
     211             :     long                mnGShift;
     212             :     long                mnBShift;
     213             :     sal_uLong               mnROrShift;
     214             :     sal_uLong               mnGOrShift;
     215             :     sal_uLong               mnBOrShift;
     216             :     sal_uLong               mnROr;
     217             :     sal_uLong               mnGOr;
     218             :     sal_uLong               mnBOr;
     219             :     sal_uLong               mnAlphaChannel;
     220             : 
     221             :     SAL_DLLPRIVATE inline long ImplCalcMaskShift( sal_uLong nMask, sal_uLong& rOr, sal_uLong& rOrShift ) const;
     222             : 
     223             : public:
     224             : 
     225             :     inline              ColorMask( sal_uLong nRedMask = 0UL,
     226             :                                    sal_uLong nGreenMask = 0UL,
     227             :                                    sal_uLong nBlueMask = 0UL,
     228             :                                    sal_uLong nAlphaChannel = 0UL );
     229     2336650 :     inline              ~ColorMask() {}
     230             : 
     231             :     inline sal_uLong        GetRedMask() const;
     232             :     inline sal_uLong        GetGreenMask() const;
     233             :     inline sal_uLong        GetBlueMask() const;
     234             : 
     235             :     inline void         GetColorFor8Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
     236             :     inline void         SetColorFor8Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
     237             : 
     238             :     inline void         GetColorFor16BitMSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
     239             :     inline void         SetColorFor16BitMSB( const BitmapColor& rColor, HPBYTE pPixel ) const;
     240             :     inline void         GetColorFor16BitLSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
     241             :     inline void         SetColorFor16BitLSB( const BitmapColor& rColor, HPBYTE pPixel ) const;
     242             : 
     243             :     inline void         GetColorFor24Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
     244             :     inline void         SetColorFor24Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
     245             : 
     246             :     inline void         GetColorFor32Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const;
     247             :     inline void         GetColorAndAlphaFor32Bit( BitmapColor& rColor, sal_uInt8& rAlpha, ConstHPBYTE pPixel ) const;
     248             :     inline void         SetColorFor32Bit( const BitmapColor& rColor, HPBYTE pPixel ) const;
     249             : };
     250             : 
     251             : 
     252             : // - BitmapBuffer -
     253             : 
     254             : 
     255           0 : struct VCL_DLLPUBLIC BitmapBuffer
     256             : {
     257             :     sal_uLong           mnFormat;
     258             :     long            mnWidth;
     259             :     long            mnHeight;
     260             :     long            mnScanlineSize;
     261             :     sal_uInt16          mnBitCount;
     262             :     ColorMask       maColorMask;
     263             :     BitmapPalette   maPalette;
     264             :     sal_uInt8*          mpBits;
     265             : 
     266     1168260 :                     BitmapBuffer(){}
     267     1168260 :                     ~BitmapBuffer() {}
     268             : };
     269             : 
     270             : 
     271             : // - StretchAndConvert -
     272             : 
     273             : 
     274             : VCL_DLLPUBLIC BitmapBuffer* StretchAndConvert(
     275             :     const BitmapBuffer& rSrcBuffer, const SalTwoRect& rTwoRect,
     276             :     sal_uLong nDstBitmapFormat, const BitmapPalette* pDstPal = NULL, const ColorMask* pDstMask = NULL );
     277             : 
     278             : 
     279             : 
     280  1489234423 : inline BitmapColor::BitmapColor() :
     281             :             mcBlueOrIndex   ( 0 ),
     282             :             mcGreen         ( 0 ),
     283             :             mcRed           ( 0 ),
     284  1489234423 :             mbIndex         ( false )
     285             : {
     286  1489234423 : }
     287             : 
     288             : 
     289             : 
     290   289574471 : inline BitmapColor::BitmapColor( sal_uInt8 cRed, sal_uInt8 cGreen, sal_uInt8 cBlue ) :
     291             :             mcBlueOrIndex   ( cBlue ),
     292             :             mcGreen         ( cGreen ),
     293             :             mcRed           ( cRed ),
     294   289574471 :             mbIndex         ( false )
     295             : {
     296   289574471 : }
     297             : 
     298             : 
     299             : 
     300     9678243 : inline BitmapColor::BitmapColor( const BitmapColor& rBitmapColor ) :
     301             :             mcBlueOrIndex   ( rBitmapColor.mcBlueOrIndex ),
     302             :             mcGreen         ( rBitmapColor.mcGreen ),
     303             :             mcRed           ( rBitmapColor.mcRed ),
     304     9678243 :             mbIndex         ( rBitmapColor.mbIndex )
     305             : {
     306     9678243 : }
     307             : 
     308             : 
     309             : 
     310     4178791 : inline BitmapColor::BitmapColor( const Color& rColor ) :
     311     4178791 :             mcBlueOrIndex   ( rColor.GetBlue() ),
     312     4178791 :             mcGreen         ( rColor.GetGreen() ),
     313     4178791 :             mcRed           ( rColor.GetRed() ),
     314    12536373 :             mbIndex         ( 0 )
     315             : {
     316     4178791 : }
     317             : 
     318             : 
     319             : 
     320   453717503 : inline BitmapColor::BitmapColor( sal_uInt8 cIndex ) :
     321             :             mcBlueOrIndex   ( cIndex ),
     322             :             mcGreen         ( 0 ),
     323             :             mcRed           ( 0 ),
     324   453717503 :             mbIndex         ( true )
     325             : {
     326   453717503 : }
     327             : 
     328             : 
     329             : 
     330   364485652 : inline bool BitmapColor::operator==( const BitmapColor& rBitmapColor ) const
     331             : {
     332   438771323 :     return( ( mcBlueOrIndex == rBitmapColor.mcBlueOrIndex ) &&
     333             :             ( mbIndex ? rBitmapColor.mbIndex :
     334   438964122 :             ( mcGreen == rBitmapColor.mcGreen && mcRed == rBitmapColor.mcRed ) ) );
     335             : }
     336             : 
     337             : 
     338             : 
     339    72669242 : inline bool BitmapColor::operator!=( const BitmapColor& rBitmapColor ) const
     340             : {
     341    72669242 :     return !( *this == rBitmapColor );
     342             : }
     343             : 
     344             : 
     345             : 
     346  1208490756 : inline BitmapColor& BitmapColor::operator=( const BitmapColor& rBitmapColor )
     347             : {
     348  1208490756 :     mcBlueOrIndex = rBitmapColor.mcBlueOrIndex;
     349  1208490756 :     mcGreen = rBitmapColor.mcGreen;
     350  1208490756 :     mcRed = rBitmapColor.mcRed;
     351  1208490756 :     mbIndex = rBitmapColor.mbIndex;
     352             : 
     353  1208490756 :     return *this;
     354             : }
     355             : 
     356             : 
     357             : 
     358           0 : inline bool BitmapColor::IsIndex() const
     359             : {
     360           0 :     return mbIndex;
     361             : }
     362             : 
     363             : 
     364             : 
     365  1211707638 : inline sal_uInt8 BitmapColor::GetRed() const
     366             : {
     367             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     368  1211707638 :     return mcRed;
     369             : }
     370             : 
     371             : 
     372             : 
     373   673122738 : inline void BitmapColor::SetRed( sal_uInt8 cRed )
     374             : {
     375             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     376   673122738 :     mcRed = cRed;
     377   673122738 : }
     378             : 
     379             : 
     380             : 
     381  1210047618 : inline sal_uInt8 BitmapColor::GetGreen() const
     382             : {
     383             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     384  1210047618 :     return mcGreen;
     385             : }
     386             : 
     387             : 
     388             : 
     389   673122738 : inline void BitmapColor::SetGreen( sal_uInt8 cGreen )
     390             : {
     391             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     392   673122738 :     mcGreen = cGreen;
     393   673122738 : }
     394             : 
     395             : 
     396             : 
     397  1210047198 : inline sal_uInt8 BitmapColor::GetBlue() const
     398             : {
     399             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     400  1210047198 :     return mcBlueOrIndex;
     401             : }
     402             : 
     403             : 
     404             : 
     405   673122738 : inline void BitmapColor::SetBlue( sal_uInt8 cBlue )
     406             : {
     407             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     408   673122738 :     mcBlueOrIndex = cBlue;
     409   673122738 : }
     410             : 
     411             : 
     412             : 
     413   103864283 : inline sal_uInt8 BitmapColor::GetIndex() const
     414             : {
     415             :     DBG_ASSERT( mbIndex, "Pixel represents color values!" );
     416   103864283 :     return mcBlueOrIndex;
     417             : }
     418             : 
     419             : 
     420             : 
     421     4061698 : inline void BitmapColor::SetIndex( sal_uInt8 cIndex )
     422             : {
     423             :     DBG_ASSERT( mbIndex, "Pixel represents color values!" );
     424     4061698 :     mcBlueOrIndex = cIndex;
     425     4061698 : }
     426             : 
     427             : 
     428             : 
     429         313 : inline BitmapColor::operator Color() const
     430             : {
     431             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     432         313 :     return Color( mcRed, mcGreen, mcBlueOrIndex );
     433             : }
     434             : 
     435             : 
     436             : 
     437   356248764 : inline sal_uInt8 BitmapColor::GetBlueOrIndex() const
     438             : {
     439             :     // #i47518# Yield a value regardless of mbIndex
     440   356248764 :     return mcBlueOrIndex;
     441             : }
     442             : 
     443             : 
     444             : 
     445       10296 : inline BitmapColor& BitmapColor::Invert()
     446             : {
     447             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     448       10296 :     mcBlueOrIndex = ~mcBlueOrIndex, mcGreen = ~mcGreen, mcRed = ~mcRed;
     449             : 
     450       10296 :     return *this;
     451             : }
     452             : 
     453             : 
     454             : 
     455     5050935 : inline sal_uInt8 BitmapColor::GetLuminance() const
     456             : {
     457             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     458     5050935 :     return( (sal_uInt8) ( ( mcBlueOrIndex * 28UL + mcGreen * 151UL + mcRed * 77UL ) >> 8UL ) );
     459             : }
     460             : 
     461             : 
     462             : 
     463             : inline BitmapColor& BitmapColor::IncreaseLuminance( sal_uInt8 cGreyInc )
     464             : {
     465             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     466             :     mcBlueOrIndex = (sal_uInt8) MinMax( (long) mcBlueOrIndex + cGreyInc, 0L, 255L );
     467             :     mcGreen = (sal_uInt8) MinMax( (long) mcGreen + cGreyInc, 0L, 255L );
     468             :     mcRed = (sal_uInt8) MinMax( (long) mcRed + cGreyInc, 0L, 255L );
     469             : 
     470             :     return *this;
     471             : }
     472             : 
     473             : 
     474             : 
     475             : inline BitmapColor& BitmapColor::DecreaseLuminance( sal_uInt8 cGreyDec )
     476             : {
     477             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     478             :     mcBlueOrIndex = (sal_uInt8) MinMax( (long) mcBlueOrIndex - cGreyDec, 0L, 255L );
     479             :     mcGreen = (sal_uInt8) MinMax( (long) mcGreen - cGreyDec, 0L, 255L );
     480             :     mcRed = (sal_uInt8) MinMax( (long) mcRed - cGreyDec, 0L, 255L );
     481             : 
     482             :     return *this;
     483             : }
     484             : 
     485             : 
     486             : 
     487    26084628 : inline BitmapColor& BitmapColor::Merge( const BitmapColor& rBitmapColor, sal_uInt8 cTransparency )
     488             : {
     489             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     490             :     DBG_ASSERT( !rBitmapColor.mbIndex, "Pixel represents index into colortable!" );
     491    26084628 :     mcBlueOrIndex = COLOR_CHANNEL_MERGE( mcBlueOrIndex, rBitmapColor.mcBlueOrIndex, cTransparency );
     492    26084628 :     mcGreen = COLOR_CHANNEL_MERGE( mcGreen, rBitmapColor.mcGreen, cTransparency );
     493    26084628 :     mcRed = COLOR_CHANNEL_MERGE( mcRed, rBitmapColor.mcRed, cTransparency );
     494             : 
     495    26084628 :     return *this;
     496             : }
     497             : 
     498             : 
     499             : 
     500   140750943 : inline BitmapColor& BitmapColor::Merge( sal_uInt8 cR, sal_uInt8 cG, sal_uInt8 cB, sal_uInt8 cTransparency )
     501             : {
     502             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     503   140750943 :     mcBlueOrIndex = COLOR_CHANNEL_MERGE( mcBlueOrIndex, cB, cTransparency );
     504   140750943 :     mcGreen = COLOR_CHANNEL_MERGE( mcGreen, cG, cTransparency );
     505   140750943 :     mcRed = COLOR_CHANNEL_MERGE( mcRed, cR, cTransparency );
     506             : 
     507   140750943 :     return *this;
     508             : }
     509             : 
     510             : 
     511             : 
     512       72932 : inline sal_uLong BitmapColor::GetColorError( const BitmapColor& rBitmapColor ) const
     513             : {
     514             :     DBG_ASSERT( !mbIndex, "Pixel represents index into colortable!" );
     515             :     DBG_ASSERT( !rBitmapColor.mbIndex, "Pixel represents index into colortable!" );
     516      145864 :     return( (sal_uLong) ( labs( mcBlueOrIndex - rBitmapColor.mcBlueOrIndex ) +
     517      145864 :                       labs( mcGreen - rBitmapColor.mcGreen ) +
     518      145864 :                       labs( mcRed - rBitmapColor.mcRed ) ) );
     519             : }
     520             : 
     521             : 
     522             : 
     523     1282643 : inline BitmapPalette::BitmapPalette() :
     524             :             mpBitmapColor   ( NULL ),
     525     1282643 :             mnCount         ( 0 )
     526             : {
     527     1282643 : }
     528             : 
     529             : 
     530             : 
     531          34 : inline BitmapPalette::BitmapPalette( const BitmapPalette& rBitmapPalette ) :
     532          34 :             mnCount( rBitmapPalette.mnCount )
     533             : {
     534          34 :     if( mnCount )
     535             :     {
     536          34 :         const sal_uLong nSize = mnCount * sizeof( BitmapColor );
     537          34 :         mpBitmapColor = (BitmapColor*) new sal_uInt8[ nSize ];
     538          34 :         memcpy( mpBitmapColor, rBitmapPalette.mpBitmapColor, nSize );
     539             :     }
     540             :     else
     541           0 :         mpBitmapColor = NULL;
     542          34 : }
     543             : 
     544             : 
     545             : 
     546         332 : inline BitmapPalette::BitmapPalette( sal_uInt16 nCount ) :
     547         332 :             mnCount( nCount )
     548             : {
     549         332 :     if( mnCount )
     550             :     {
     551         332 :         const sal_uLong nSize = mnCount * sizeof( BitmapColor );
     552         332 :         mpBitmapColor = (BitmapColor*) new sal_uInt8[ nSize ];
     553         332 :         memset( mpBitmapColor, 0, nSize );
     554             :     }
     555             :     else
     556           0 :         mpBitmapColor = NULL;
     557         332 : }
     558             : 
     559             : 
     560             : 
     561     1283009 : inline BitmapPalette::~BitmapPalette()
     562             : {
     563     1283009 :     delete[] (sal_uInt8*) mpBitmapColor;
     564     1283009 : }
     565             : 
     566             : 
     567             : 
     568        1136 : inline BitmapPalette& BitmapPalette::operator=( const BitmapPalette& rBitmapPalette )
     569             : {
     570        1136 :     delete[] (sal_uInt8*) mpBitmapColor;
     571        1136 :     mnCount = rBitmapPalette.mnCount;
     572             : 
     573        1136 :     if( mnCount )
     574             :     {
     575        1136 :         const sal_uLong nSize = mnCount * sizeof( BitmapColor );
     576        1136 :         mpBitmapColor = (BitmapColor*) new sal_uInt8[ nSize ];
     577        1136 :         memcpy( mpBitmapColor, rBitmapPalette.mpBitmapColor, nSize );
     578             :     }
     579             :     else
     580           0 :         mpBitmapColor = NULL;
     581             : 
     582        1136 :     return *this;
     583             : }
     584             : 
     585             : 
     586             : 
     587      266563 : inline bool BitmapPalette::operator==( const BitmapPalette& rBitmapPalette ) const
     588             : {
     589      266563 :     bool bRet = false;
     590             : 
     591      266563 :     if( rBitmapPalette.mnCount == mnCount )
     592             :     {
     593      266563 :         bRet = true;
     594             : 
     595    68502611 :         for( sal_uInt16 i = 0; i < mnCount; i++ )
     596             :         {
     597    68236064 :             if( mpBitmapColor[ i ] != rBitmapPalette.mpBitmapColor[ i ] )
     598             :             {
     599          16 :                 bRet = false;
     600          16 :                 break;
     601             :             }
     602             :         }
     603             :     }
     604             : 
     605      266563 :     return bRet;
     606             : }
     607             : 
     608             : 
     609             : 
     610      265994 : inline bool BitmapPalette::operator!=( const BitmapPalette& rBitmapPalette ) const
     611             : {
     612      265994 :     return !( *this == rBitmapPalette );
     613             : }
     614             : 
     615             : 
     616             : 
     617   850206208 : inline bool BitmapPalette::operator!()
     618             : {
     619   850206208 :     return( !mnCount || !mpBitmapColor );
     620             : }
     621             : 
     622             : 
     623             : 
     624     1500825 : inline sal_uInt16 BitmapPalette::GetEntryCount() const
     625             : {
     626     1500825 :     return mnCount;
     627             : }
     628             : 
     629             : 
     630             : 
     631      805299 : inline void BitmapPalette::SetEntryCount( sal_uInt16 nCount )
     632             : {
     633      805299 :     if( !nCount )
     634             :     {
     635           0 :         delete[] (sal_uInt8*) mpBitmapColor;
     636           0 :         mpBitmapColor = NULL;
     637           0 :         mnCount = 0;
     638             :     }
     639      805299 :     else if( nCount != mnCount )
     640             :     {
     641      793256 :         const sal_uLong nNewSize = nCount * sizeof( BitmapColor );
     642      793256 :         const sal_uLong nMinSize = std::min( mnCount, nCount ) * sizeof( BitmapColor );
     643      793256 :         sal_uInt8*      pNewColor = new sal_uInt8[ nNewSize ];
     644             : 
     645      793256 :         if ( nMinSize && mpBitmapColor )
     646        6025 :             memcpy( pNewColor, mpBitmapColor, nMinSize );
     647      793256 :         delete[] (sal_uInt8*) mpBitmapColor;
     648      793256 :         memset( pNewColor + nMinSize, 0, nNewSize - nMinSize );
     649      793256 :         mpBitmapColor = (BitmapColor*) pNewColor;
     650      793256 :         mnCount = nCount;
     651             :     }
     652      805299 : }
     653             : 
     654             : 
     655             : 
     656    21121737 : inline const BitmapColor& BitmapPalette::operator[]( sal_uInt16 nIndex ) const
     657             : {
     658             :     DBG_ASSERT( nIndex < mnCount, "Palette index is out of range!" );
     659    21121737 :     return mpBitmapColor[ nIndex ];
     660             : }
     661             : 
     662             : 
     663             : 
     664   614675292 : inline BitmapColor& BitmapPalette::operator[]( sal_uInt16 nIndex )
     665             : {
     666             :     DBG_ASSERT( nIndex < mnCount, "Palette index is out of range!" );
     667   614675292 :     return mpBitmapColor[ nIndex ];
     668             : }
     669             : 
     670             : 
     671             : 
     672        1236 : inline BitmapColor* BitmapPalette::ImplGetColorBuffer() const
     673             : {
     674             :     DBG_ASSERT( mpBitmapColor, "No color buffer available!" );
     675        1236 :     return mpBitmapColor;
     676             : }
     677             : 
     678             : 
     679     2305881 : inline sal_uInt16 BitmapPalette::GetBestIndex( const BitmapColor& rCol ) const
     680             : {
     681     2305881 :     sal_uInt16 nRetIndex = 0;
     682             : 
     683     2305881 :     if( mpBitmapColor && mnCount )
     684             :     {
     685     2305881 :         bool bFound = false;
     686             : 
     687   291208493 :         for( long j = 0L; ( j < mnCount ) && !bFound; j++ )
     688   288902612 :             if( rCol == mpBitmapColor[ j ] )
     689     2305461 :                 nRetIndex = ( (sal_uInt16) j ), bFound = true;
     690             : 
     691     2305881 :         if( !bFound )
     692             :         {
     693         420 :             long nActErr, nLastErr = rCol.GetColorError( mpBitmapColor[ nRetIndex = mnCount - 1 ] );
     694             : 
     695       72932 :             for( long i = nRetIndex - 1; i >= 0L; i-- )
     696       72512 :                 if ( ( nActErr = rCol.GetColorError( mpBitmapColor[ i ] ) ) < nLastErr )
     697         248 :                     nLastErr = nActErr, nRetIndex = (sal_uInt16) i;
     698             :         }
     699             :     }
     700             : 
     701     2305881 :     return nRetIndex;
     702             : }
     703             : 
     704             : 
     705             : 
     706     2336650 : inline ColorMask::ColorMask( sal_uLong nRedMask,
     707             :                              sal_uLong nGreenMask,
     708             :                              sal_uLong nBlueMask,
     709             :                              sal_uLong nAlphaChannel ) :
     710             :             mnRMask( nRedMask ),
     711             :             mnGMask( nGreenMask ),
     712             :             mnBMask( nBlueMask ),
     713             :             mnROrShift( 0L ),
     714             :             mnGOrShift( 0L ),
     715             :             mnBOrShift( 0L ),
     716             :             mnROr( 0L ),
     717             :             mnGOr( 0L ),
     718             :             mnBOr( 0L ),
     719     2336650 :             mnAlphaChannel( nAlphaChannel )
     720             : {
     721     2336650 :     mnRShift = ( mnRMask ? ImplCalcMaskShift( mnRMask, mnROr, mnROrShift ) : 0L );
     722     2336650 :     mnGShift = ( mnGMask ? ImplCalcMaskShift( mnGMask, mnGOr, mnGOrShift ) : 0L );
     723     2336650 :     mnBShift = ( mnBMask ? ImplCalcMaskShift( mnBMask, mnBOr, mnBOrShift ) : 0L );
     724     2336650 : }
     725             : 
     726             : 
     727             : 
     728         372 : inline long ColorMask::ImplCalcMaskShift( sal_uLong nMask, sal_uLong& rOr, sal_uLong& rOrShift ) const
     729             : {
     730             :     long    nShift;
     731             :     long    nRet;
     732         372 :     sal_uLong   nLen = 0UL;
     733             : 
     734             :     // from which bit starts the mask?
     735         372 :     for( nShift = 31L; ( nShift >= 0L ) && !( nMask & ( 1 << (sal_uLong) nShift ) ); nShift-- )
     736             :     {}
     737             : 
     738         372 :     nRet = nShift;
     739             : 
     740             :     // XXX determine number of bits set => walk right until null
     741        3544 :     while( ( nShift >= 0L ) && ( nMask & ( 1 << (sal_uLong) nShift ) ) )
     742             :     {
     743        2800 :         nShift--;
     744        2800 :         nLen++;
     745             :     }
     746             : 
     747         372 :     rOrShift = 8L - nLen;
     748         372 :     rOr = (sal_uInt8) ( ( 0xffUL >> nLen ) << rOrShift );
     749             : 
     750         372 :     return( nRet -= 7 );
     751             : }
     752             : 
     753             : 
     754             : 
     755        2292 : inline sal_uLong ColorMask::GetRedMask() const
     756             : {
     757        2292 :     return mnRMask;
     758             : }
     759             : 
     760             : 
     761             : 
     762        2292 : inline sal_uLong ColorMask::GetGreenMask() const
     763             : {
     764        2292 :     return mnGMask;
     765             : }
     766             : 
     767             : 
     768             : 
     769        2292 : inline sal_uLong ColorMask::GetBlueMask() const
     770             : {
     771        2292 :     return mnBMask;
     772             : }
     773             : 
     774             : 
     775             : 
     776           0 : inline void ColorMask::GetColorFor8Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
     777             : {
     778           0 :     const sal_uInt32 nVal = *pPixel;
     779           0 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     780           0 : }
     781             : 
     782             : 
     783             : 
     784           0 : inline void ColorMask::SetColorFor8Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
     785             : {
     786           0 :     *pPixel = (sal_uInt8) COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, mnAlphaChannel );
     787           0 : }
     788             : 
     789             : 
     790             : 
     791           0 : inline void ColorMask::GetColorFor16BitMSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const
     792             : {
     793           0 :     const sal_uInt32 nVal = pPixel[ 1 ] | ( (sal_uInt32) pPixel[ 0 ] << 8UL );
     794             : 
     795           0 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     796           0 : }
     797             : 
     798             : 
     799             : 
     800           0 : inline void ColorMask::SetColorFor16BitMSB( const BitmapColor& rColor, HPBYTE pPixel ) const
     801             : {
     802           0 :     const sal_uInt16 nVal = (sal_uInt16)COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, mnAlphaChannel );
     803             : 
     804           0 :     pPixel[ 0 ] = (sal_uInt8)(nVal >> 8U);
     805           0 :     pPixel[ 1 ] = (sal_uInt8) nVal;
     806           0 : }
     807             : 
     808             : 
     809             : 
     810     3002400 : inline void ColorMask::GetColorFor16BitLSB( BitmapColor& rColor, ConstHPBYTE pPixel ) const
     811             : {
     812     3002400 :     const sal_uInt32 nVal = pPixel[ 0 ] | ( (sal_uInt32) pPixel[ 1 ] << 8UL );
     813             : 
     814     3002400 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     815     3002400 : }
     816             : 
     817             : 
     818             : 
     819      100416 : inline void ColorMask::SetColorFor16BitLSB( const BitmapColor& rColor, HPBYTE pPixel ) const
     820             : {
     821      100416 :     const sal_uInt16 nVal = (sal_uInt16)COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, mnAlphaChannel );
     822             : 
     823      100416 :     pPixel[ 0 ] = (sal_uInt8) nVal;
     824      100416 :     pPixel[ 1 ] = (sal_uInt8)(nVal >> 8U);
     825      100416 : }
     826             : 
     827             : 
     828             : 
     829             : 
     830           0 : inline void ColorMask::GetColorFor24Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
     831             : {
     832           0 :     const sal_uInt32 nVal = pPixel[ 0 ] | ( (sal_uInt32) pPixel[ 1 ] << 8UL ) | ( (sal_uInt32) pPixel[ 2 ] << 16UL );
     833           0 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     834           0 : }
     835             : 
     836             : 
     837             : 
     838           0 : inline void ColorMask::SetColorFor24Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
     839             : {
     840           0 :     const sal_uInt32 nVal = COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, mnAlphaChannel );
     841           0 :     pPixel[ 0 ] = (sal_uInt8) nVal; pPixel[ 1 ] = (sal_uInt8) ( nVal >> 8UL ); pPixel[ 2 ] = (sal_uInt8) ( nVal >> 16UL );
     842           0 : }
     843             : 
     844             : 
     845             : 
     846     1057634 : inline void ColorMask::GetColorFor32Bit( BitmapColor& rColor, ConstHPBYTE pPixel ) const
     847             : {
     848     2115268 :     const sal_uInt32 nVal = (sal_uInt32) pPixel[ 0 ] | ( (sal_uInt32) pPixel[ 1 ] << 8UL ) |
     849     2115268 :                         ( (sal_uInt32) pPixel[ 2 ] << 16UL ) | ( (sal_uInt32) pPixel[ 3 ] << 24UL );
     850             : 
     851     1057634 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     852     1057634 : }
     853             : 
     854             : 
     855             : 
     856           0 : inline void ColorMask::GetColorAndAlphaFor32Bit( BitmapColor& rColor, sal_uInt8& rAlpha, ConstHPBYTE pPixel ) const
     857             : {
     858           0 :     const sal_uInt32 nVal = (sal_uInt32) pPixel[ 0 ] | ( (sal_uInt32) pPixel[ 1 ] << 8UL ) |
     859           0 :                         ( (sal_uInt32) pPixel[ 2 ] << 16UL ) | ( (sal_uInt32) pPixel[ 3 ] << 24UL );
     860           0 :     rAlpha = (sal_uInt8)(nVal >> 24);
     861             : 
     862           0 :     MASK_TO_COLOR( nVal, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, rColor );
     863           0 : }
     864             : 
     865             : 
     866             : 
     867           0 : inline void ColorMask::SetColorFor32Bit( const BitmapColor& rColor, HPBYTE pPixel ) const
     868             : {
     869           0 :     const sal_uInt32 nVal = COLOR_TO_MASK( rColor, mnRMask, mnGMask, mnBMask, mnRShift, mnGShift, mnBShift, mnAlphaChannel );
     870           0 :     pPixel[ 0 ] = (sal_uInt8) nVal; pPixel[ 1 ] = (sal_uInt8) ( nVal >> 8UL );
     871           0 :     pPixel[ 2 ] = (sal_uInt8) ( nVal >> 16UL ); pPixel[ 3 ] = (sal_uInt8) ( nVal >> 24UL );
     872           0 : }
     873             : 
     874             : #endif // INCLUDED_VCL_SALBTYPE_HXX
     875             : 
     876             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10