1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_vcl.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <vcl/salbtype.hxx> 28cdf0e10cSrcweir #include <vcl/bitmap.hxx> 29cdf0e10cSrcweir #include <vcl/bmpacc.hxx> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <impbmp.hxx> 32cdf0e10cSrcweir 33cdf0e10cSrcweir #include <string.h> 34cdf0e10cSrcweir 35cdf0e10cSrcweir // -------------------- 36cdf0e10cSrcweir // - BitmapReadAccess - 37cdf0e10cSrcweir // -------------------- 38cdf0e10cSrcweir 39cdf0e10cSrcweir BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap, sal_Bool bModify ) : 40cdf0e10cSrcweir mpBuffer ( NULL ), 41cdf0e10cSrcweir mpScanBuf ( NULL ), 42cdf0e10cSrcweir mFncGetPixel ( NULL ), 43cdf0e10cSrcweir mFncSetPixel ( NULL ), 44cdf0e10cSrcweir mbModify ( bModify ) 45cdf0e10cSrcweir { 46cdf0e10cSrcweir ImplCreate( rBitmap ); 47cdf0e10cSrcweir } 48cdf0e10cSrcweir 49cdf0e10cSrcweir // ------------------------------------------------------------------ 50cdf0e10cSrcweir 51cdf0e10cSrcweir BitmapReadAccess::BitmapReadAccess( Bitmap& rBitmap ) : 52cdf0e10cSrcweir mpBuffer ( NULL ), 53cdf0e10cSrcweir mpScanBuf ( NULL ), 54cdf0e10cSrcweir mFncGetPixel ( NULL ), 55cdf0e10cSrcweir mFncSetPixel ( NULL ), 56cdf0e10cSrcweir mbModify ( sal_False ) 57cdf0e10cSrcweir { 58cdf0e10cSrcweir ImplCreate( rBitmap ); 59cdf0e10cSrcweir } 60cdf0e10cSrcweir 61cdf0e10cSrcweir // ------------------------------------------------------------------ 62cdf0e10cSrcweir 63cdf0e10cSrcweir BitmapReadAccess::~BitmapReadAccess() 64cdf0e10cSrcweir { 65cdf0e10cSrcweir ImplDestroy(); 66cdf0e10cSrcweir } 67cdf0e10cSrcweir 68cdf0e10cSrcweir // ------------------------------------------------------------------ 69cdf0e10cSrcweir 70cdf0e10cSrcweir void BitmapReadAccess::ImplCreate( Bitmap& rBitmap ) 71cdf0e10cSrcweir { 72cdf0e10cSrcweir ImpBitmap* pImpBmp = rBitmap.ImplGetImpBitmap(); 73cdf0e10cSrcweir 74cdf0e10cSrcweir DBG_ASSERT( pImpBmp, "Forbidden Access to empty bitmap!" ); 75cdf0e10cSrcweir 76cdf0e10cSrcweir if( pImpBmp ) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir if( mbModify && !maBitmap.ImplGetImpBitmap() ) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir rBitmap.ImplMakeUnique(); 81cdf0e10cSrcweir pImpBmp = rBitmap.ImplGetImpBitmap(); 82cdf0e10cSrcweir } 83cdf0e10cSrcweir else 84cdf0e10cSrcweir { 85cdf0e10cSrcweir DBG_ASSERT( !mbModify || pImpBmp->ImplGetRefCount() == 2, 86cdf0e10cSrcweir "Unpredictable results: bitmap is referenced more than once!" ); 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir mpBuffer = pImpBmp->ImplAcquireBuffer( !mbModify ); 90cdf0e10cSrcweir 91cdf0e10cSrcweir if( !mpBuffer ) 92cdf0e10cSrcweir { 93cdf0e10cSrcweir ImpBitmap* pNewImpBmp = new ImpBitmap; 94cdf0e10cSrcweir 95cdf0e10cSrcweir if( pNewImpBmp->ImplCreate( *pImpBmp, rBitmap.GetBitCount() ) ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir pImpBmp = pNewImpBmp; 98cdf0e10cSrcweir rBitmap.ImplSetImpBitmap( pImpBmp ); 99cdf0e10cSrcweir mpBuffer = pImpBmp->ImplAcquireBuffer( !mbModify ); 100cdf0e10cSrcweir } 101cdf0e10cSrcweir else 102cdf0e10cSrcweir delete pNewImpBmp; 103cdf0e10cSrcweir } 104cdf0e10cSrcweir 105cdf0e10cSrcweir if( mpBuffer ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir const long nHeight = mpBuffer->mnHeight; 108cdf0e10cSrcweir Scanline pTmpLine = mpBuffer->mpBits; 109cdf0e10cSrcweir 110cdf0e10cSrcweir mpScanBuf = new Scanline[ nHeight ]; 111cdf0e10cSrcweir maColorMask = mpBuffer->maColorMask; 112cdf0e10cSrcweir 113cdf0e10cSrcweir if( BMP_SCANLINE_ADJUSTMENT( mpBuffer->mnFormat ) == BMP_FORMAT_TOP_DOWN ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir for( long nY = 0L; nY < nHeight; nY++, pTmpLine += mpBuffer->mnScanlineSize ) 116cdf0e10cSrcweir mpScanBuf[ nY ] = pTmpLine; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir else 119cdf0e10cSrcweir { 120cdf0e10cSrcweir for( long nY = nHeight - 1; nY >= 0; nY--, pTmpLine += mpBuffer->mnScanlineSize ) 121cdf0e10cSrcweir mpScanBuf[ nY ] = pTmpLine; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir if( !ImplSetAccessPointers( BMP_SCANLINE_FORMAT( mpBuffer->mnFormat ) ) ) 125cdf0e10cSrcweir { 126cdf0e10cSrcweir delete[] mpScanBuf; 127cdf0e10cSrcweir mpScanBuf = NULL; 128cdf0e10cSrcweir 129cdf0e10cSrcweir pImpBmp->ImplReleaseBuffer( mpBuffer, !mbModify ); 130cdf0e10cSrcweir mpBuffer = NULL; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir else 133cdf0e10cSrcweir maBitmap = rBitmap; 134cdf0e10cSrcweir } 135cdf0e10cSrcweir } 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir // ------------------------------------------------------------------ 139cdf0e10cSrcweir 140cdf0e10cSrcweir void BitmapReadAccess::ImplDestroy() 141cdf0e10cSrcweir { 142cdf0e10cSrcweir ImpBitmap* pImpBmp = maBitmap.ImplGetImpBitmap(); 143cdf0e10cSrcweir 144cdf0e10cSrcweir delete[] mpScanBuf; 145cdf0e10cSrcweir mpScanBuf = NULL; 146cdf0e10cSrcweir 147cdf0e10cSrcweir if( mpBuffer && pImpBmp ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir pImpBmp->ImplReleaseBuffer( mpBuffer, !mbModify ); 150cdf0e10cSrcweir mpBuffer = NULL; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir } 153cdf0e10cSrcweir 154cdf0e10cSrcweir // ------------------------------------------------------------------ 155cdf0e10cSrcweir 156cdf0e10cSrcweir sal_Bool BitmapReadAccess::ImplSetAccessPointers( sal_uLong nFormat ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir sal_Bool bRet = sal_True; 159cdf0e10cSrcweir 160cdf0e10cSrcweir switch( nFormat ) 161cdf0e10cSrcweir { 162cdf0e10cSrcweir CASE_FORMAT( _1BIT_MSB_PAL ) 163cdf0e10cSrcweir CASE_FORMAT( _1BIT_LSB_PAL ) 164cdf0e10cSrcweir CASE_FORMAT( _4BIT_MSN_PAL ) 165cdf0e10cSrcweir CASE_FORMAT( _4BIT_LSN_PAL ) 166cdf0e10cSrcweir CASE_FORMAT( _8BIT_PAL ) 167cdf0e10cSrcweir CASE_FORMAT( _8BIT_TC_MASK ) 168cdf0e10cSrcweir CASE_FORMAT( _16BIT_TC_MSB_MASK ) 169cdf0e10cSrcweir CASE_FORMAT( _16BIT_TC_LSB_MASK ) 170cdf0e10cSrcweir CASE_FORMAT( _24BIT_TC_BGR ) 171cdf0e10cSrcweir CASE_FORMAT( _24BIT_TC_RGB ) 172cdf0e10cSrcweir CASE_FORMAT( _24BIT_TC_MASK ) 173cdf0e10cSrcweir CASE_FORMAT( _32BIT_TC_ABGR ) 174cdf0e10cSrcweir CASE_FORMAT( _32BIT_TC_ARGB ) 175cdf0e10cSrcweir CASE_FORMAT( _32BIT_TC_BGRA ) 176cdf0e10cSrcweir CASE_FORMAT( _32BIT_TC_RGBA ) 177cdf0e10cSrcweir CASE_FORMAT( _32BIT_TC_MASK ) 178cdf0e10cSrcweir 179cdf0e10cSrcweir default: 180cdf0e10cSrcweir bRet = sal_False; 181cdf0e10cSrcweir break; 182cdf0e10cSrcweir } 183cdf0e10cSrcweir 184cdf0e10cSrcweir return bRet; 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir // ------------------------------------------------------------------ 188cdf0e10cSrcweir 189cdf0e10cSrcweir void BitmapReadAccess::ImplZeroInitUnusedBits() 190cdf0e10cSrcweir { 191cdf0e10cSrcweir const sal_uInt32 nWidth = Width(), nHeight = Height(), nScanSize = GetScanlineSize(); 192cdf0e10cSrcweir 193cdf0e10cSrcweir if( nWidth && nHeight && nScanSize && GetBuffer() ) 194cdf0e10cSrcweir { 195cdf0e10cSrcweir sal_uInt32 nBits; 196cdf0e10cSrcweir bool bMsb; 197cdf0e10cSrcweir 198cdf0e10cSrcweir const sal_uLong nScanlineFormat = GetScanlineFormat(); 199cdf0e10cSrcweir switch( nScanlineFormat ) 200cdf0e10cSrcweir { 201cdf0e10cSrcweir case( BMP_FORMAT_1BIT_MSB_PAL ): 202cdf0e10cSrcweir nBits = 1; 203cdf0e10cSrcweir bMsb = true; 204cdf0e10cSrcweir break; 205cdf0e10cSrcweir 206cdf0e10cSrcweir case( BMP_FORMAT_1BIT_LSB_PAL ): 207cdf0e10cSrcweir nBits = 1; 208cdf0e10cSrcweir bMsb = false; 209cdf0e10cSrcweir break; 210cdf0e10cSrcweir 211cdf0e10cSrcweir case( BMP_FORMAT_4BIT_MSN_PAL ): 212cdf0e10cSrcweir nBits = 4; 213cdf0e10cSrcweir bMsb = true; 214cdf0e10cSrcweir break; 215cdf0e10cSrcweir 216cdf0e10cSrcweir case( BMP_FORMAT_4BIT_LSN_PAL ): 217cdf0e10cSrcweir nBits = 4; 218cdf0e10cSrcweir bMsb = false; 219cdf0e10cSrcweir break; 220cdf0e10cSrcweir 221cdf0e10cSrcweir case( BMP_FORMAT_8BIT_PAL ): 222cdf0e10cSrcweir case( BMP_FORMAT_8BIT_TC_MASK ): 223cdf0e10cSrcweir bMsb = true; 224cdf0e10cSrcweir nBits = 8; 225cdf0e10cSrcweir break; 226cdf0e10cSrcweir 227cdf0e10cSrcweir case( BMP_FORMAT_16BIT_TC_MSB_MASK ): 228cdf0e10cSrcweir case( BMP_FORMAT_16BIT_TC_LSB_MASK ): 229cdf0e10cSrcweir bMsb = true; 230cdf0e10cSrcweir nBits = 16; 231cdf0e10cSrcweir break; 232cdf0e10cSrcweir 233cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_BGR ): 234cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_RGB ): 235cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_MASK ): 236cdf0e10cSrcweir bMsb = true; 237cdf0e10cSrcweir nBits = 24; 238cdf0e10cSrcweir break; 239cdf0e10cSrcweir 240cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_ABGR ): 241cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_ARGB ): 242cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_BGRA ): 243cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_RGBA ): 244cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_MASK ): 245cdf0e10cSrcweir bMsb = true; 246cdf0e10cSrcweir nBits = 32; 247cdf0e10cSrcweir break; 248cdf0e10cSrcweir 249cdf0e10cSrcweir default: 250cdf0e10cSrcweir { 251cdf0e10cSrcweir DBG_ERROR( "BitmapWriteAccess::ZeroInitUnusedBits: Unsupported pixel format"); 252cdf0e10cSrcweir nBits = 0; 253cdf0e10cSrcweir bMsb = true; 254cdf0e10cSrcweir } 255cdf0e10cSrcweir break; 256cdf0e10cSrcweir } 257cdf0e10cSrcweir 258cdf0e10cSrcweir nBits *= nWidth; 259cdf0e10cSrcweir if( nScanSize % 4 || !bMsb ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir DBG_ASSERT( 8*nScanSize >= nBits, 262cdf0e10cSrcweir "BitmapWriteAccess::ZeroInitUnusedBits: span size smaller than width?!"); 263cdf0e10cSrcweir const sal_uInt32 nLeftOverBits = 8*sizeof(sal_uInt8)*nScanSize - nBits; 264cdf0e10cSrcweir if( nLeftOverBits != 0 ) // else there is really nothing to do 265cdf0e10cSrcweir { 266cdf0e10cSrcweir const sal_uInt32 nBytes = (nLeftOverBits + 7U) >> 3U; 267cdf0e10cSrcweir sal_uInt8 nMask; 268cdf0e10cSrcweir 269cdf0e10cSrcweir if( bMsb ) 270cdf0e10cSrcweir nMask = static_cast<sal_uInt8>(0xffU << (nLeftOverBits & 3UL)); 271cdf0e10cSrcweir else 272cdf0e10cSrcweir nMask = static_cast<sal_uInt8>(0xffU >> (nLeftOverBits & 3UL)); 273cdf0e10cSrcweir 274cdf0e10cSrcweir sal_uInt8* pLastBytes = (sal_uInt8*)GetBuffer() + ( nScanSize - nBytes ); 275cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nHeight; i++, pLastBytes += nScanSize ) 276cdf0e10cSrcweir { 277cdf0e10cSrcweir *pLastBytes &= nMask; 278cdf0e10cSrcweir for( sal_uInt32 j = 1; j < nBytes; j++ ) 279cdf0e10cSrcweir pLastBytes[j] = 0; 280cdf0e10cSrcweir } 281cdf0e10cSrcweir } 282cdf0e10cSrcweir } 283cdf0e10cSrcweir else if( nBits & 0x1f ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir sal_uInt32 nMask = 0xffffffff << ( ( nScanSize << 3 ) - nBits ); 286cdf0e10cSrcweir sal_uInt8* pLast4Bytes = (sal_uInt8*) GetBuffer() + ( nScanSize - 4 ); 287cdf0e10cSrcweir 288cdf0e10cSrcweir #ifdef OSL_LITENDIAN 289cdf0e10cSrcweir nMask = SWAPLONG( nMask ); 290cdf0e10cSrcweir #endif 291cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nHeight; i++, pLast4Bytes += nScanSize ) 292cdf0e10cSrcweir ( *(sal_uInt32*) pLast4Bytes ) &= nMask; 293cdf0e10cSrcweir } 294cdf0e10cSrcweir } 295cdf0e10cSrcweir } 296cdf0e10cSrcweir 297cdf0e10cSrcweir // ------------------------------------------------------------------ 298cdf0e10cSrcweir 299cdf0e10cSrcweir void BitmapReadAccess::Flush() 300cdf0e10cSrcweir { 301cdf0e10cSrcweir ImplDestroy(); 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir // ------------------------------------------------------------------ 305cdf0e10cSrcweir 306cdf0e10cSrcweir void BitmapReadAccess::ReAccess( sal_Bool bModify ) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir const ImpBitmap* pImpBmp = maBitmap.ImplGetImpBitmap(); 309cdf0e10cSrcweir 310cdf0e10cSrcweir DBG_ASSERT( !mpBuffer, "No ReAccess possible while bitmap is being accessed!" ); 311cdf0e10cSrcweir DBG_ASSERT( pImpBmp && ( pImpBmp->ImplGetRefCount() > 1UL ), "Accessed bitmap does not exist anymore!" ); 312cdf0e10cSrcweir 313cdf0e10cSrcweir if( !mpBuffer && pImpBmp && ( pImpBmp->ImplGetRefCount() > 1UL ) ) 314cdf0e10cSrcweir { 315cdf0e10cSrcweir mbModify = bModify; 316cdf0e10cSrcweir ImplCreate( maBitmap ); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir } 319cdf0e10cSrcweir 320cdf0e10cSrcweir // ------------------------------------------------------------------ 321cdf0e10cSrcweir 322cdf0e10cSrcweir sal_uInt16 BitmapReadAccess::GetBestPaletteIndex( const BitmapColor& rBitmapColor ) const 323cdf0e10cSrcweir { 324cdf0e10cSrcweir return( HasPalette() ? mpBuffer->maPalette.GetBestIndex( rBitmapColor ) : 0 ); 325cdf0e10cSrcweir } 326cdf0e10cSrcweir 327cdf0e10cSrcweir // --------------------- 328cdf0e10cSrcweir // - BitmapWriteAccess - 329cdf0e10cSrcweir // --------------------- 330cdf0e10cSrcweir 331cdf0e10cSrcweir BitmapWriteAccess::BitmapWriteAccess( Bitmap& rBitmap ) : 332cdf0e10cSrcweir BitmapReadAccess( rBitmap, sal_True ), 333cdf0e10cSrcweir mpLineColor ( NULL ), 334cdf0e10cSrcweir mpFillColor ( NULL ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir } 337cdf0e10cSrcweir 338cdf0e10cSrcweir // ------------------------------------------------------------------ 339cdf0e10cSrcweir 340cdf0e10cSrcweir BitmapWriteAccess::~BitmapWriteAccess() 341cdf0e10cSrcweir { 342cdf0e10cSrcweir delete mpLineColor; 343cdf0e10cSrcweir delete mpFillColor; 344cdf0e10cSrcweir } 345cdf0e10cSrcweir 346cdf0e10cSrcweir // ------------------------------------------------------------------ 347cdf0e10cSrcweir 348cdf0e10cSrcweir void BitmapWriteAccess::CopyScanline( long nY, const BitmapReadAccess& rReadAcc ) 349cdf0e10cSrcweir { 350cdf0e10cSrcweir DBG_ASSERT( ( nY >= 0 ) && ( nY < mpBuffer->mnHeight ), "y-coordinate in destination out of range!" ); 351cdf0e10cSrcweir DBG_ASSERT( nY < rReadAcc.Height(), "y-coordinate in source out of range!" ); 352cdf0e10cSrcweir DBG_ASSERT( ( HasPalette() && rReadAcc.HasPalette() ) || ( !HasPalette() && !rReadAcc.HasPalette() ), "No copying possible between palette bitmap and TC bitmap!" ); 353cdf0e10cSrcweir 354cdf0e10cSrcweir if( ( GetScanlineFormat() == rReadAcc.GetScanlineFormat() ) && 355cdf0e10cSrcweir ( GetScanlineSize() >= rReadAcc.GetScanlineSize() ) ) 356cdf0e10cSrcweir { 357cdf0e10cSrcweir memcpy( mpScanBuf[ nY ], rReadAcc.GetScanline( nY ), rReadAcc.GetScanlineSize() ); 358cdf0e10cSrcweir } 359cdf0e10cSrcweir else 360cdf0e10cSrcweir // TODO: use fastbmp infrastructure 361cdf0e10cSrcweir for( long nX = 0L, nWidth = Min( mpBuffer->mnWidth, rReadAcc.Width() ); nX < nWidth; nX++ ) 362cdf0e10cSrcweir SetPixel( nY, nX, rReadAcc.GetPixel( nY, nX ) ); 363cdf0e10cSrcweir } 364cdf0e10cSrcweir 365cdf0e10cSrcweir // ------------------------------------------------------------------ 366cdf0e10cSrcweir 367cdf0e10cSrcweir void BitmapWriteAccess::CopyScanline( long nY, ConstScanline aSrcScanline, 368cdf0e10cSrcweir sal_uLong nSrcScanlineFormat, sal_uLong nSrcScanlineSize ) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir const sal_uLong nFormat = BMP_SCANLINE_FORMAT( nSrcScanlineFormat ); 371cdf0e10cSrcweir 372cdf0e10cSrcweir DBG_ASSERT( ( nY >= 0 ) && ( nY < mpBuffer->mnHeight ), "y-coordinate in destination out of range!" ); 373cdf0e10cSrcweir DBG_ASSERT( ( HasPalette() && nFormat <= BMP_FORMAT_8BIT_PAL ) || 374cdf0e10cSrcweir ( !HasPalette() && nFormat > BMP_FORMAT_8BIT_PAL ), 375cdf0e10cSrcweir "No copying possible between palette and non palette scanlines!" ); 376cdf0e10cSrcweir 377cdf0e10cSrcweir const sal_uLong nCount = Min( GetScanlineSize(), nSrcScanlineSize ); 378cdf0e10cSrcweir 379cdf0e10cSrcweir if( nCount ) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir if( GetScanlineFormat() == BMP_SCANLINE_FORMAT( nSrcScanlineFormat ) ) 382cdf0e10cSrcweir memcpy( mpScanBuf[ nY ], aSrcScanline, nCount ); 383cdf0e10cSrcweir else 384cdf0e10cSrcweir { 385cdf0e10cSrcweir DBG_ASSERT( nFormat != BMP_FORMAT_8BIT_TC_MASK && 386cdf0e10cSrcweir nFormat != BMP_FORMAT_16BIT_TC_MSB_MASK && nFormat != BMP_FORMAT_16BIT_TC_LSB_MASK && 387cdf0e10cSrcweir nFormat != BMP_FORMAT_24BIT_TC_MASK && nFormat != BMP_FORMAT_32BIT_TC_MASK, 388cdf0e10cSrcweir "No support for pixel formats with color masks yet!" ); 389cdf0e10cSrcweir 390cdf0e10cSrcweir // TODO: use fastbmp infrastructure 391cdf0e10cSrcweir FncGetPixel pFncGetPixel; 392cdf0e10cSrcweir 393cdf0e10cSrcweir switch( nFormat ) 394cdf0e10cSrcweir { 395cdf0e10cSrcweir case( BMP_FORMAT_1BIT_MSB_PAL ): pFncGetPixel = GetPixelFor_1BIT_MSB_PAL; break; 396cdf0e10cSrcweir case( BMP_FORMAT_1BIT_LSB_PAL ): pFncGetPixel = GetPixelFor_1BIT_LSB_PAL; break; 397cdf0e10cSrcweir case( BMP_FORMAT_4BIT_MSN_PAL ): pFncGetPixel = GetPixelFor_4BIT_MSN_PAL; break; 398cdf0e10cSrcweir case( BMP_FORMAT_4BIT_LSN_PAL ): pFncGetPixel = GetPixelFor_4BIT_LSN_PAL; break; 399cdf0e10cSrcweir case( BMP_FORMAT_8BIT_PAL ): pFncGetPixel = GetPixelFor_8BIT_PAL; break; 400cdf0e10cSrcweir case( BMP_FORMAT_8BIT_TC_MASK ): pFncGetPixel = GetPixelFor_8BIT_TC_MASK; break; 401cdf0e10cSrcweir case( BMP_FORMAT_16BIT_TC_MSB_MASK ): pFncGetPixel = GetPixelFor_16BIT_TC_MSB_MASK; break; 402cdf0e10cSrcweir case( BMP_FORMAT_16BIT_TC_LSB_MASK ): pFncGetPixel = GetPixelFor_16BIT_TC_LSB_MASK; break; 403cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_BGR ): pFncGetPixel = GetPixelFor_24BIT_TC_BGR; break; 404cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_RGB ): pFncGetPixel = GetPixelFor_24BIT_TC_RGB; break; 405cdf0e10cSrcweir case( BMP_FORMAT_24BIT_TC_MASK ): pFncGetPixel = GetPixelFor_24BIT_TC_MASK; break; 406cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_ABGR ): pFncGetPixel = GetPixelFor_32BIT_TC_ABGR; break; 407cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_ARGB ): pFncGetPixel = GetPixelFor_32BIT_TC_ARGB; break; 408cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_BGRA ): pFncGetPixel = GetPixelFor_32BIT_TC_BGRA; break; 409cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_RGBA ): pFncGetPixel = GetPixelFor_32BIT_TC_RGBA; break; 410cdf0e10cSrcweir case( BMP_FORMAT_32BIT_TC_MASK ): pFncGetPixel = GetPixelFor_32BIT_TC_MASK; break; 411cdf0e10cSrcweir 412cdf0e10cSrcweir default: 413cdf0e10cSrcweir pFncGetPixel = NULL; 414cdf0e10cSrcweir break; 415cdf0e10cSrcweir } 416cdf0e10cSrcweir 417cdf0e10cSrcweir if( pFncGetPixel ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir const ColorMask aDummyMask; 420cdf0e10cSrcweir 421cdf0e10cSrcweir for( long nX = 0L, nWidth = mpBuffer->mnWidth; nX < nWidth; nX++ ) 422cdf0e10cSrcweir SetPixel( nY, nX, pFncGetPixel( aSrcScanline, nX, aDummyMask ) ); 423cdf0e10cSrcweir } 424cdf0e10cSrcweir } 425cdf0e10cSrcweir } 426cdf0e10cSrcweir } 427cdf0e10cSrcweir 428cdf0e10cSrcweir 429cdf0e10cSrcweir // ------------------------------------------------------------------ 430cdf0e10cSrcweir 431cdf0e10cSrcweir void BitmapWriteAccess::CopyBuffer( const BitmapReadAccess& rReadAcc ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir DBG_ASSERT( ( HasPalette() && rReadAcc.HasPalette() ) || ( !HasPalette() && !rReadAcc.HasPalette() ), "No copying possible between palette bitmap and TC bitmap!" ); 434cdf0e10cSrcweir 435cdf0e10cSrcweir if( ( GetScanlineFormat() == rReadAcc.GetScanlineFormat() ) && 436cdf0e10cSrcweir ( GetScanlineSize() == rReadAcc.GetScanlineSize() ) ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir const long nHeight = Min( mpBuffer->mnHeight, rReadAcc.Height() ); 439cdf0e10cSrcweir const sal_uLong nCount = nHeight * mpBuffer->mnScanlineSize; 440cdf0e10cSrcweir 441cdf0e10cSrcweir memcpy( mpBuffer->mpBits, rReadAcc.GetBuffer(), nCount ); 442cdf0e10cSrcweir } 443cdf0e10cSrcweir else 444cdf0e10cSrcweir for( long nY = 0L, nHeight = Min( mpBuffer->mnHeight, rReadAcc.Height() ); nY < nHeight; nY++ ) 445cdf0e10cSrcweir CopyScanline( nY, rReadAcc ); 446cdf0e10cSrcweir } 447