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_canvas.hxx" 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <canvas/debug.hxx> 28*b1cdbd2cSJim Jagielski #include <canvas/verbosetrace.hxx> 29*b1cdbd2cSJim Jagielski #include <canvas/canvastools.hxx> 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx> 32*b1cdbd2cSJim Jagielski #include <cppuhelper/compbase1.hxx> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/NoSupportException.hpp> 35*b1cdbd2cSJim Jagielski 36*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx> 37*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx> 38*b1cdbd2cSJim Jagielski #include <basegfx/tools/unopolypolygon.hxx> 39*b1cdbd2cSJim Jagielski 40*b1cdbd2cSJim Jagielski #include <vcl/syschild.hxx> 41*b1cdbd2cSJim Jagielski #include <vcl/canvastools.hxx> 42*b1cdbd2cSJim Jagielski 43*b1cdbd2cSJim Jagielski #include "cairo_spritecanvas.hxx" 44*b1cdbd2cSJim Jagielski #include "cairo_canvasbitmap.hxx" 45*b1cdbd2cSJim Jagielski #include "cairo_devicehelper.hxx" 46*b1cdbd2cSJim Jagielski #include "cairo_cairo.hxx" 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski using namespace ::cairo; 49*b1cdbd2cSJim Jagielski using namespace ::com::sun::star; 50*b1cdbd2cSJim Jagielski 51*b1cdbd2cSJim Jagielski namespace cairocanvas 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski SpriteDeviceHelper()54*b1cdbd2cSJim Jagielski SpriteDeviceHelper::SpriteDeviceHelper() : 55*b1cdbd2cSJim Jagielski mpSpriteCanvas( NULL ), 56*b1cdbd2cSJim Jagielski mpBufferSurface(), 57*b1cdbd2cSJim Jagielski maSize(), 58*b1cdbd2cSJim Jagielski mbFullScreen( false ) 59*b1cdbd2cSJim Jagielski {} 60*b1cdbd2cSJim Jagielski init(Window & rOutputWindow,SpriteCanvas & rSpriteCanvas,const::basegfx::B2ISize & rSize,bool bFullscreen)61*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::init( Window& rOutputWindow, 62*b1cdbd2cSJim Jagielski SpriteCanvas& rSpriteCanvas, 63*b1cdbd2cSJim Jagielski const ::basegfx::B2ISize& rSize, 64*b1cdbd2cSJim Jagielski bool bFullscreen ) 65*b1cdbd2cSJim Jagielski { 66*b1cdbd2cSJim Jagielski DeviceHelper::init(rSpriteCanvas, 67*b1cdbd2cSJim Jagielski rOutputWindow); 68*b1cdbd2cSJim Jagielski 69*b1cdbd2cSJim Jagielski mpSpriteCanvas = &rSpriteCanvas; 70*b1cdbd2cSJim Jagielski mbFullScreen = bFullscreen; 71*b1cdbd2cSJim Jagielski 72*b1cdbd2cSJim Jagielski setSize( rSize ); 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski disposing()75*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::disposing() 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski // release all references 78*b1cdbd2cSJim Jagielski mpBufferSurface.reset(); 79*b1cdbd2cSJim Jagielski mpSpriteCanvas = NULL; 80*b1cdbd2cSJim Jagielski } 81*b1cdbd2cSJim Jagielski createBuffers(::sal_Int32)82*b1cdbd2cSJim Jagielski ::sal_Int32 SpriteDeviceHelper::createBuffers( ::sal_Int32 /*nBuffers*/ ) 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski // TODO(F3): implement XBufferStrategy interface. For now, we 85*b1cdbd2cSJim Jagielski // _always_ will have exactly one backbuffer 86*b1cdbd2cSJim Jagielski return 1; 87*b1cdbd2cSJim Jagielski } 88*b1cdbd2cSJim Jagielski destroyBuffers()89*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::destroyBuffers() 90*b1cdbd2cSJim Jagielski { 91*b1cdbd2cSJim Jagielski // TODO(F3): implement XBufferStrategy interface. For now, we 92*b1cdbd2cSJim Jagielski // _always_ will have exactly one backbuffer 93*b1cdbd2cSJim Jagielski } 94*b1cdbd2cSJim Jagielski showBuffer(bool,::sal_Bool)95*b1cdbd2cSJim Jagielski ::sal_Bool SpriteDeviceHelper::showBuffer( bool, ::sal_Bool ) 96*b1cdbd2cSJim Jagielski { 97*b1cdbd2cSJim Jagielski OSL_ENSURE(false,"Not supposed to be called, handled by SpriteCanvas"); 98*b1cdbd2cSJim Jagielski return sal_False; 99*b1cdbd2cSJim Jagielski } 100*b1cdbd2cSJim Jagielski switchBuffer(bool,::sal_Bool)101*b1cdbd2cSJim Jagielski ::sal_Bool SpriteDeviceHelper::switchBuffer( bool, ::sal_Bool ) 102*b1cdbd2cSJim Jagielski { 103*b1cdbd2cSJim Jagielski OSL_ENSURE(false,"Not supposed to be called, handled by SpriteCanvas"); 104*b1cdbd2cSJim Jagielski return sal_False; 105*b1cdbd2cSJim Jagielski } 106*b1cdbd2cSJim Jagielski isAccelerated() const107*b1cdbd2cSJim Jagielski uno::Any SpriteDeviceHelper::isAccelerated() const 108*b1cdbd2cSJim Jagielski { 109*b1cdbd2cSJim Jagielski return ::com::sun::star::uno::makeAny(true); 110*b1cdbd2cSJim Jagielski } 111*b1cdbd2cSJim Jagielski getDeviceHandle() const112*b1cdbd2cSJim Jagielski uno::Any SpriteDeviceHelper::getDeviceHandle() const 113*b1cdbd2cSJim Jagielski { 114*b1cdbd2cSJim Jagielski return DeviceHelper::getDeviceHandle(); 115*b1cdbd2cSJim Jagielski } 116*b1cdbd2cSJim Jagielski getSurfaceHandle() const117*b1cdbd2cSJim Jagielski uno::Any SpriteDeviceHelper::getSurfaceHandle() const 118*b1cdbd2cSJim Jagielski { 119*b1cdbd2cSJim Jagielski return DeviceHelper::getSurfaceHandle(); 120*b1cdbd2cSJim Jagielski } 121*b1cdbd2cSJim Jagielski setSize(const::basegfx::B2ISize & rSize)122*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::setSize( const ::basegfx::B2ISize& rSize ) 123*b1cdbd2cSJim Jagielski { 124*b1cdbd2cSJim Jagielski OSL_TRACE("SpriteDeviceHelper::setSize(): device size %d x %d", rSize.getX(), rSize.getY() ); 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski if( !mpSpriteCanvas ) 127*b1cdbd2cSJim Jagielski return; // disposed 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski DeviceHelper::setSize(rSize); 130*b1cdbd2cSJim Jagielski 131*b1cdbd2cSJim Jagielski if( mpBufferSurface && maSize != rSize ) 132*b1cdbd2cSJim Jagielski mpBufferSurface.reset(); 133*b1cdbd2cSJim Jagielski if( !mpBufferSurface ) 134*b1cdbd2cSJim Jagielski mpBufferSurface = getWindowSurface()->getSimilar( 135*b1cdbd2cSJim Jagielski CAIRO_CONTENT_COLOR, 136*b1cdbd2cSJim Jagielski rSize.getX(), rSize.getY() ); 137*b1cdbd2cSJim Jagielski 138*b1cdbd2cSJim Jagielski if( maSize != rSize ) 139*b1cdbd2cSJim Jagielski maSize = rSize; 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski mpSpriteCanvas->setSizePixel( maSize ); 142*b1cdbd2cSJim Jagielski } 143*b1cdbd2cSJim Jagielski getSizePixel()144*b1cdbd2cSJim Jagielski const ::basegfx::B2ISize& SpriteDeviceHelper::getSizePixel() 145*b1cdbd2cSJim Jagielski { 146*b1cdbd2cSJim Jagielski return maSize; 147*b1cdbd2cSJim Jagielski } 148*b1cdbd2cSJim Jagielski notifySizeUpdate(const awt::Rectangle & rBounds)149*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::notifySizeUpdate( const awt::Rectangle& rBounds ) 150*b1cdbd2cSJim Jagielski { 151*b1cdbd2cSJim Jagielski setSize( ::basegfx::B2ISize(rBounds.Width, rBounds.Height) ); 152*b1cdbd2cSJim Jagielski } 153*b1cdbd2cSJim Jagielski getSurface()154*b1cdbd2cSJim Jagielski SurfaceSharedPtr SpriteDeviceHelper::getSurface() 155*b1cdbd2cSJim Jagielski { 156*b1cdbd2cSJim Jagielski return mpBufferSurface; 157*b1cdbd2cSJim Jagielski } 158*b1cdbd2cSJim Jagielski getBufferSurface()159*b1cdbd2cSJim Jagielski SurfaceSharedPtr SpriteDeviceHelper::getBufferSurface() 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski return mpBufferSurface; 162*b1cdbd2cSJim Jagielski } 163*b1cdbd2cSJim Jagielski getWindowSurface()164*b1cdbd2cSJim Jagielski SurfaceSharedPtr SpriteDeviceHelper::getWindowSurface() 165*b1cdbd2cSJim Jagielski { 166*b1cdbd2cSJim Jagielski return DeviceHelper::getSurface(); 167*b1cdbd2cSJim Jagielski } 168*b1cdbd2cSJim Jagielski createSurface(const::basegfx::B2ISize & rSize,Content aContent)169*b1cdbd2cSJim Jagielski SurfaceSharedPtr SpriteDeviceHelper::createSurface( const ::basegfx::B2ISize& rSize, Content aContent ) 170*b1cdbd2cSJim Jagielski { 171*b1cdbd2cSJim Jagielski if( mpBufferSurface ) 172*b1cdbd2cSJim Jagielski return mpBufferSurface->getSimilar( aContent, rSize.getX(), rSize.getY() ); 173*b1cdbd2cSJim Jagielski 174*b1cdbd2cSJim Jagielski return SurfaceSharedPtr(); 175*b1cdbd2cSJim Jagielski } 176*b1cdbd2cSJim Jagielski createSurface(BitmapSystemData & rData,const Size & rSize)177*b1cdbd2cSJim Jagielski SurfaceSharedPtr SpriteDeviceHelper::createSurface( BitmapSystemData& rData, const Size& rSize ) 178*b1cdbd2cSJim Jagielski { 179*b1cdbd2cSJim Jagielski if( getOutputDevice() ) 180*b1cdbd2cSJim Jagielski return createBitmapSurface( *getOutputDevice(), rData, rSize ); 181*b1cdbd2cSJim Jagielski 182*b1cdbd2cSJim Jagielski return SurfaceSharedPtr(); 183*b1cdbd2cSJim Jagielski } 184*b1cdbd2cSJim Jagielski 185*b1cdbd2cSJim Jagielski 186*b1cdbd2cSJim Jagielski /** SpriteDeviceHelper::flush Flush the platform native window 187*b1cdbd2cSJim Jagielski * 188*b1cdbd2cSJim Jagielski * Flushes the window by using the internally stored mpSysData. 189*b1cdbd2cSJim Jagielski * 190*b1cdbd2cSJim Jagielski **/ flush()191*b1cdbd2cSJim Jagielski void SpriteDeviceHelper::flush() 192*b1cdbd2cSJim Jagielski { 193*b1cdbd2cSJim Jagielski SurfaceSharedPtr pWinSurface=getWindowSurface(); 194*b1cdbd2cSJim Jagielski if( pWinSurface ) 195*b1cdbd2cSJim Jagielski pWinSurface->flush(); 196*b1cdbd2cSJim Jagielski } 197*b1cdbd2cSJim Jagielski } 198