xref: /AOO41X/main/vcl/source/gdi/bmpacc.cxx (revision 9f62ea84a806e17e6f2bbff75724a7257a0eb5d9)
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