1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_canvas.hxx" 30 31 #include <canvas/debug.hxx> 32 #include <tools/diagnose_ex.h> 33 #include "canvasbitmap.hxx" 34 35 #include <vcl/bmpacc.hxx> 36 37 using namespace ::com::sun::star; 38 39 40 namespace vclcanvas 41 { 42 // Currently, the only way to generate an XBitmap is from 43 // XGraphicDevice.getCompatibleBitmap(). Therefore, we don't even 44 // take a bitmap here, but a VDev directly. 45 CanvasBitmap::CanvasBitmap( const ::Size& rSize, 46 bool bAlphaBitmap, 47 rendering::XGraphicDevice& rDevice, 48 const OutDevProviderSharedPtr& rOutDevProvider ) 49 { 50 // create bitmap for given reference device 51 // ======================================== 52 const sal_uInt16 nBitCount( (sal_uInt16)24U ); 53 const BitmapPalette* pPalette = NULL; 54 55 Bitmap aBitmap( rSize, nBitCount, pPalette ); 56 57 // only create alpha channel bitmap, if factory requested 58 // that. Providing alpha-channeled bitmaps by default has, 59 // especially under VCL, a huge performance penalty (have to 60 // use alpha VDev, then). 61 if( bAlphaBitmap ) 62 { 63 AlphaMask aAlpha ( rSize ); 64 65 maCanvasHelper.init( BitmapEx( aBitmap, aAlpha ), 66 rDevice, 67 rOutDevProvider ); 68 } 69 else 70 { 71 maCanvasHelper.init( BitmapEx( aBitmap ), 72 rDevice, 73 rOutDevProvider ); 74 } 75 } 76 77 CanvasBitmap::CanvasBitmap( const BitmapEx& rBitmap, 78 rendering::XGraphicDevice& rDevice, 79 const OutDevProviderSharedPtr& rOutDevProvider ) 80 { 81 maCanvasHelper.init( rBitmap, rDevice, rOutDevProvider ); 82 } 83 84 void SAL_CALL CanvasBitmap::disposing() 85 { 86 // forward to base 87 CanvasBitmap_Base::disposing(); 88 } 89 90 #define IMPLEMENTATION_NAME "VCLCanvas.CanvasBitmap" 91 #define SERVICE_NAME "com.sun.star.rendering.CanvasBitmap" 92 93 ::rtl::OUString SAL_CALL CanvasBitmap::getImplementationName( ) throw (uno::RuntimeException) 94 { 95 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( IMPLEMENTATION_NAME ) ); 96 } 97 98 sal_Bool SAL_CALL CanvasBitmap::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) 99 { 100 return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME ) ); 101 } 102 103 uno::Sequence< ::rtl::OUString > SAL_CALL CanvasBitmap::getSupportedServiceNames( ) throw (uno::RuntimeException) 104 { 105 uno::Sequence< ::rtl::OUString > aRet(1); 106 aRet[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) ); 107 108 return aRet; 109 } 110 111 BitmapEx CanvasBitmap::getBitmap() const 112 { 113 tools::LocalGuard aGuard; 114 115 // TODO(T3): Rework to use shared_ptr all over the place for 116 // BmpEx. This is highly un-threadsafe 117 return maCanvasHelper.getBitmap(); 118 } 119 120 bool CanvasBitmap::repaint( const GraphicObjectSharedPtr& rGrf, 121 const rendering::ViewState& viewState, 122 const rendering::RenderState& renderState, 123 const ::Point& rPt, 124 const ::Size& rSz, 125 const GraphicAttr& rAttr ) const 126 { 127 tools::LocalGuard aGuard; 128 129 mbSurfaceDirty = true; 130 131 return maCanvasHelper.repaint( rGrf, viewState, renderState, rPt, rSz, rAttr ); 132 } 133 134 uno::Any SAL_CALL CanvasBitmap::getFastPropertyValue( sal_Int32 nHandle ) throw (uno::RuntimeException) 135 { 136 if( nHandle == 0 ) { 137 BitmapEx* pBitmapEx = new BitmapEx( getBitmap() ); 138 139 return uno::Any( reinterpret_cast<sal_Int64>( pBitmapEx ) ); 140 } 141 142 return uno::Any( sal_Int64(0) ); 143 } 144 } 145