| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | /*************************************************************************
 | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *  OpenOffice.org - a multi-platform office productivity suite | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *  $RCSfile: canvasbitmap.cxx,v $ | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *  $Revision: 1.6 $ | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *  last change: $Author: rt $ $Date: 2005-09-07 23:17:14 $ | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *  The Contents of this file are made available subject to | 
					
						
							|  |  |  |  *  the terms of GNU Lesser General Public License Version 2.1. | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *    GNU Lesser General Public License Version 2.1 | 
					
						
							|  |  |  |  *    ============================================= | 
					
						
							|  |  |  |  *    Copyright 2005 by Sun Microsystems, Inc. | 
					
						
							|  |  |  |  *    901 San Antonio Road, Palo Alto, CA 94303, USA | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *    This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  *    modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  *    License version 2.1, as published by the Free Software Foundation. | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *    This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  *    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  *    Lesser General Public License for more details. | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2005-09-07 22:17:31 +00:00
										 |  |  |  *    You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  *    License along with this library; if not, write to the Free Software | 
					
						
							|  |  |  |  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
					
						
							|  |  |  |  *    MA  02111-1307  USA | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  ************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  | #include <canvas/debug.hxx>
 | 
					
						
							|  |  |  | #include "canvasbitmap.hxx"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _SV_BITMAPEX_HXX
 | 
					
						
							|  |  |  | #include <vcl/bitmapex.hxx>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | #ifndef _SV_BMPACC_HXX
 | 
					
						
							|  |  |  | #include <vcl/bmpacc.hxx>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace ::com::sun::star; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | namespace vclcanvas | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     // Currently, the only way to generate an XBitmap is from
 | 
					
						
							|  |  |  |     // XGraphicDevice.getCompatibleBitmap(). Therefore, we don't even
 | 
					
						
							|  |  |  |     // take a bitmap here, but a VDev directly.
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |     CanvasBitmap::CanvasBitmap( const ::Size&                       rSize, | 
					
						
							|  |  |  |                                 bool                                bAlphaBitmap, | 
					
						
							|  |  |  |                                 const WindowGraphicDevice::ImplRef& rDevice ) | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         ENSURE_AND_THROW( rDevice->getOutDev(), | 
					
						
							|  |  |  |                           "CanvasBitmap::CanvasBitmap(): Invalid reference outdev" ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         OutputDevice&            rOutDev( *rDevice->getOutDev() ); | 
					
						
							|  |  |  |         tools::OutDevStateKeeper aStateKeeper( rOutDev ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         // create bitmap for given reference device
 | 
					
						
							|  |  |  |         // ========================================
 | 
					
						
							|  |  |  |         const USHORT nBitCount( (USHORT)24U ); | 
					
						
							|  |  |  |         const BitmapPalette*    pPalette = NULL; | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         // TODO(P2): Seems like VCL doesn't handle palette bitmap with
 | 
					
						
							|  |  |  |         // alpha channel. Devise other ways to handle this, or fix VCL
 | 
					
						
							|  |  |  |         const USHORT nBitCount( ::std::min( (USHORT)24U, | 
					
						
							|  |  |  |                                             (USHORT)rOutDev.GetBitCount() ) ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         if( nBitCount <= 8 ) | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             rOutDev.EnableMapMode( FALSE ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             // try to determine palette from output device (by
 | 
					
						
							|  |  |  |             // extracting a 1,1 bitmap, and querying it)
 | 
					
						
							|  |  |  |             const Point aEmptyPoint; | 
					
						
							|  |  |  |             const Size  aSize(1,1); | 
					
						
							|  |  |  |             Bitmap aTmpBitmap( rOutDev.GetBitmap( aEmptyPoint, | 
					
						
							|  |  |  |                                                   aSize ) ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             ScopedBitmapReadAccess pReadAccess( aTmpBitmap.AcquireReadAccess(), | 
					
						
							|  |  |  |                                                 aTmpBitmap ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             pPalette = &pReadAccess->GetPalette(); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         Bitmap aBitmap( rSize, nBitCount, pPalette ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         // only create alpha channel bitmap, if factory requested
 | 
					
						
							|  |  |  |         // that. Providing alpha-channeled bitmaps by default has,
 | 
					
						
							|  |  |  |         // especially under VCL, a huge performance penalty (have to
 | 
					
						
							|  |  |  |         // use alpha VDev, then).
 | 
					
						
							|  |  |  |         if( bAlphaBitmap ) | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             AlphaMask   aAlpha ( rSize ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             maCanvasHelper.setBitmap( BitmapEx( aBitmap, aAlpha ), | 
					
						
							|  |  |  |                                       rDevice ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |             maCanvasHelper.setBitmap( BitmapEx( aBitmap ), | 
					
						
							|  |  |  |                                       rDevice ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |     CanvasBitmap::CanvasBitmap( const BitmapEx&                     rBitmap, | 
					
						
							|  |  |  |                                 const WindowGraphicDevice::ImplRef& rDevice ) | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         ENSURE_AND_THROW( rDevice->getOutDev(), | 
					
						
							|  |  |  |                           "CanvasBitmap::CanvasBitmap(): Invalid reference outdev" ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         maCanvasHelper.setBitmap( rBitmap, | 
					
						
							|  |  |  |                                   rDevice ); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |     CanvasBitmap::~CanvasBitmap() | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |     void SAL_CALL CanvasBitmap::disposing() | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         tools::LocalGuard aGuard; | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         // forward to parent
 | 
					
						
							|  |  |  |         CanvasBitmap_Base::disposing(); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-03-10 10:56:58 +00:00
										 |  |  | #define SERVICE_NAME "com.sun.star.rendering.CanvasBitmap"
 | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     ::rtl::OUString SAL_CALL CanvasBitmap::getImplementationName(  ) throw (uno::RuntimeException) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( CANVASBITMAP_IMPLEMENTATION_NAME ) ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sal_Bool SAL_CALL CanvasBitmap::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ) ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     uno::Sequence< ::rtl::OUString > SAL_CALL CanvasBitmap::getSupportedServiceNames(  ) throw (uno::RuntimeException) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         uno::Sequence< ::rtl::OUString > aRet(1); | 
					
						
							|  |  |  |         aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return aRet; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |     BitmapEx CanvasBitmap::getBitmap() const | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2004-11-26 16:10:25 +00:00
										 |  |  |         return maCanvasHelper.getBitmap(); | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2005-03-30 06:35:43 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     bool CanvasBitmap::repaint( const GraphicObjectSharedPtr&   rGrf, | 
					
						
							|  |  |  |                                 const ::Point&                  rPt, | 
					
						
							|  |  |  |                                 const ::Size&                   rSz, | 
					
						
							|  |  |  |                                 const GraphicAttr&              rAttr ) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         tools::LocalGuard aGuard; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         mbSurfaceDirty = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return maCanvasHelper.repaint( rGrf, rPt, rSz, rAttr ); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2004-03-18 09:38:44 +00:00
										 |  |  | } |