1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef INCLUDED_CANVAS_SPRITECANVASBASE_HXX 25*b1cdbd2cSJim Jagielski #define INCLUDED_CANVAS_SPRITECANVASBASE_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XSpriteCanvas.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/InterpolationMode.hpp> 30*b1cdbd2cSJim Jagielski #include <canvas/base/integerbitmapbase.hxx> 31*b1cdbd2cSJim Jagielski #include <canvas/spriteredrawmanager.hxx> 32*b1cdbd2cSJim Jagielski 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski namespace canvas 35*b1cdbd2cSJim Jagielski { 36*b1cdbd2cSJim Jagielski /** Helper template to handle XIntegerBitmap method forwarding to 37*b1cdbd2cSJim Jagielski BitmapCanvasHelper 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski Use this helper to handle the XIntegerBitmap part of your 40*b1cdbd2cSJim Jagielski implementation. 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski @tpl Base 43*b1cdbd2cSJim Jagielski Base class to use, most probably one of the 44*b1cdbd2cSJim Jagielski WeakComponentImplHelperN templates with the appropriate 45*b1cdbd2cSJim Jagielski interfaces. At least XSpriteCanvas and SpriteSurface should be 46*b1cdbd2cSJim Jagielski among them (why else would you use this template, then?). Base 47*b1cdbd2cSJim Jagielski class must have an Base( const Mutex& ) constructor (like the 48*b1cdbd2cSJim Jagielski WeakComponentImplHelperN templates have). 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski @tpl CanvasHelper 51*b1cdbd2cSJim Jagielski Canvas helper implementation for the backend in question 52*b1cdbd2cSJim Jagielski 53*b1cdbd2cSJim Jagielski @tpl Mutex 54*b1cdbd2cSJim Jagielski Lock strategy to use. Defaults to using the 55*b1cdbd2cSJim Jagielski OBaseMutex-provided lock. Everytime one of the methods is 56*b1cdbd2cSJim Jagielski entered, an object of type Mutex is created with m_aMutex as 57*b1cdbd2cSJim Jagielski the sole parameter, and destroyed again when the method scope 58*b1cdbd2cSJim Jagielski is left. 59*b1cdbd2cSJim Jagielski 60*b1cdbd2cSJim Jagielski @tpl UnambiguousBase 61*b1cdbd2cSJim Jagielski Optional unambiguous base class for XInterface of Base. It's 62*b1cdbd2cSJim Jagielski sometimes necessary to specify this parameter, e.g. if Base 63*b1cdbd2cSJim Jagielski derives from multiple UNO interface (were each provides its 64*b1cdbd2cSJim Jagielski own version of XInterface, making the conversion ambiguous) 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski @see CanvasBase for further contractual requirements towards 67*b1cdbd2cSJim Jagielski the CanvasHelper type, and some examples. 68*b1cdbd2cSJim Jagielski */ 69*b1cdbd2cSJim Jagielski template< class Base, 70*b1cdbd2cSJim Jagielski class CanvasHelper, 71*b1cdbd2cSJim Jagielski class Mutex=::osl::MutexGuard, 72*b1cdbd2cSJim Jagielski class UnambiguousBase=::com::sun::star::uno::XInterface > class SpriteCanvasBase : 73*b1cdbd2cSJim Jagielski public IntegerBitmapBase< Base, CanvasHelper, Mutex, UnambiguousBase > 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski public: 76*b1cdbd2cSJim Jagielski typedef IntegerBitmapBase< Base, CanvasHelper, Mutex, UnambiguousBase > BaseType; 77*b1cdbd2cSJim Jagielski typedef ::rtl::Reference< SpriteCanvasBase > Reference; 78*b1cdbd2cSJim Jagielski SpriteCanvasBase()79*b1cdbd2cSJim Jagielski SpriteCanvasBase() : 80*b1cdbd2cSJim Jagielski maRedrawManager() 81*b1cdbd2cSJim Jagielski { 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski #if defined __SUNPRO_CC 85*b1cdbd2cSJim Jagielski using Base::disposing; 86*b1cdbd2cSJim Jagielski #endif disposing()87*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing() 88*b1cdbd2cSJim Jagielski { 89*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 90*b1cdbd2cSJim Jagielski 91*b1cdbd2cSJim Jagielski maRedrawManager.disposing(); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski // pass on to base class 94*b1cdbd2cSJim Jagielski BaseType::disposing(); 95*b1cdbd2cSJim Jagielski } 96*b1cdbd2cSJim Jagielski 97*b1cdbd2cSJim Jagielski // XSpriteCanvas createSpriteFromAnimation(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XAnimation> & animation)98*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XAnimatedSprite > SAL_CALL createSpriteFromAnimation( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XAnimation >& animation ) throw (::com::sun::star::lang::IllegalArgumentException, 99*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException) 100*b1cdbd2cSJim Jagielski { 101*b1cdbd2cSJim Jagielski tools::verifyArgs(animation, 102*b1cdbd2cSJim Jagielski BOOST_CURRENT_FUNCTION, 103*b1cdbd2cSJim Jagielski static_cast< typename BaseType::UnambiguousBaseType* >(this)); 104*b1cdbd2cSJim Jagielski 105*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski return BaseType::maCanvasHelper.createSpriteFromAnimation(animation); 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski createSpriteFromBitmaps(const::com::sun::star::uno::Sequence<::com::sun::star::uno::Reference<::com::sun::star::rendering::XBitmap>> & animationBitmaps,sal_Int8 interpolationMode)110*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XAnimatedSprite > SAL_CALL createSpriteFromBitmaps( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmap > >& animationBitmaps, 111*b1cdbd2cSJim Jagielski sal_Int8 interpolationMode ) throw (::com::sun::star::lang::IllegalArgumentException, 112*b1cdbd2cSJim Jagielski ::com::sun::star::rendering::VolatileContentDestroyedException, 113*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException) 114*b1cdbd2cSJim Jagielski { 115*b1cdbd2cSJim Jagielski tools::verifyArgs(animationBitmaps, 116*b1cdbd2cSJim Jagielski BOOST_CURRENT_FUNCTION, 117*b1cdbd2cSJim Jagielski static_cast< typename BaseType::UnambiguousBaseType* >(this)); 118*b1cdbd2cSJim Jagielski tools::verifyRange( interpolationMode, 119*b1cdbd2cSJim Jagielski ::com::sun::star::rendering::InterpolationMode::NEAREST_NEIGHBOR, 120*b1cdbd2cSJim Jagielski ::com::sun::star::rendering::InterpolationMode::BEZIERSPLINE4 ); 121*b1cdbd2cSJim Jagielski 122*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski return BaseType::maCanvasHelper.createSpriteFromBitmaps(animationBitmaps, interpolationMode); 125*b1cdbd2cSJim Jagielski } 126*b1cdbd2cSJim Jagielski createCustomSprite(const::com::sun::star::geometry::RealSize2D & spriteSize)127*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCustomSprite > SAL_CALL createCustomSprite( const ::com::sun::star::geometry::RealSize2D& spriteSize ) throw (::com::sun::star::lang::IllegalArgumentException, 128*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException) 129*b1cdbd2cSJim Jagielski { 130*b1cdbd2cSJim Jagielski tools::verifySpriteSize(spriteSize, 131*b1cdbd2cSJim Jagielski BOOST_CURRENT_FUNCTION, 132*b1cdbd2cSJim Jagielski static_cast< typename BaseType::UnambiguousBaseType* >(this)); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 135*b1cdbd2cSJim Jagielski 136*b1cdbd2cSJim Jagielski return BaseType::maCanvasHelper.createCustomSprite(spriteSize); 137*b1cdbd2cSJim Jagielski } 138*b1cdbd2cSJim Jagielski createClonedSprite(const::com::sun::star::uno::Reference<::com::sun::star::rendering::XSprite> & original)139*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XSprite > SAL_CALL createClonedSprite( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XSprite >& original ) throw (::com::sun::star::lang::IllegalArgumentException, 140*b1cdbd2cSJim Jagielski ::com::sun::star::uno::RuntimeException) 141*b1cdbd2cSJim Jagielski { 142*b1cdbd2cSJim Jagielski tools::verifyArgs(original, 143*b1cdbd2cSJim Jagielski BOOST_CURRENT_FUNCTION, 144*b1cdbd2cSJim Jagielski static_cast< typename BaseType::UnambiguousBaseType* >(this)); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 147*b1cdbd2cSJim Jagielski 148*b1cdbd2cSJim Jagielski return BaseType::maCanvasHelper.createClonedSprite(original); 149*b1cdbd2cSJim Jagielski } 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski // SpriteSurface showSprite(const Sprite::Reference & rSprite)152*b1cdbd2cSJim Jagielski virtual void showSprite( const Sprite::Reference& rSprite ) 153*b1cdbd2cSJim Jagielski { 154*b1cdbd2cSJim Jagielski OSL_ASSERT( rSprite.is() ); 155*b1cdbd2cSJim Jagielski 156*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski maRedrawManager.showSprite( rSprite ); 159*b1cdbd2cSJim Jagielski } 160*b1cdbd2cSJim Jagielski hideSprite(const Sprite::Reference & rSprite)161*b1cdbd2cSJim Jagielski virtual void hideSprite( const Sprite::Reference& rSprite ) 162*b1cdbd2cSJim Jagielski { 163*b1cdbd2cSJim Jagielski OSL_ASSERT( rSprite.is() ); 164*b1cdbd2cSJim Jagielski 165*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 166*b1cdbd2cSJim Jagielski 167*b1cdbd2cSJim Jagielski maRedrawManager.hideSprite( rSprite ); 168*b1cdbd2cSJim Jagielski } 169*b1cdbd2cSJim Jagielski moveSprite(const Sprite::Reference & rSprite,const::basegfx::B2DPoint & rOldPos,const::basegfx::B2DPoint & rNewPos,const::basegfx::B2DVector & rSpriteSize)170*b1cdbd2cSJim Jagielski virtual void moveSprite( const Sprite::Reference& rSprite, 171*b1cdbd2cSJim Jagielski const ::basegfx::B2DPoint& rOldPos, 172*b1cdbd2cSJim Jagielski const ::basegfx::B2DPoint& rNewPos, 173*b1cdbd2cSJim Jagielski const ::basegfx::B2DVector& rSpriteSize ) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski OSL_ASSERT( rSprite.is() ); 176*b1cdbd2cSJim Jagielski 177*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 178*b1cdbd2cSJim Jagielski 179*b1cdbd2cSJim Jagielski maRedrawManager.moveSprite( rSprite, rOldPos, rNewPos, rSpriteSize ); 180*b1cdbd2cSJim Jagielski } 181*b1cdbd2cSJim Jagielski updateSprite(const Sprite::Reference & rSprite,const::basegfx::B2DPoint & rPos,const::basegfx::B2DRange & rUpdateArea)182*b1cdbd2cSJim Jagielski virtual void updateSprite( const Sprite::Reference& rSprite, 183*b1cdbd2cSJim Jagielski const ::basegfx::B2DPoint& rPos, 184*b1cdbd2cSJim Jagielski const ::basegfx::B2DRange& rUpdateArea ) 185*b1cdbd2cSJim Jagielski { 186*b1cdbd2cSJim Jagielski OSL_ASSERT( rSprite.is() ); 187*b1cdbd2cSJim Jagielski 188*b1cdbd2cSJim Jagielski typename BaseType::MutexType aGuard( BaseType::m_aMutex ); 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski maRedrawManager.updateSprite( rSprite, rPos, rUpdateArea ); 191*b1cdbd2cSJim Jagielski } 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski protected: 194*b1cdbd2cSJim Jagielski SpriteRedrawManager maRedrawManager; 195*b1cdbd2cSJim Jagielski }; 196*b1cdbd2cSJim Jagielski } 197*b1cdbd2cSJim Jagielski 198*b1cdbd2cSJim Jagielski #endif /* INCLUDED_CANVAS_SPRITECANVASBASE_HXX */ 199