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 // MARKER(update_precomp.py): autogen include statement, do not remove 25*b1cdbd2cSJim Jagielski #include "precompiled_slideshow.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski // must be first 28*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx> 29*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 30*b1cdbd2cSJim Jagielski #include <canvas/verbosetrace.hxx> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski #include <math.h> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski #include <comphelper/anytostring.hxx> 35*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx> 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski #include <vcl/window.hxx> 38*b1cdbd2cSJim Jagielski #include <vcl/syschild.hxx> 39*b1cdbd2cSJim Jagielski #include <vcl/salbtype.hxx> 40*b1cdbd2cSJim Jagielski 41*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx> 42*b1cdbd2cSJim Jagielski #include <basegfx/numeric/ftools.hxx> 43*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx> 44*b1cdbd2cSJim Jagielski #include <basegfx/point/b2dpoint.hxx> 45*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx> 46*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx> 47*b1cdbd2cSJim Jagielski #include <basegfx/range/b2irange.hxx> 48*b1cdbd2cSJim Jagielski #include <canvas/canvastools.hxx> 49*b1cdbd2cSJim Jagielski #include <cppcanvas/vclfactory.hxx> 50*b1cdbd2cSJim Jagielski #include <cppcanvas/basegfxfactory.hxx> 51*b1cdbd2cSJim Jagielski #include <cppcanvas/basegfxfactory.hxx> 52*b1cdbd2cSJim Jagielski #include <avmedia/mediawindow.hxx> 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XManager.hpp> 55*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XPlayer.hpp> 56*b1cdbd2cSJim Jagielski #include <com/sun/star/media/XPlayerWindow.hpp> 57*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 58*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp> 59*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/NoSupportException.hpp> 60*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp> 61*b1cdbd2cSJim Jagielski #include <com/sun/star/rendering/XCanvas.hpp> 62*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hdl> 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski #include "viewmediashape.hxx" 65*b1cdbd2cSJim Jagielski #include "mediashape.hxx" 66*b1cdbd2cSJim Jagielski #include "tools.hxx" 67*b1cdbd2cSJim Jagielski #include "unoview.hxx" 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski using namespace ::com::sun::star; 70*b1cdbd2cSJim Jagielski 71*b1cdbd2cSJim Jagielski namespace slideshow 72*b1cdbd2cSJim Jagielski { 73*b1cdbd2cSJim Jagielski namespace internal 74*b1cdbd2cSJim Jagielski { ViewMediaShape(const ViewLayerSharedPtr & rViewLayer,const uno::Reference<drawing::XShape> & rxShape,const uno::Reference<uno::XComponentContext> & rxContext)75*b1cdbd2cSJim Jagielski ViewMediaShape::ViewMediaShape( const ViewLayerSharedPtr& rViewLayer, 76*b1cdbd2cSJim Jagielski const uno::Reference< drawing::XShape >& rxShape, 77*b1cdbd2cSJim Jagielski const uno::Reference< uno::XComponentContext >& rxContext ) : 78*b1cdbd2cSJim Jagielski mpViewLayer( rViewLayer ), 79*b1cdbd2cSJim Jagielski mpMediaWindow(), 80*b1cdbd2cSJim Jagielski maWindowOffset( 0, 0 ), 81*b1cdbd2cSJim Jagielski maBounds(), 82*b1cdbd2cSJim Jagielski mxShape( rxShape ), 83*b1cdbd2cSJim Jagielski mxPlayer(), 84*b1cdbd2cSJim Jagielski mxPlayerWindow(), 85*b1cdbd2cSJim Jagielski mxComponentContext( rxContext ), 86*b1cdbd2cSJim Jagielski mbIsSoundEnabled(true) 87*b1cdbd2cSJim Jagielski { 88*b1cdbd2cSJim Jagielski ENSURE_OR_THROW( mxShape.is(), "ViewMediaShape::ViewMediaShape(): Invalid Shape" ); 89*b1cdbd2cSJim Jagielski ENSURE_OR_THROW( mpViewLayer, "ViewMediaShape::ViewMediaShape(): Invalid View" ); 90*b1cdbd2cSJim Jagielski ENSURE_OR_THROW( mpViewLayer->getCanvas(), "ViewMediaShape::ViewMediaShape(): Invalid ViewLayer canvas" ); 91*b1cdbd2cSJim Jagielski ENSURE_OR_THROW( mxComponentContext.is(), "ViewMediaShape::ViewMediaShape(): Invalid component context" ); 92*b1cdbd2cSJim Jagielski 93*b1cdbd2cSJim Jagielski UnoViewSharedPtr pUnoView (::boost::dynamic_pointer_cast<UnoView>(rViewLayer)); 94*b1cdbd2cSJim Jagielski if (pUnoView) 95*b1cdbd2cSJim Jagielski { 96*b1cdbd2cSJim Jagielski mbIsSoundEnabled = pUnoView->isSoundEnabled(); 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski } 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 101*b1cdbd2cSJim Jagielski ~ViewMediaShape()102*b1cdbd2cSJim Jagielski ViewMediaShape::~ViewMediaShape() 103*b1cdbd2cSJim Jagielski { 104*b1cdbd2cSJim Jagielski try 105*b1cdbd2cSJim Jagielski { 106*b1cdbd2cSJim Jagielski endMedia(); 107*b1cdbd2cSJim Jagielski } 108*b1cdbd2cSJim Jagielski catch (uno::Exception &) 109*b1cdbd2cSJim Jagielski { 110*b1cdbd2cSJim Jagielski OSL_ENSURE( false, rtl::OUStringToOString( 111*b1cdbd2cSJim Jagielski comphelper::anyToString( 112*b1cdbd2cSJim Jagielski cppu::getCaughtException() ), 113*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_UTF8 ).getStr() ); 114*b1cdbd2cSJim Jagielski } 115*b1cdbd2cSJim Jagielski } 116*b1cdbd2cSJim Jagielski 117*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 118*b1cdbd2cSJim Jagielski getViewLayer() const119*b1cdbd2cSJim Jagielski ViewLayerSharedPtr ViewMediaShape::getViewLayer() const 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski return mpViewLayer; 122*b1cdbd2cSJim Jagielski } 123*b1cdbd2cSJim Jagielski 124*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 125*b1cdbd2cSJim Jagielski startMedia()126*b1cdbd2cSJim Jagielski bool ViewMediaShape::startMedia() 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski if( !mxPlayer.is() ) 129*b1cdbd2cSJim Jagielski implInitialize( maBounds ); 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) ) 132*b1cdbd2cSJim Jagielski mxPlayer->start(); 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski return true; 135*b1cdbd2cSJim Jagielski } 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 138*b1cdbd2cSJim Jagielski endMedia()139*b1cdbd2cSJim Jagielski void ViewMediaShape::endMedia() 140*b1cdbd2cSJim Jagielski { 141*b1cdbd2cSJim Jagielski // shutdown player window 142*b1cdbd2cSJim Jagielski if( mxPlayerWindow.is() ) 143*b1cdbd2cSJim Jagielski { 144*b1cdbd2cSJim Jagielski uno::Reference< lang::XComponent > xComponent( mxPlayerWindow, uno::UNO_QUERY ); 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski if( xComponent.is() ) 147*b1cdbd2cSJim Jagielski xComponent->dispose(); 148*b1cdbd2cSJim Jagielski 149*b1cdbd2cSJim Jagielski mxPlayerWindow.clear(); 150*b1cdbd2cSJim Jagielski } 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski mpMediaWindow = ::std::auto_ptr< SystemChildWindow >(); 153*b1cdbd2cSJim Jagielski 154*b1cdbd2cSJim Jagielski // shutdown player 155*b1cdbd2cSJim Jagielski if( mxPlayer.is() ) 156*b1cdbd2cSJim Jagielski { 157*b1cdbd2cSJim Jagielski mxPlayer->stop(); 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski uno::Reference< lang::XComponent > xComponent( mxPlayer, uno::UNO_QUERY ); 160*b1cdbd2cSJim Jagielski 161*b1cdbd2cSJim Jagielski if( xComponent.is() ) 162*b1cdbd2cSJim Jagielski xComponent->dispose(); 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski mxPlayer.clear(); 165*b1cdbd2cSJim Jagielski } 166*b1cdbd2cSJim Jagielski } 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 169*b1cdbd2cSJim Jagielski pauseMedia()170*b1cdbd2cSJim Jagielski void ViewMediaShape::pauseMedia() 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) ) 173*b1cdbd2cSJim Jagielski mxPlayer->stop(); 174*b1cdbd2cSJim Jagielski } 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 177*b1cdbd2cSJim Jagielski setMediaTime(double fTime)178*b1cdbd2cSJim Jagielski void ViewMediaShape::setMediaTime(double fTime) 179*b1cdbd2cSJim Jagielski { 180*b1cdbd2cSJim Jagielski if( mxPlayer.is() && ( mxPlayer->getDuration() > 0.0 ) ) 181*b1cdbd2cSJim Jagielski mxPlayer->setMediaTime(fTime); 182*b1cdbd2cSJim Jagielski } 183*b1cdbd2cSJim Jagielski 184*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 185*b1cdbd2cSJim Jagielski render(const::basegfx::B2DRectangle & rBounds) const186*b1cdbd2cSJim Jagielski bool ViewMediaShape::render( const ::basegfx::B2DRectangle& rBounds ) const 187*b1cdbd2cSJim Jagielski { 188*b1cdbd2cSJim Jagielski ::cppcanvas::CanvasSharedPtr pCanvas = mpViewLayer->getCanvas();; 189*b1cdbd2cSJim Jagielski 190*b1cdbd2cSJim Jagielski if( !pCanvas ) 191*b1cdbd2cSJim Jagielski return false; 192*b1cdbd2cSJim Jagielski 193*b1cdbd2cSJim Jagielski if( !mpMediaWindow.get() && !mxPlayerWindow.is() ) 194*b1cdbd2cSJim Jagielski { 195*b1cdbd2cSJim Jagielski // fill the shape background with black 196*b1cdbd2cSJim Jagielski fillRect( pCanvas, 197*b1cdbd2cSJim Jagielski rBounds, 198*b1cdbd2cSJim Jagielski 0x000000FFU ); 199*b1cdbd2cSJim Jagielski } 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski return true; 202*b1cdbd2cSJim Jagielski } 203*b1cdbd2cSJim Jagielski resize(const::basegfx::B2DRectangle & rNewBounds) const204*b1cdbd2cSJim Jagielski bool ViewMediaShape::resize( const ::basegfx::B2DRectangle& rNewBounds ) const 205*b1cdbd2cSJim Jagielski { 206*b1cdbd2cSJim Jagielski maBounds = rNewBounds; 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski ::cppcanvas::CanvasSharedPtr pCanvas = mpViewLayer->getCanvas();; 209*b1cdbd2cSJim Jagielski 210*b1cdbd2cSJim Jagielski if( !pCanvas ) 211*b1cdbd2cSJim Jagielski return false; 212*b1cdbd2cSJim Jagielski 213*b1cdbd2cSJim Jagielski if( !mxPlayerWindow.is() ) 214*b1cdbd2cSJim Jagielski return true; 215*b1cdbd2cSJim Jagielski 216*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPropSet( pCanvas->getUNOCanvas()->getDevice(), 217*b1cdbd2cSJim Jagielski uno::UNO_QUERY ); 218*b1cdbd2cSJim Jagielski 219*b1cdbd2cSJim Jagielski uno::Reference< awt::XWindow > xParentWindow; 220*b1cdbd2cSJim Jagielski if( xPropSet.is() && 221*b1cdbd2cSJim Jagielski getPropertyValue( xParentWindow, 222*b1cdbd2cSJim Jagielski xPropSet, 223*b1cdbd2cSJim Jagielski ::rtl::OUString::createFromAscii( "Window" )) ) 224*b1cdbd2cSJim Jagielski { 225*b1cdbd2cSJim Jagielski const awt::Rectangle aRect( xParentWindow->getPosSize() ); 226*b1cdbd2cSJim Jagielski 227*b1cdbd2cSJim Jagielski maWindowOffset.X = aRect.X; 228*b1cdbd2cSJim Jagielski maWindowOffset.Y = aRect.Y; 229*b1cdbd2cSJim Jagielski } 230*b1cdbd2cSJim Jagielski 231*b1cdbd2cSJim Jagielski ::basegfx::B2DRange aTmpRange; 232*b1cdbd2cSJim Jagielski ::canvas::tools::calcTransformedRectBounds( aTmpRange, 233*b1cdbd2cSJim Jagielski rNewBounds, 234*b1cdbd2cSJim Jagielski mpViewLayer->getTransformation() ); 235*b1cdbd2cSJim Jagielski const ::basegfx::B2IRange& rRangePix( 236*b1cdbd2cSJim Jagielski ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange )); 237*b1cdbd2cSJim Jagielski 238*b1cdbd2cSJim Jagielski mxPlayerWindow->setEnable( !rRangePix.isEmpty() ); 239*b1cdbd2cSJim Jagielski 240*b1cdbd2cSJim Jagielski if( rRangePix.isEmpty() ) 241*b1cdbd2cSJim Jagielski return true; 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski const Point aPosPixel( rRangePix.getMinX() + maWindowOffset.X, 244*b1cdbd2cSJim Jagielski rRangePix.getMinY() + maWindowOffset.Y ); 245*b1cdbd2cSJim Jagielski const Size aSizePixel( rRangePix.getMaxX() - rRangePix.getMinX(), 246*b1cdbd2cSJim Jagielski rRangePix.getMaxY() - rRangePix.getMinY() ); 247*b1cdbd2cSJim Jagielski 248*b1cdbd2cSJim Jagielski if( mpMediaWindow.get() ) 249*b1cdbd2cSJim Jagielski { 250*b1cdbd2cSJim Jagielski mpMediaWindow->SetPosSizePixel( aPosPixel, aSizePixel ); 251*b1cdbd2cSJim Jagielski mxPlayerWindow->setPosSize( 0, 0, 252*b1cdbd2cSJim Jagielski aSizePixel.Width(), aSizePixel.Height(), 253*b1cdbd2cSJim Jagielski 0 ); 254*b1cdbd2cSJim Jagielski } 255*b1cdbd2cSJim Jagielski else 256*b1cdbd2cSJim Jagielski { 257*b1cdbd2cSJim Jagielski mxPlayerWindow->setPosSize( aPosPixel.X(), aPosPixel.Y(), 258*b1cdbd2cSJim Jagielski aSizePixel.Width(), aSizePixel.Height(), 259*b1cdbd2cSJim Jagielski 0 ); 260*b1cdbd2cSJim Jagielski } 261*b1cdbd2cSJim Jagielski 262*b1cdbd2cSJim Jagielski return true; 263*b1cdbd2cSJim Jagielski } 264*b1cdbd2cSJim Jagielski 265*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 266*b1cdbd2cSJim Jagielski implInitialize(const::basegfx::B2DRectangle & rBounds)267*b1cdbd2cSJim Jagielski bool ViewMediaShape::implInitialize( const ::basegfx::B2DRectangle& rBounds ) 268*b1cdbd2cSJim Jagielski { 269*b1cdbd2cSJim Jagielski if( !mxPlayer.is() && mxShape.is() ) 270*b1cdbd2cSJim Jagielski { 271*b1cdbd2cSJim Jagielski ENSURE_OR_RETURN_FALSE( mpViewLayer->getCanvas(), 272*b1cdbd2cSJim Jagielski "ViewMediaShape::update(): Invalid layer canvas" ); 273*b1cdbd2cSJim Jagielski 274*b1cdbd2cSJim Jagielski uno::Reference< rendering::XCanvas > xCanvas( mpViewLayer->getCanvas()->getUNOCanvas() ); 275*b1cdbd2cSJim Jagielski 276*b1cdbd2cSJim Jagielski if( xCanvas.is() ) 277*b1cdbd2cSJim Jagielski { 278*b1cdbd2cSJim Jagielski uno::Reference< beans::XPropertySet > xPropSet; 279*b1cdbd2cSJim Jagielski ::rtl::OUString aURL; 280*b1cdbd2cSJim Jagielski 281*b1cdbd2cSJim Jagielski try 282*b1cdbd2cSJim Jagielski { 283*b1cdbd2cSJim Jagielski xPropSet.set( mxShape, uno::UNO_QUERY ); 284*b1cdbd2cSJim Jagielski 285*b1cdbd2cSJim Jagielski // create Player 286*b1cdbd2cSJim Jagielski if( xPropSet.is() && 287*b1cdbd2cSJim Jagielski ( xPropSet->getPropertyValue( 288*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaURL" ) ) ) >>=aURL ) ) 289*b1cdbd2cSJim Jagielski { 290*b1cdbd2cSJim Jagielski implInitializeMediaPlayer( aURL ); 291*b1cdbd2cSJim Jagielski } 292*b1cdbd2cSJim Jagielski 293*b1cdbd2cSJim Jagielski // create visible object 294*b1cdbd2cSJim Jagielski uno::Sequence< uno::Any > aDeviceParams; 295*b1cdbd2cSJim Jagielski 296*b1cdbd2cSJim Jagielski if( ::canvas::tools::getDeviceInfo( xCanvas, aDeviceParams ).getLength() > 1 ) 297*b1cdbd2cSJim Jagielski { 298*b1cdbd2cSJim Jagielski ::rtl::OUString aImplName; 299*b1cdbd2cSJim Jagielski 300*b1cdbd2cSJim Jagielski aDeviceParams[ 0 ] >>= aImplName; 301*b1cdbd2cSJim Jagielski 302*b1cdbd2cSJim Jagielski if( aImplName.endsWithIgnoreAsciiCaseAsciiL( 303*b1cdbd2cSJim Jagielski RTL_CONSTASCII_STRINGPARAM("VCL") )) 304*b1cdbd2cSJim Jagielski { 305*b1cdbd2cSJim Jagielski implInitializeVCLBasedPlayerWindow( rBounds, aDeviceParams ); 306*b1cdbd2cSJim Jagielski } 307*b1cdbd2cSJim Jagielski else if( aImplName.endsWithIgnoreAsciiCaseAsciiL( 308*b1cdbd2cSJim Jagielski RTL_CONSTASCII_STRINGPARAM("DX")) || 309*b1cdbd2cSJim Jagielski aImplName.endsWithIgnoreAsciiCaseAsciiL( 310*b1cdbd2cSJim Jagielski RTL_CONSTASCII_STRINGPARAM("DX9"))) 311*b1cdbd2cSJim Jagielski { 312*b1cdbd2cSJim Jagielski implInitializeDXBasedPlayerWindow( rBounds, aDeviceParams ); 313*b1cdbd2cSJim Jagielski } 314*b1cdbd2cSJim Jagielski } 315*b1cdbd2cSJim Jagielski 316*b1cdbd2cSJim Jagielski // set player properties 317*b1cdbd2cSJim Jagielski implSetMediaProperties( xPropSet ); 318*b1cdbd2cSJim Jagielski } 319*b1cdbd2cSJim Jagielski catch( uno::RuntimeException& ) 320*b1cdbd2cSJim Jagielski { 321*b1cdbd2cSJim Jagielski throw; 322*b1cdbd2cSJim Jagielski } 323*b1cdbd2cSJim Jagielski catch( uno::Exception& ) 324*b1cdbd2cSJim Jagielski { 325*b1cdbd2cSJim Jagielski OSL_ENSURE( false, 326*b1cdbd2cSJim Jagielski rtl::OUStringToOString( 327*b1cdbd2cSJim Jagielski comphelper::anyToString( cppu::getCaughtException() ), 328*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_UTF8 ).getStr() ); 329*b1cdbd2cSJim Jagielski } 330*b1cdbd2cSJim Jagielski } 331*b1cdbd2cSJim Jagielski } 332*b1cdbd2cSJim Jagielski 333*b1cdbd2cSJim Jagielski return mxPlayer.is() || mxPlayerWindow.is(); 334*b1cdbd2cSJim Jagielski } 335*b1cdbd2cSJim Jagielski 336*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 337*b1cdbd2cSJim Jagielski implSetMediaProperties(const uno::Reference<beans::XPropertySet> & rxProps)338*b1cdbd2cSJim Jagielski void ViewMediaShape::implSetMediaProperties( const uno::Reference< beans::XPropertySet >& rxProps ) 339*b1cdbd2cSJim Jagielski { 340*b1cdbd2cSJim Jagielski if( mxPlayer.is() ) 341*b1cdbd2cSJim Jagielski { 342*b1cdbd2cSJim Jagielski mxPlayer->setMediaTime( 0.0 ); 343*b1cdbd2cSJim Jagielski 344*b1cdbd2cSJim Jagielski if( rxProps.is() ) 345*b1cdbd2cSJim Jagielski { 346*b1cdbd2cSJim Jagielski sal_Bool bLoop( false ); 347*b1cdbd2cSJim Jagielski getPropertyValue( bLoop, 348*b1cdbd2cSJim Jagielski rxProps, 349*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Loop" ))); 350*b1cdbd2cSJim Jagielski mxPlayer->setPlaybackLoop( bLoop ); 351*b1cdbd2cSJim Jagielski 352*b1cdbd2cSJim Jagielski sal_Bool bMute( false ); 353*b1cdbd2cSJim Jagielski getPropertyValue( bMute, 354*b1cdbd2cSJim Jagielski rxProps, 355*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Mute" ))); 356*b1cdbd2cSJim Jagielski mxPlayer->setMute( bMute || !mbIsSoundEnabled); 357*b1cdbd2cSJim Jagielski 358*b1cdbd2cSJim Jagielski sal_Int16 nVolumeDB(0); 359*b1cdbd2cSJim Jagielski getPropertyValue( nVolumeDB, 360*b1cdbd2cSJim Jagielski rxProps, 361*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "VolumeDB" ))); 362*b1cdbd2cSJim Jagielski mxPlayer->setVolumeDB( nVolumeDB ); 363*b1cdbd2cSJim Jagielski 364*b1cdbd2cSJim Jagielski if( mxPlayerWindow.is() ) 365*b1cdbd2cSJim Jagielski { 366*b1cdbd2cSJim Jagielski media::ZoomLevel eZoom(media::ZoomLevel_FIT_TO_WINDOW); 367*b1cdbd2cSJim Jagielski getPropertyValue( eZoom, 368*b1cdbd2cSJim Jagielski rxProps, 369*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Zoom" ))); 370*b1cdbd2cSJim Jagielski mxPlayerWindow->setZoomLevel( eZoom ); 371*b1cdbd2cSJim Jagielski } 372*b1cdbd2cSJim Jagielski } 373*b1cdbd2cSJim Jagielski } 374*b1cdbd2cSJim Jagielski } 375*b1cdbd2cSJim Jagielski 376*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 377*b1cdbd2cSJim Jagielski implInitializeMediaPlayer(const::rtl::OUString & rMediaURL)378*b1cdbd2cSJim Jagielski void ViewMediaShape::implInitializeMediaPlayer( const ::rtl::OUString& rMediaURL ) 379*b1cdbd2cSJim Jagielski { 380*b1cdbd2cSJim Jagielski if( !mxPlayer.is() ) 381*b1cdbd2cSJim Jagielski { 382*b1cdbd2cSJim Jagielski try 383*b1cdbd2cSJim Jagielski { 384*b1cdbd2cSJim Jagielski if( rMediaURL.getLength() ) 385*b1cdbd2cSJim Jagielski { 386*b1cdbd2cSJim Jagielski mxPlayer.set( avmedia::MediaWindow::createPlayer( rMediaURL ), 387*b1cdbd2cSJim Jagielski uno::UNO_QUERY ); 388*b1cdbd2cSJim Jagielski } 389*b1cdbd2cSJim Jagielski } 390*b1cdbd2cSJim Jagielski catch( uno::RuntimeException& ) 391*b1cdbd2cSJim Jagielski { 392*b1cdbd2cSJim Jagielski throw; 393*b1cdbd2cSJim Jagielski } 394*b1cdbd2cSJim Jagielski catch( const uno::Exception& ) 395*b1cdbd2cSJim Jagielski { 396*b1cdbd2cSJim Jagielski throw lang::NoSupportException( 397*b1cdbd2cSJim Jagielski rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 398*b1cdbd2cSJim Jagielski "No video support for ") ) + rMediaURL, 399*b1cdbd2cSJim Jagielski uno::Reference<uno::XInterface>() ); 400*b1cdbd2cSJim Jagielski } 401*b1cdbd2cSJim Jagielski } 402*b1cdbd2cSJim Jagielski } 403*b1cdbd2cSJim Jagielski 404*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 405*b1cdbd2cSJim Jagielski implInitializeVCLBasedPlayerWindow(const::basegfx::B2DRectangle & rBounds,const uno::Sequence<uno::Any> & rVCLDeviceParams)406*b1cdbd2cSJim Jagielski bool ViewMediaShape::implInitializeVCLBasedPlayerWindow( const ::basegfx::B2DRectangle& rBounds, 407*b1cdbd2cSJim Jagielski const uno::Sequence< uno::Any >& rVCLDeviceParams) 408*b1cdbd2cSJim Jagielski { 409*b1cdbd2cSJim Jagielski if( !mpMediaWindow.get() && !rBounds.isEmpty() ) 410*b1cdbd2cSJim Jagielski { 411*b1cdbd2cSJim Jagielski try 412*b1cdbd2cSJim Jagielski { 413*b1cdbd2cSJim Jagielski sal_Int64 aVal=0; 414*b1cdbd2cSJim Jagielski 415*b1cdbd2cSJim Jagielski rVCLDeviceParams[ 1 ] >>= aVal; 416*b1cdbd2cSJim Jagielski 417*b1cdbd2cSJim Jagielski Window* pWindow = reinterpret_cast< Window* >( aVal ); 418*b1cdbd2cSJim Jagielski 419*b1cdbd2cSJim Jagielski if( pWindow ) 420*b1cdbd2cSJim Jagielski { 421*b1cdbd2cSJim Jagielski ::basegfx::B2DRange aTmpRange; 422*b1cdbd2cSJim Jagielski ::canvas::tools::calcTransformedRectBounds( aTmpRange, 423*b1cdbd2cSJim Jagielski rBounds, 424*b1cdbd2cSJim Jagielski mpViewLayer->getTransformation() ); 425*b1cdbd2cSJim Jagielski const ::basegfx::B2IRange& rRangePix( 426*b1cdbd2cSJim Jagielski ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange )); 427*b1cdbd2cSJim Jagielski 428*b1cdbd2cSJim Jagielski if( !rRangePix.isEmpty() ) 429*b1cdbd2cSJim Jagielski { 430*b1cdbd2cSJim Jagielski uno::Sequence< uno::Any > aArgs( 3 ); 431*b1cdbd2cSJim Jagielski awt::Rectangle aAWTRect( rRangePix.getMinX(), 432*b1cdbd2cSJim Jagielski rRangePix.getMinY(), 433*b1cdbd2cSJim Jagielski rRangePix.getMaxX() - rRangePix.getMinX(), 434*b1cdbd2cSJim Jagielski rRangePix.getMaxY() - rRangePix.getMinY() ); 435*b1cdbd2cSJim Jagielski 436*b1cdbd2cSJim Jagielski mpMediaWindow = ::std::auto_ptr< SystemChildWindow >( new 437*b1cdbd2cSJim Jagielski SystemChildWindow( pWindow, WB_CLIPCHILDREN ) ); 438*b1cdbd2cSJim Jagielski mpMediaWindow->SetBackground( Color( COL_BLACK ) ); 439*b1cdbd2cSJim Jagielski mpMediaWindow->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ), 440*b1cdbd2cSJim Jagielski Size( aAWTRect.Width, aAWTRect.Height ) ); 441*b1cdbd2cSJim Jagielski mpMediaWindow->Show(); 442*b1cdbd2cSJim Jagielski 443*b1cdbd2cSJim Jagielski if( mxPlayer.is() ) 444*b1cdbd2cSJim Jagielski { 445*b1cdbd2cSJim Jagielski aArgs[ 0 ] = uno::makeAny( 446*b1cdbd2cSJim Jagielski sal::static_int_cast< sal_IntPtr >( mpMediaWindow->GetParentWindowHandle() ) ); 447*b1cdbd2cSJim Jagielski 448*b1cdbd2cSJim Jagielski aAWTRect.X = aAWTRect.Y = 0; 449*b1cdbd2cSJim Jagielski aArgs[ 1 ] = uno::makeAny( aAWTRect ); 450*b1cdbd2cSJim Jagielski 451*b1cdbd2cSJim Jagielski aArgs[ 2 ] = uno::makeAny( reinterpret_cast< sal_IntPtr >( mpMediaWindow.get() ) ); 452*b1cdbd2cSJim Jagielski 453*b1cdbd2cSJim Jagielski mxPlayerWindow.set( mxPlayer->createPlayerWindow( aArgs ) ); 454*b1cdbd2cSJim Jagielski 455*b1cdbd2cSJim Jagielski if( mxPlayerWindow.is() ) 456*b1cdbd2cSJim Jagielski { 457*b1cdbd2cSJim Jagielski mxPlayerWindow->setVisible( true ); 458*b1cdbd2cSJim Jagielski mxPlayerWindow->setEnable( true ); 459*b1cdbd2cSJim Jagielski } 460*b1cdbd2cSJim Jagielski } 461*b1cdbd2cSJim Jagielski } 462*b1cdbd2cSJim Jagielski } 463*b1cdbd2cSJim Jagielski } 464*b1cdbd2cSJim Jagielski catch( uno::RuntimeException& ) 465*b1cdbd2cSJim Jagielski { 466*b1cdbd2cSJim Jagielski throw; 467*b1cdbd2cSJim Jagielski } 468*b1cdbd2cSJim Jagielski catch( uno::Exception& ) 469*b1cdbd2cSJim Jagielski { 470*b1cdbd2cSJim Jagielski OSL_ENSURE( false, 471*b1cdbd2cSJim Jagielski rtl::OUStringToOString( 472*b1cdbd2cSJim Jagielski comphelper::anyToString( cppu::getCaughtException() ), 473*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_UTF8 ).getStr() ); 474*b1cdbd2cSJim Jagielski } 475*b1cdbd2cSJim Jagielski } 476*b1cdbd2cSJim Jagielski 477*b1cdbd2cSJim Jagielski return mxPlayerWindow.is(); 478*b1cdbd2cSJim Jagielski } 479*b1cdbd2cSJim Jagielski 480*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------- 481*b1cdbd2cSJim Jagielski implInitializeDXBasedPlayerWindow(const::basegfx::B2DRectangle & rBounds,const uno::Sequence<uno::Any> & rDXDeviceParams)482*b1cdbd2cSJim Jagielski bool ViewMediaShape::implInitializeDXBasedPlayerWindow( const ::basegfx::B2DRectangle& rBounds, 483*b1cdbd2cSJim Jagielski const uno::Sequence< uno::Any >& rDXDeviceParams ) 484*b1cdbd2cSJim Jagielski { 485*b1cdbd2cSJim Jagielski if( !mxPlayerWindow.is() ) 486*b1cdbd2cSJim Jagielski { 487*b1cdbd2cSJim Jagielski try 488*b1cdbd2cSJim Jagielski { 489*b1cdbd2cSJim Jagielski if( rDXDeviceParams.getLength() == 2 ) 490*b1cdbd2cSJim Jagielski { 491*b1cdbd2cSJim Jagielski sal_Int64 aWNDVal=0; 492*b1cdbd2cSJim Jagielski 493*b1cdbd2cSJim Jagielski rDXDeviceParams[ 1 ] >>= aWNDVal; 494*b1cdbd2cSJim Jagielski 495*b1cdbd2cSJim Jagielski if( aWNDVal ) 496*b1cdbd2cSJim Jagielski { 497*b1cdbd2cSJim Jagielski ::basegfx::B2DRange aTmpRange; 498*b1cdbd2cSJim Jagielski ::canvas::tools::calcTransformedRectBounds( aTmpRange, 499*b1cdbd2cSJim Jagielski rBounds, 500*b1cdbd2cSJim Jagielski mpViewLayer->getTransformation() ); 501*b1cdbd2cSJim Jagielski const ::basegfx::B2IRange& rRangePix( 502*b1cdbd2cSJim Jagielski ::basegfx::unotools::b2ISurroundingRangeFromB2DRange( aTmpRange )); 503*b1cdbd2cSJim Jagielski 504*b1cdbd2cSJim Jagielski if( !rRangePix.isEmpty() ) 505*b1cdbd2cSJim Jagielski { 506*b1cdbd2cSJim Jagielski uno::Sequence< uno::Any > aArgs( 2 ); 507*b1cdbd2cSJim Jagielski awt::Rectangle aAWTRect( rRangePix.getMinX() + maWindowOffset.X, 508*b1cdbd2cSJim Jagielski rRangePix.getMinY() + maWindowOffset.Y, 509*b1cdbd2cSJim Jagielski rRangePix.getMaxX() - rRangePix.getMinX(), 510*b1cdbd2cSJim Jagielski rRangePix.getMaxY() - rRangePix.getMinY() ); 511*b1cdbd2cSJim Jagielski 512*b1cdbd2cSJim Jagielski if( mxPlayer.is() ) 513*b1cdbd2cSJim Jagielski { 514*b1cdbd2cSJim Jagielski aArgs[ 0 ] = uno::makeAny( sal::static_int_cast< sal_Int32 >( aWNDVal) ); 515*b1cdbd2cSJim Jagielski aArgs[ 1 ] = uno::makeAny( aAWTRect ); 516*b1cdbd2cSJim Jagielski 517*b1cdbd2cSJim Jagielski mxPlayerWindow.set( mxPlayer->createPlayerWindow( aArgs ) ); 518*b1cdbd2cSJim Jagielski } 519*b1cdbd2cSJim Jagielski } 520*b1cdbd2cSJim Jagielski } 521*b1cdbd2cSJim Jagielski } 522*b1cdbd2cSJim Jagielski } 523*b1cdbd2cSJim Jagielski catch( uno::RuntimeException& ) 524*b1cdbd2cSJim Jagielski { 525*b1cdbd2cSJim Jagielski throw; 526*b1cdbd2cSJim Jagielski } 527*b1cdbd2cSJim Jagielski catch( uno::Exception& ) 528*b1cdbd2cSJim Jagielski { 529*b1cdbd2cSJim Jagielski OSL_ENSURE( false, 530*b1cdbd2cSJim Jagielski rtl::OUStringToOString( 531*b1cdbd2cSJim Jagielski comphelper::anyToString( cppu::getCaughtException() ), 532*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_UTF8 ).getStr() ); 533*b1cdbd2cSJim Jagielski } 534*b1cdbd2cSJim Jagielski } 535*b1cdbd2cSJim Jagielski 536*b1cdbd2cSJim Jagielski return mxPlayerWindow.is(); 537*b1cdbd2cSJim Jagielski } 538*b1cdbd2cSJim Jagielski } 539*b1cdbd2cSJim Jagielski } 540