Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SV_BMPACC_HXX
30 : : #define _SV_BMPACC_HXX
31 : :
32 : : #include <tools/solar.h>
33 : : #include <vcl/dllapi.h>
34 : : #include <vcl/salbtype.hxx>
35 : : #include <vcl/bitmap.hxx>
36 : :
37 : : // --------------------
38 : : // - Access defines -
39 : : // --------------------
40 : :
41 : : #define DECL_FORMAT_GETPIXEL( Format ) \
42 : : static BitmapColor GetPixelFor##Format( ConstScanline pScanline, long nX, const ColorMask& rMask );
43 : :
44 : : #define DECL_FORMAT_SETPIXEL( Format ) \
45 : : static void SetPixelFor##Format( Scanline pScanline, long nX, const BitmapColor& rBitmapColor, const ColorMask& rMask );
46 : :
47 : : #define DECL_FORMAT( Format ) \
48 : : DECL_FORMAT_GETPIXEL( Format ) \
49 : : DECL_FORMAT_SETPIXEL( Format )
50 : :
51 : : #define IMPL_FORMAT_GETPIXEL( Format ) \
52 : : BitmapColor BitmapReadAccess::GetPixelFor##Format( ConstScanline pScanline, long nX, const ColorMask& rMask )
53 : :
54 : : #define IMPL_FORMAT_GETPIXEL_NOMASK( Format ) \
55 : : BitmapColor BitmapReadAccess::GetPixelFor##Format( ConstScanline pScanline, long nX, const ColorMask& )
56 : :
57 : : #define IMPL_FORMAT_SETPIXEL( Format ) \
58 : : void BitmapReadAccess::SetPixelFor##Format( Scanline pScanline, long nX, const BitmapColor& rBitmapColor, const ColorMask& rMask )
59 : :
60 : : #define IMPL_FORMAT_SETPIXEL_NOMASK( Format ) \
61 : : void BitmapReadAccess::SetPixelFor##Format( Scanline pScanline, long nX, const BitmapColor& rBitmapColor, const ColorMask& )
62 : :
63 : : #define CASE_FORMAT( Format ) \
64 : : case( BMP_FORMAT##Format ): \
65 : : { \
66 : : mFncGetPixel = GetPixelFor##Format;\
67 : : mFncSetPixel = SetPixelFor##Format;\
68 : : } \
69 : : break;
70 : :
71 : :
72 : : // --------------------
73 : : // - Access functions -
74 : : // --------------------
75 : :
76 : : typedef BitmapColor (*FncGetPixel)( ConstScanline pScanline, long nX, const ColorMask& rMask );
77 : : typedef void (*FncSetPixel)( Scanline pScanline, long nX, const BitmapColor& rBitmapColor, const ColorMask& rMask );
78 : :
79 : : // --------------------
80 : : // - BitmapReadAccess -
81 : : // --------------------
82 : :
83 : : class VCL_DLLPUBLIC BitmapReadAccess
84 : : {
85 : : friend class BitmapWriteAccess;
86 : :
87 : : private:
88 : :
89 : : BitmapReadAccess() {}
90 : : BitmapReadAccess( const BitmapReadAccess& ) {}
91 : : BitmapReadAccess& operator=( const BitmapReadAccess& ) { return *this; }
92 : :
93 : : protected:
94 : : Bitmap maBitmap;
95 : : BitmapBuffer* mpBuffer;
96 : : Scanline* mpScanBuf;
97 : : ColorMask maColorMask;
98 : : FncGetPixel mFncGetPixel;
99 : : FncSetPixel mFncSetPixel;
100 : : sal_Bool mbModify;
101 : :
102 : :
103 : : SAL_DLLPRIVATE void ImplCreate( Bitmap& rBitmap );
104 : : SAL_DLLPRIVATE void ImplDestroy();
105 : : SAL_DLLPRIVATE sal_Bool ImplSetAccessPointers( sal_uLong nFormat );
106 : :
107 : : public:
108 : :
109 : : SAL_DLLPRIVATE void ImplZeroInitUnusedBits();
110 : 305400 : SAL_DLLPRIVATE BitmapBuffer* ImplGetBitmapBuffer() const { return mpBuffer; }
111 : :
112 : : DECL_FORMAT( _1BIT_MSB_PAL )
113 : : DECL_FORMAT( _1BIT_LSB_PAL )
114 : : DECL_FORMAT( _4BIT_MSN_PAL )
115 : : DECL_FORMAT( _4BIT_LSN_PAL )
116 : : DECL_FORMAT( _8BIT_PAL )
117 : : DECL_FORMAT( _8BIT_TC_MASK )
118 : : DECL_FORMAT( _16BIT_TC_MSB_MASK )
119 : : DECL_FORMAT( _16BIT_TC_LSB_MASK )
120 : : DECL_FORMAT( _24BIT_TC_BGR )
121 : : DECL_FORMAT( _24BIT_TC_RGB )
122 : : DECL_FORMAT( _24BIT_TC_MASK )
123 : : DECL_FORMAT( _32BIT_TC_ABGR )
124 : : DECL_FORMAT( _32BIT_TC_ARGB )
125 : : DECL_FORMAT( _32BIT_TC_BGRA )
126 : : DECL_FORMAT( _32BIT_TC_RGBA )
127 : : DECL_FORMAT( _32BIT_TC_MASK )
128 : : protected:
129 : : BitmapReadAccess( Bitmap& rBitmap, sal_Bool bModify );
130 : :
131 : : public:
132 : : BitmapReadAccess( Bitmap& rBitmap );
133 : : virtual ~BitmapReadAccess();
134 : :
135 : : inline sal_Bool operator!() const;
136 : :
137 : : inline long Width() const;
138 : : inline long Height() const;
139 : : inline Point TopLeft() const;
140 : : inline Point BottomRight() const;
141 : :
142 : : inline sal_Bool IsTopDown() const;
143 : : inline sal_Bool IsBottomUp() const;
144 : :
145 : : inline sal_uLong GetScanlineFormat() const;
146 : : inline sal_uLong GetScanlineSize() const;
147 : :
148 : : inline sal_uInt16 GetBitCount() const;
149 : : inline BitmapColor GetBestMatchingColor( const BitmapColor& rBitmapColor );
150 : :
151 : : inline Scanline GetBuffer() const;
152 : : inline Scanline GetScanline( long nY ) const;
153 : :
154 : : inline sal_Bool HasPalette() const;
155 : : inline const BitmapPalette& GetPalette() const;
156 : : inline sal_uInt16 GetPaletteEntryCount() const;
157 : : inline const BitmapColor& GetPaletteColor( sal_uInt16 nColor ) const;
158 : : inline const BitmapColor& GetBestPaletteColor( const BitmapColor& rBitmapColor ) const;
159 : : sal_uInt16 GetBestPaletteIndex( const BitmapColor& rBitmapColor ) const;
160 : :
161 : : inline sal_Bool HasColorMask() const;
162 : : inline ColorMask& GetColorMask() const;
163 : :
164 : : inline BitmapColor GetPixelFromData( const sal_uInt8* pData, long nX ) const;
165 : : inline void SetPixelOnData( sal_uInt8* pData, long nX, const BitmapColor& rBitmapColor );
166 : : inline BitmapColor GetPixel( long nY, long nX ) const;
167 : : inline BitmapColor GetColor( long nY, long nX ) const;
168 : : inline sal_uInt8 GetLuminance( long nY, long nX ) const;
169 : : };
170 : :
171 : : // ---------------------
172 : : // - BitmapWriteAccess -
173 : : // ---------------------
174 : :
175 : : class VCL_DLLPUBLIC BitmapWriteAccess : public BitmapReadAccess
176 : : {
177 : : public:
178 : :
179 : : BitmapWriteAccess( Bitmap& rBitmap );
180 : : virtual ~BitmapWriteAccess();
181 : :
182 : : void CopyScanline( long nY, const BitmapReadAccess& rReadAcc );
183 : : void CopyScanline( long nY, ConstScanline aSrcScanline,
184 : : sal_uLong nSrcScanlineFormat, sal_uLong nSrcScanlineSize );
185 : :
186 : : void CopyBuffer( const BitmapReadAccess& rReadAcc );
187 : :
188 : : inline void SetPalette( const BitmapPalette& rPalette );
189 : : inline void SetPaletteEntryCount( sal_uInt16 nCount );
190 : : inline void SetPaletteColor( sal_uInt16 nColor, const BitmapColor& rBitmapColor );
191 : :
192 : : inline void SetPixel( long nY, long nX, const BitmapColor& rBitmapColor );
193 : :
194 : : void SetLineColor( const Color& rColor );
195 : :
196 : : void SetFillColor( const Color& rColor );
197 : :
198 : : void Erase( const Color& rColor );
199 : :
200 : : void DrawLine( const Point& rStart, const Point& rEnd );
201 : :
202 : : void FillRect( const Rectangle& rRect );
203 : : void DrawRect( const Rectangle& rRect );
204 : :
205 : : private:
206 : :
207 : : BitmapColor* mpLineColor;
208 : : BitmapColor* mpFillColor;
209 : :
210 : : BitmapWriteAccess() {}
211 : : BitmapWriteAccess( const BitmapWriteAccess& ) : BitmapReadAccess() {}
212 : : BitmapWriteAccess& operator=( const BitmapWriteAccess& ) { return *this; }
213 : : };
214 : :
215 : : // -----------
216 : : // - Inlines -
217 : : // -----------
218 : :
219 : 1279948 : inline sal_Bool BitmapReadAccess::operator!() const
220 : : {
221 : 1279948 : return( mpBuffer == NULL );
222 : : }
223 : :
224 : : // ------------------------------------------------------------------
225 : :
226 : 506949 : inline long BitmapReadAccess::Width() const
227 : : {
228 [ + - ]: 506949 : return( mpBuffer ? mpBuffer->mnWidth : 0L );
229 : : }
230 : :
231 : : // ------------------------------------------------------------------
232 : :
233 : 481901 : inline long BitmapReadAccess::Height() const
234 : : {
235 [ + - ]: 481901 : return( mpBuffer ? mpBuffer->mnHeight : 0L );
236 : : }
237 : :
238 : : // ------------------------------------------------------------------
239 : :
240 : : inline Point BitmapReadAccess::TopLeft() const
241 : : {
242 : : return Point();
243 : : }
244 : :
245 : : // ------------------------------------------------------------------
246 : :
247 : : inline Point BitmapReadAccess::BottomRight() const
248 : : {
249 : : return Point( Width() - 1L, Height() - 1L );
250 : : }
251 : :
252 : : // ------------------------------------------------------------------
253 : :
254 : 71 : inline sal_Bool BitmapReadAccess::IsTopDown() const
255 : : {
256 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
257 [ + - ]: 71 : return( mpBuffer ? sal::static_int_cast<sal_Bool>( BMP_SCANLINE_ADJUSTMENT( mpBuffer->mnFormat ) == BMP_FORMAT_TOP_DOWN ) : sal_False );
258 : : }
259 : :
260 : : // ------------------------------------------------------------------
261 : :
262 : 71 : inline sal_Bool BitmapReadAccess::IsBottomUp() const
263 : : {
264 : 71 : return !IsTopDown();
265 : : }
266 : :
267 : : // ------------------------------------------------------------------
268 : :
269 : 171481 : inline sal_uLong BitmapReadAccess::GetScanlineFormat() const
270 : : {
271 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
272 [ + - ]: 171481 : return( mpBuffer ? BMP_SCANLINE_FORMAT( mpBuffer->mnFormat ) : 0UL );
273 : : }
274 : :
275 : : // ------------------------------------------------------------------
276 : :
277 : 93279 : inline sal_uLong BitmapReadAccess::GetScanlineSize() const
278 : : {
279 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
280 [ + - ]: 93279 : return( mpBuffer ? mpBuffer->mnScanlineSize : 0UL );
281 : : }
282 : :
283 : : // ------------------------------------------------------------------
284 : :
285 : 45465 : inline sal_uInt16 BitmapReadAccess::GetBitCount() const
286 : : {
287 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
288 [ + - ]: 45465 : return( mpBuffer ? mpBuffer->mnBitCount : 0 );
289 : : }
290 : :
291 : : // ------------------------------------------------------------------
292 : :
293 : 36080 : inline BitmapColor BitmapReadAccess::GetBestMatchingColor( const BitmapColor& rBitmapColor )
294 : : {
295 [ + + ]: 36080 : if( HasPalette() )
296 : 8627 : return BitmapColor( (sal_uInt8) GetBestPaletteIndex( rBitmapColor ) );
297 : : else
298 : 36080 : return rBitmapColor;
299 : : }
300 : :
301 : : // ------------------------------------------------------------------
302 : :
303 : 21742 : inline Scanline BitmapReadAccess::GetBuffer() const
304 : : {
305 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
306 [ + - ]: 21742 : return( mpBuffer ? mpBuffer->mpBits : NULL );
307 : : }
308 : :
309 : : // ------------------------------------------------------------------
310 : :
311 : 61141690 : inline Scanline BitmapReadAccess::GetScanline( long nY ) const
312 : : {
313 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
314 : : DBG_ASSERT( nY < mpBuffer->mnHeight, "y-coordinate out of range!" );
315 [ + - ]: 61141690 : return( mpBuffer ? mpScanBuf[ nY ] : NULL );
316 : : }
317 : :
318 : : // ------------------------------------------------------------------
319 : :
320 : 607025130 : inline sal_Bool BitmapReadAccess::HasPalette() const
321 : : {
322 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
323 [ + - ][ + + ]: 607025130 : return( mpBuffer && !!mpBuffer->maPalette );
324 : : }
325 : :
326 : : // ------------------------------------------------------------------
327 : :
328 : 280411 : inline const BitmapPalette& BitmapReadAccess::GetPalette() const
329 : : {
330 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
331 : 280411 : return mpBuffer->maPalette;
332 : : }
333 : :
334 : : // ------------------------------------------------------------------
335 : :
336 : 229836 : inline sal_uInt16 BitmapReadAccess::GetPaletteEntryCount() const
337 : : {
338 : : DBG_ASSERT( HasPalette(), "Bitmap has no palette!" );
339 [ + - ]: 229836 : return( HasPalette() ? mpBuffer->maPalette.GetEntryCount() : 0 );
340 : : }
341 : :
342 : : // ------------------------------------------------------------------
343 : :
344 : 68303687 : inline const BitmapColor& BitmapReadAccess::GetPaletteColor( sal_uInt16 nColor ) const
345 : : {
346 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
347 : : DBG_ASSERT( HasPalette(), "Bitmap has no palette!" );
348 : 68303687 : return mpBuffer->maPalette[ nColor ];
349 : : }
350 : :
351 : : // ------------------------------------------------------------------
352 : :
353 : 0 : inline const BitmapColor& BitmapReadAccess::GetBestPaletteColor( const BitmapColor& rBitmapColor ) const
354 : : {
355 : 0 : return GetPaletteColor( GetBestPaletteIndex( rBitmapColor ) );
356 : : }
357 : :
358 : : // ------------------------------------------------------------------
359 : :
360 : : inline sal_Bool BitmapReadAccess::HasColorMask() const
361 : : {
362 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
363 : : const sal_uLong nFormat = BMP_SCANLINE_FORMAT( mpBuffer->mnFormat );
364 : :
365 : : return( nFormat == BMP_FORMAT_8BIT_TC_MASK ||
366 : : nFormat == BMP_FORMAT_16BIT_TC_MSB_MASK ||
367 : : nFormat == BMP_FORMAT_16BIT_TC_LSB_MASK ||
368 : : nFormat == BMP_FORMAT_24BIT_TC_MASK ||
369 : : nFormat == BMP_FORMAT_32BIT_TC_MASK );
370 : : }
371 : :
372 : : // ------------------------------------------------------------------
373 : :
374 : 8631 : inline ColorMask& BitmapReadAccess::GetColorMask() const
375 : : {
376 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
377 : 8631 : return mpBuffer->maColorMask;
378 : : }
379 : :
380 : : // ------------------------------------------------------------------
381 : :
382 : 1007377178 : inline BitmapColor BitmapReadAccess::GetPixel( long nY, long nX ) const
383 : : {
384 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
385 : : DBG_ASSERT( nX < mpBuffer->mnWidth, "x-coordinate out of range!" );
386 : : DBG_ASSERT( nY < mpBuffer->mnHeight, "y-coordinate out of range!" );
387 : 1007377178 : return mFncGetPixel( mpScanBuf[ nY ], nX, maColorMask );
388 : : }
389 : :
390 : : // ------------------------------------------------------------------
391 : :
392 : 0 : inline BitmapColor BitmapReadAccess::GetPixelFromData( const sal_uInt8* pData, long nX ) const
393 : : {
394 : : DBG_ASSERT( pData, "Access is not valid!" );
395 : 0 : return mFncGetPixel( pData, nX, maColorMask );
396 : : }
397 : :
398 : : // ------------------------------------------------------------------
399 : :
400 : 0 : inline void BitmapReadAccess::SetPixelOnData( sal_uInt8* pData, long nX, const BitmapColor& rBitmapColor )
401 : : {
402 : : DBG_ASSERT( pData, "Access is not valid!" );
403 : 0 : mFncSetPixel( pData, nX, rBitmapColor, maColorMask );
404 : 0 : }
405 : :
406 : : // ------------------------------------------------------------------
407 : :
408 : 3352889 : inline BitmapColor BitmapReadAccess::GetColor( long nY, long nX ) const
409 : : {
410 [ + + ]: 3352889 : if( !!mpBuffer->maPalette )
411 : : {
412 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
413 : 392695 : return mpBuffer->maPalette[ GetPixel( nY, nX ).GetIndex() ];
414 : : }
415 : : else
416 : 3352889 : return GetPixel( nY, nX );
417 : : }
418 : :
419 : : // ------------------------------------------------------------------
420 : :
421 : 3278665 : inline sal_uInt8 BitmapReadAccess::GetLuminance( long nY, long nX ) const
422 : : {
423 : 3278665 : return GetColor( nY, nX ).GetLuminance();
424 : : }
425 : :
426 : : // ------------------------------------------------------------------
427 : :
428 : 138 : inline void BitmapWriteAccess::SetPalette( const BitmapPalette& rPalette )
429 : : {
430 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
431 : 138 : mpBuffer->maPalette = rPalette;
432 : 138 : }
433 : :
434 : : // ------------------------------------------------------------------
435 : :
436 : 1707 : inline void BitmapWriteAccess::SetPaletteEntryCount( sal_uInt16 nCount )
437 : : {
438 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
439 : 1707 : mpBuffer->maPalette.SetEntryCount( nCount );
440 : 1707 : }
441 : :
442 : : // ------------------------------------------------------------------
443 : :
444 : 214702 : inline void BitmapWriteAccess::SetPaletteColor( sal_uInt16 nColor, const BitmapColor& rBitmapColor )
445 : : {
446 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
447 : : DBG_ASSERT( HasPalette(), "Bitmap has no palette!" );
448 : 214702 : mpBuffer->maPalette[ nColor ] = rBitmapColor;
449 : 214702 : }
450 : :
451 : : // ------------------------------------------------------------------
452 : :
453 : 934920057 : inline void BitmapWriteAccess::SetPixel( long nY, long nX, const BitmapColor& rBitmapColor )
454 : : {
455 : : DBG_ASSERT( mpBuffer, "Access is not valid!" );
456 : : DBG_ASSERT( nX < mpBuffer->mnWidth, "x-coordinate out of range!" );
457 : : DBG_ASSERT( nY < mpBuffer->mnHeight, "y-coordinate out of range!" );
458 : 934920057 : mFncSetPixel( mpScanBuf[ nY ], nX, rBitmapColor, maColorMask );
459 : 934920057 : }
460 : :
461 : : #endif // _SV_BMPACC_HXX
462 : :
463 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|