1*25b11142SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*25b11142SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*25b11142SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*25b11142SAndrew Rist * distributed with this work for additional information 6*25b11142SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*25b11142SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*25b11142SAndrew Rist * "License"); you may not use this file except in compliance 9*25b11142SAndrew Rist * with the License. You may obtain a copy of the License at 10*25b11142SAndrew Rist * 11*25b11142SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*25b11142SAndrew Rist * 13*25b11142SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*25b11142SAndrew Rist * software distributed under the License is distributed on an 15*25b11142SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*25b11142SAndrew Rist * KIND, either express or implied. See the License for the 17*25b11142SAndrew Rist * specific language governing permissions and limitations 18*25b11142SAndrew Rist * under the License. 19*25b11142SAndrew Rist * 20*25b11142SAndrew Rist *************************************************************/ 21*25b11142SAndrew Rist 22*25b11142SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_cppcanvas.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <com/sun/star/rendering/XSprite.hpp> 28cdf0e10cSrcweir #include <com/sun/star/rendering/XAnimatedSprite.hpp> 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <basegfx/tools/canvastools.hxx> 31cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygon.hxx> 32cdf0e10cSrcweir #include <canvas/canvastools.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include "implsprite.hxx" 35cdf0e10cSrcweir 36cdf0e10cSrcweir 37cdf0e10cSrcweir using namespace ::com::sun::star; 38cdf0e10cSrcweir 39cdf0e10cSrcweir namespace cppcanvas 40cdf0e10cSrcweir { 41cdf0e10cSrcweir namespace internal 42cdf0e10cSrcweir { 43cdf0e10cSrcweir ImplSprite(const uno::Reference<rendering::XSpriteCanvas> & rParentCanvas,const uno::Reference<rendering::XSprite> & rSprite,const ImplSpriteCanvas::TransformationArbiterSharedPtr & rTransformArbiter)44cdf0e10cSrcweir ImplSprite::ImplSprite( const uno::Reference< rendering::XSpriteCanvas >& rParentCanvas, 45cdf0e10cSrcweir const uno::Reference< rendering::XSprite >& rSprite, 46cdf0e10cSrcweir const ImplSpriteCanvas::TransformationArbiterSharedPtr& rTransformArbiter ) : 47cdf0e10cSrcweir mxGraphicDevice(), 48cdf0e10cSrcweir mxSprite( rSprite ), 49cdf0e10cSrcweir mxAnimatedSprite(), 50cdf0e10cSrcweir mpTransformArbiter( rTransformArbiter ) 51cdf0e10cSrcweir { 52cdf0e10cSrcweir // Avoiding ternary operator in initializer list (Solaris 53cdf0e10cSrcweir // compiler bug, when function call and temporary is 54cdf0e10cSrcweir // involved) 55cdf0e10cSrcweir if( rParentCanvas.is() ) 56cdf0e10cSrcweir mxGraphicDevice = rParentCanvas->getDevice(); 57cdf0e10cSrcweir 58cdf0e10cSrcweir OSL_ENSURE( rParentCanvas.is() , "ImplSprite::ImplSprite(): Invalid canvas"); 59cdf0e10cSrcweir OSL_ENSURE( mxGraphicDevice.is(), "ImplSprite::ImplSprite(): Invalid graphic device"); 60cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::ImplSprite(): Invalid sprite"); 61cdf0e10cSrcweir OSL_ENSURE( mpTransformArbiter.get(), "ImplSprite::ImplSprite(): Invalid transformation arbiter"); 62cdf0e10cSrcweir } 63cdf0e10cSrcweir ImplSprite(const uno::Reference<rendering::XSpriteCanvas> & rParentCanvas,const uno::Reference<rendering::XAnimatedSprite> & rSprite,const ImplSpriteCanvas::TransformationArbiterSharedPtr & rTransformArbiter)64cdf0e10cSrcweir ImplSprite::ImplSprite( const uno::Reference< rendering::XSpriteCanvas >& rParentCanvas, 65cdf0e10cSrcweir const uno::Reference< rendering::XAnimatedSprite >& rSprite, 66cdf0e10cSrcweir const ImplSpriteCanvas::TransformationArbiterSharedPtr& rTransformArbiter ) : 67cdf0e10cSrcweir mxGraphicDevice(), 68cdf0e10cSrcweir mxSprite( uno::Reference< rendering::XSprite >(rSprite, 69cdf0e10cSrcweir uno::UNO_QUERY) ), 70cdf0e10cSrcweir mxAnimatedSprite( rSprite ), 71cdf0e10cSrcweir mpTransformArbiter( rTransformArbiter ) 72cdf0e10cSrcweir { 73cdf0e10cSrcweir // Avoiding ternary operator in initializer list (Solaris 74cdf0e10cSrcweir // compiler bug, when function call and temporary is 75cdf0e10cSrcweir // involved) 76cdf0e10cSrcweir if( rParentCanvas.is() ) 77cdf0e10cSrcweir mxGraphicDevice = rParentCanvas->getDevice(); 78cdf0e10cSrcweir 79cdf0e10cSrcweir OSL_ENSURE( rParentCanvas.is() , "ImplSprite::ImplSprite(): Invalid canvas"); 80cdf0e10cSrcweir OSL_ENSURE( mxGraphicDevice.is(), "ImplSprite::ImplSprite(): Invalid graphic device"); 81cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::ImplSprite(): Invalid sprite"); 82cdf0e10cSrcweir OSL_ENSURE( mpTransformArbiter.get(), "ImplSprite::ImplSprite(): Invalid transformation arbiter"); 83cdf0e10cSrcweir } 84cdf0e10cSrcweir ~ImplSprite()85cdf0e10cSrcweir ImplSprite::~ImplSprite() 86cdf0e10cSrcweir { 87cdf0e10cSrcweir // hide the sprite on the canvas. If we don't hide the 88cdf0e10cSrcweir // sprite, it will stay on the canvas forever, since the 89cdf0e10cSrcweir // canvas naturally keeps a list of visible sprites 90cdf0e10cSrcweir // (otherwise, it wouldn't be able to paint them 91cdf0e10cSrcweir // autonomously) 92cdf0e10cSrcweir if( mxSprite.is() ) 93cdf0e10cSrcweir mxSprite->hide(); 94cdf0e10cSrcweir } 95cdf0e10cSrcweir setAlpha(const double & rAlpha)96cdf0e10cSrcweir void ImplSprite::setAlpha( const double& rAlpha ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::setAlpha(): Invalid sprite"); 99cdf0e10cSrcweir 100cdf0e10cSrcweir if( mxSprite.is() ) 101cdf0e10cSrcweir mxSprite->setAlpha( rAlpha ); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir movePixel(const::basegfx::B2DPoint & rNewPos)104cdf0e10cSrcweir void ImplSprite::movePixel( const ::basegfx::B2DPoint& rNewPos ) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::movePixel(): Invalid sprite"); 107cdf0e10cSrcweir 108cdf0e10cSrcweir if( mxSprite.is() ) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir rendering::ViewState aViewState; 111cdf0e10cSrcweir rendering::RenderState aRenderState; 112cdf0e10cSrcweir 113cdf0e10cSrcweir ::canvas::tools::initViewState( aViewState ); 114cdf0e10cSrcweir ::canvas::tools::initRenderState( aRenderState ); 115cdf0e10cSrcweir 116cdf0e10cSrcweir mxSprite->move( ::basegfx::unotools::point2DFromB2DPoint( rNewPos ), 117cdf0e10cSrcweir aViewState, 118cdf0e10cSrcweir aRenderState ); 119cdf0e10cSrcweir } 120cdf0e10cSrcweir } 121cdf0e10cSrcweir move(const::basegfx::B2DPoint & rNewPos)122cdf0e10cSrcweir void ImplSprite::move( const ::basegfx::B2DPoint& rNewPos ) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::move(): Invalid sprite"); 125cdf0e10cSrcweir 126cdf0e10cSrcweir if( mxSprite.is() ) 127cdf0e10cSrcweir { 128cdf0e10cSrcweir rendering::ViewState aViewState; 129cdf0e10cSrcweir rendering::RenderState aRenderState; 130cdf0e10cSrcweir 131cdf0e10cSrcweir ::canvas::tools::initViewState( aViewState ); 132cdf0e10cSrcweir ::canvas::tools::initRenderState( aRenderState ); 133cdf0e10cSrcweir 134cdf0e10cSrcweir ::canvas::tools::setViewStateTransform( aViewState, 135cdf0e10cSrcweir mpTransformArbiter->getTransformation() ); 136cdf0e10cSrcweir 137cdf0e10cSrcweir mxSprite->move( ::basegfx::unotools::point2DFromB2DPoint( rNewPos ), 138cdf0e10cSrcweir aViewState, 139cdf0e10cSrcweir aRenderState ); 140cdf0e10cSrcweir } 141cdf0e10cSrcweir } 142cdf0e10cSrcweir transform(const::basegfx::B2DHomMatrix & rMatrix)143cdf0e10cSrcweir void ImplSprite::transform( const ::basegfx::B2DHomMatrix& rMatrix ) 144cdf0e10cSrcweir { 145cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::transform(): Invalid sprite"); 146cdf0e10cSrcweir 147cdf0e10cSrcweir if( mxSprite.is() ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir geometry::AffineMatrix2D aMatrix; 150cdf0e10cSrcweir 151cdf0e10cSrcweir mxSprite->transform( ::basegfx::unotools::affineMatrixFromHomMatrix( aMatrix, 152cdf0e10cSrcweir rMatrix ) ); 153cdf0e10cSrcweir } 154cdf0e10cSrcweir } 155cdf0e10cSrcweir setClipPixel(const::basegfx::B2DPolyPolygon & rClipPoly)156cdf0e10cSrcweir void ImplSprite::setClipPixel( const ::basegfx::B2DPolyPolygon& rClipPoly ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir OSL_ENSURE( mxGraphicDevice.is(), "ImplSprite::setClip(): Invalid canvas"); 159cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::transform(): Invalid sprite"); 160cdf0e10cSrcweir 161cdf0e10cSrcweir if( mxSprite.is() && mxGraphicDevice.is() ) 162cdf0e10cSrcweir mxSprite->clip( ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( mxGraphicDevice, 163cdf0e10cSrcweir rClipPoly ) ); 164cdf0e10cSrcweir } 165cdf0e10cSrcweir setClip(const::basegfx::B2DPolyPolygon & rClipPoly)166cdf0e10cSrcweir void ImplSprite::setClip( const ::basegfx::B2DPolyPolygon& rClipPoly ) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir OSL_ENSURE( mxGraphicDevice.is(), "ImplSprite::setClip(): Invalid canvas"); 169cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::transform(): Invalid sprite"); 170cdf0e10cSrcweir 171cdf0e10cSrcweir if( mxSprite.is() && mxGraphicDevice.is() ) 172cdf0e10cSrcweir { 173cdf0e10cSrcweir ::basegfx::B2DPolyPolygon aTransformedClipPoly( rClipPoly ); 174cdf0e10cSrcweir 175cdf0e10cSrcweir // extract linear part of canvas view transformation (linear means: 176cdf0e10cSrcweir // without translational components) 177cdf0e10cSrcweir ::basegfx::B2DHomMatrix aViewTransform( mpTransformArbiter->getTransformation() ); 178cdf0e10cSrcweir aViewTransform.set( 0, 2, 0.0 ); 179cdf0e10cSrcweir aViewTransform.set( 1, 2, 0.0 ); 180cdf0e10cSrcweir 181cdf0e10cSrcweir // transform polygon from view to device coordinate space 182cdf0e10cSrcweir aTransformedClipPoly.transform( aViewTransform ); 183cdf0e10cSrcweir 184cdf0e10cSrcweir mxSprite->clip( ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( mxGraphicDevice, 185cdf0e10cSrcweir aTransformedClipPoly ) ); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir } 188cdf0e10cSrcweir setClip()189cdf0e10cSrcweir void ImplSprite::setClip() 190cdf0e10cSrcweir { 191cdf0e10cSrcweir OSL_ENSURE( mxGraphicDevice.is(), "ImplSprite::setClip(): Invalid canvas"); 192cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::setClip(): Invalid sprite"); 193cdf0e10cSrcweir 194cdf0e10cSrcweir if( mxSprite.is() && mxGraphicDevice.is() ) 195cdf0e10cSrcweir mxSprite->clip( uno::Reference< rendering::XPolyPolygon2D >() ); 196cdf0e10cSrcweir } 197cdf0e10cSrcweir show()198cdf0e10cSrcweir void ImplSprite::show() 199cdf0e10cSrcweir { 200cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::show(): Invalid sprite"); 201cdf0e10cSrcweir 202cdf0e10cSrcweir if( mxSprite.is() ) 203cdf0e10cSrcweir mxSprite->show(); 204cdf0e10cSrcweir } 205cdf0e10cSrcweir hide()206cdf0e10cSrcweir void ImplSprite::hide() 207cdf0e10cSrcweir { 208cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::hide(): Invalid sprite"); 209cdf0e10cSrcweir 210cdf0e10cSrcweir if( mxSprite.is() ) 211cdf0e10cSrcweir mxSprite->hide(); 212cdf0e10cSrcweir } 213cdf0e10cSrcweir setPriority(double fPriority)214cdf0e10cSrcweir void ImplSprite::setPriority( double fPriority ) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir OSL_ENSURE( mxSprite.is(), "ImplSprite::setPriority(): Invalid sprite"); 217cdf0e10cSrcweir 218cdf0e10cSrcweir if( mxSprite.is() ) 219cdf0e10cSrcweir mxSprite->setPriority(fPriority); 220cdf0e10cSrcweir } 221cdf0e10cSrcweir getUNOSprite() const222cdf0e10cSrcweir uno::Reference< rendering::XSprite > ImplSprite::getUNOSprite() const 223cdf0e10cSrcweir { 224cdf0e10cSrcweir return mxSprite; 225cdf0e10cSrcweir } 226cdf0e10cSrcweir getGraphicDevice() const227cdf0e10cSrcweir uno::Reference< rendering::XGraphicDevice > ImplSprite::getGraphicDevice() const 228cdf0e10cSrcweir { 229cdf0e10cSrcweir return mxGraphicDevice; 230cdf0e10cSrcweir } 231cdf0e10cSrcweir } 232cdf0e10cSrcweir } 233