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 #include <tools/diagnose_ex.h> 31*b1cdbd2cSJim Jagielski 32*b1cdbd2cSJim Jagielski #include <com/sun/star/registry/XRegistryKey.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XSingleServiceFactory.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/NoSupportException.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp> 36*b1cdbd2cSJim Jagielski 37*b1cdbd2cSJim Jagielski #include <vcl/canvastools.hxx> 38*b1cdbd2cSJim Jagielski #include <vcl/outdev.hxx> 39*b1cdbd2cSJim Jagielski #include <vcl/window.hxx> 40*b1cdbd2cSJim Jagielski #include <vcl/bitmapex.hxx> 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski #include <basegfx/tools/canvastools.hxx> 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski #include <algorithm> 45*b1cdbd2cSJim Jagielski 46*b1cdbd2cSJim Jagielski #include "canvas.hxx" 47*b1cdbd2cSJim Jagielski #include "windowoutdevholder.hxx" 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski 50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star; 51*b1cdbd2cSJim Jagielski 52*b1cdbd2cSJim Jagielski namespace vclcanvas 53*b1cdbd2cSJim Jagielski { 54*b1cdbd2cSJim Jagielski namespace 55*b1cdbd2cSJim Jagielski { 56*b1cdbd2cSJim Jagielski class OutDevHolder : public OutDevProvider, 57*b1cdbd2cSJim Jagielski private ::boost::noncopyable 58*b1cdbd2cSJim Jagielski { 59*b1cdbd2cSJim Jagielski public: OutDevHolder(OutputDevice & rOutDev)60*b1cdbd2cSJim Jagielski explicit OutDevHolder( OutputDevice& rOutDev ) : 61*b1cdbd2cSJim Jagielski mrOutDev(rOutDev) 62*b1cdbd2cSJim Jagielski {} 63*b1cdbd2cSJim Jagielski 64*b1cdbd2cSJim Jagielski private: getOutDev()65*b1cdbd2cSJim Jagielski virtual OutputDevice& getOutDev() { return mrOutDev; } getOutDev() const66*b1cdbd2cSJim Jagielski virtual const OutputDevice& getOutDev() const { return mrOutDev; } 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski // TODO(Q2): Lifetime issue. This _only_ works reliably, 69*b1cdbd2cSJim Jagielski // if disposing the Canvas correctly disposes all 70*b1cdbd2cSJim Jagielski // entities which hold this pointer. 71*b1cdbd2cSJim Jagielski OutputDevice& mrOutDev; 72*b1cdbd2cSJim Jagielski }; 73*b1cdbd2cSJim Jagielski } 74*b1cdbd2cSJim Jagielski Canvas(const uno::Sequence<uno::Any> & aArguments,const uno::Reference<uno::XComponentContext> & rxContext)75*b1cdbd2cSJim Jagielski Canvas::Canvas( const uno::Sequence< uno::Any >& aArguments, 76*b1cdbd2cSJim Jagielski const uno::Reference< uno::XComponentContext >& rxContext ) : 77*b1cdbd2cSJim Jagielski maArguments(aArguments), 78*b1cdbd2cSJim Jagielski mxComponentContext( rxContext ) 79*b1cdbd2cSJim Jagielski { 80*b1cdbd2cSJim Jagielski } 81*b1cdbd2cSJim Jagielski initialize()82*b1cdbd2cSJim Jagielski void Canvas::initialize() 83*b1cdbd2cSJim Jagielski { 84*b1cdbd2cSJim Jagielski // #i64742# Only perform initialization when not in probe mode 85*b1cdbd2cSJim Jagielski if( maArguments.getLength() == 0 ) 86*b1cdbd2cSJim Jagielski return; 87*b1cdbd2cSJim Jagielski 88*b1cdbd2cSJim Jagielski /* maArguments: 89*b1cdbd2cSJim Jagielski 0: ptr to creating instance (Window or VirtualDevice) 90*b1cdbd2cSJim Jagielski 1: SystemEnvData as a streamed Any (or empty for VirtualDevice) 91*b1cdbd2cSJim Jagielski 2: current bounds of creating instance 92*b1cdbd2cSJim Jagielski 3: bool, denoting always on top state for Window (always false for VirtualDevice) 93*b1cdbd2cSJim Jagielski 4: XWindow for creating Window (or empty for VirtualDevice) 94*b1cdbd2cSJim Jagielski 5: SystemGraphicsData as a streamed Any 95*b1cdbd2cSJim Jagielski */ 96*b1cdbd2cSJim Jagielski tools::LocalGuard aGuard; 97*b1cdbd2cSJim Jagielski 98*b1cdbd2cSJim Jagielski VERBOSE_TRACE( "VCLCanvas::initialize called" ); 99*b1cdbd2cSJim Jagielski 100*b1cdbd2cSJim Jagielski ENSURE_ARG_OR_THROW( maArguments.getLength() >= 6 && 101*b1cdbd2cSJim Jagielski maArguments[0].getValueTypeClass() == uno::TypeClass_HYPER, 102*b1cdbd2cSJim Jagielski "Canvas::initialize: wrong number of arguments, or wrong types" ); 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski sal_Int64 nPtr = 0; 105*b1cdbd2cSJim Jagielski maArguments[0] >>= nPtr; 106*b1cdbd2cSJim Jagielski 107*b1cdbd2cSJim Jagielski OutputDevice* pOutDev = reinterpret_cast<OutputDevice*>(nPtr); 108*b1cdbd2cSJim Jagielski if( !pOutDev ) 109*b1cdbd2cSJim Jagielski throw lang::NoSupportException( 110*b1cdbd2cSJim Jagielski ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 111*b1cdbd2cSJim Jagielski "Passed OutDev invalid!")), 112*b1cdbd2cSJim Jagielski NULL); 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski OutDevProviderSharedPtr pOutdevProvider( new OutDevHolder(*pOutDev) ); 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski // setup helper 117*b1cdbd2cSJim Jagielski maDeviceHelper.init( pOutdevProvider ); 118*b1cdbd2cSJim Jagielski maCanvasHelper.init( *this, 119*b1cdbd2cSJim Jagielski pOutdevProvider, 120*b1cdbd2cSJim Jagielski true, // OutDev state preservation 121*b1cdbd2cSJim Jagielski false ); // no alpha on surface 122*b1cdbd2cSJim Jagielski 123*b1cdbd2cSJim Jagielski maArguments.realloc(0); 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski ~Canvas()126*b1cdbd2cSJim Jagielski Canvas::~Canvas() 127*b1cdbd2cSJim Jagielski { 128*b1cdbd2cSJim Jagielski OSL_TRACE( "Canvas destroyed" ); 129*b1cdbd2cSJim Jagielski } 130*b1cdbd2cSJim Jagielski disposing()131*b1cdbd2cSJim Jagielski void SAL_CALL Canvas::disposing() 132*b1cdbd2cSJim Jagielski { 133*b1cdbd2cSJim Jagielski tools::LocalGuard aGuard; 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski mxComponentContext.clear(); 136*b1cdbd2cSJim Jagielski 137*b1cdbd2cSJim Jagielski // forward to parent 138*b1cdbd2cSJim Jagielski CanvasBaseT::disposing(); 139*b1cdbd2cSJim Jagielski } 140*b1cdbd2cSJim Jagielski getServiceName()141*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL Canvas::getServiceName( ) throw (::com::sun::star::uno::RuntimeException) 142*b1cdbd2cSJim Jagielski { 143*b1cdbd2cSJim Jagielski return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( CANVAS_SERVICE_NAME ) ); 144*b1cdbd2cSJim Jagielski } 145*b1cdbd2cSJim Jagielski repaint(const GraphicObjectSharedPtr & rGrf,const rendering::ViewState & viewState,const rendering::RenderState & renderState,const::Point & rPt,const::Size & rSz,const GraphicAttr & rAttr) const146*b1cdbd2cSJim Jagielski bool Canvas::repaint( const GraphicObjectSharedPtr& rGrf, 147*b1cdbd2cSJim Jagielski const rendering::ViewState& viewState, 148*b1cdbd2cSJim Jagielski const rendering::RenderState& renderState, 149*b1cdbd2cSJim Jagielski const ::Point& rPt, 150*b1cdbd2cSJim Jagielski const ::Size& rSz, 151*b1cdbd2cSJim Jagielski const GraphicAttr& rAttr ) const 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski tools::LocalGuard aGuard; 154*b1cdbd2cSJim Jagielski 155*b1cdbd2cSJim Jagielski return maCanvasHelper.repaint( rGrf, viewState, renderState, rPt, rSz, rAttr ); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski } 158