1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_canvas.hxx"
26 
27 #include <canvas/debug.hxx>
28 #include <tools/diagnose_ex.h>
29 #include <canvas/verbosetrace.hxx>
30 #include <canvas/canvastools.hxx>
31 
32 #include <com/sun/star/registry/XRegistryKey.hpp>
33 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
34 #include <com/sun/star/uno/XComponentContext.hpp>
35 
36 #include <vcl/canvastools.hxx>
37 #include <vcl/outdev.hxx>
38 #include <vcl/window.hxx>
39 #include <vcl/bitmapex.hxx>
40 
41 #include <basegfx/tools/canvastools.hxx>
42 
43 #include <algorithm>
44 
45 #include "spritecanvas.hxx"
46 #include "windowoutdevholder.hxx"
47 
48 
49 using namespace ::com::sun::star;
50 
51 namespace vclcanvas
52 {
SpriteCanvas(const uno::Sequence<uno::Any> & aArguments,const uno::Reference<uno::XComponentContext> & rxContext)53     SpriteCanvas::SpriteCanvas( const uno::Sequence< uno::Any >&                aArguments,
54                                 const uno::Reference< uno::XComponentContext >& rxContext ) :
55         maArguments(aArguments),
56         mxComponentContext( rxContext )
57     {
58     }
59 
initialize()60     void SpriteCanvas::initialize()
61     {
62         tools::LocalGuard aGuard;
63 
64         // #i64742# Only call initialize when not in probe mode
65         if( maArguments.getLength() == 0 )
66             return;
67 
68         OSL_TRACE( "SpriteCanvas created" );
69 
70         // add our own property to GraphicDevice
71         maPropHelper.addProperties(
72             ::canvas::PropertySetHelper::MakeMap
73             ("UnsafeScrolling",
74              boost::bind(&SpriteCanvasHelper::isUnsafeScrolling,
75                          boost::ref(maCanvasHelper)),
76              boost::bind(&SpriteCanvasHelper::enableUnsafeScrolling,
77                          boost::ref(maCanvasHelper),
78                          _1))
79             ("SpriteBounds",
80              boost::bind(&SpriteCanvasHelper::isSpriteBounds,
81                          boost::ref(maCanvasHelper)),
82              boost::bind(&SpriteCanvasHelper::enableSpriteBounds,
83                          boost::ref(maCanvasHelper),
84                          _1)));
85 
86         VERBOSE_TRACE( "VCLSpriteCanvas::initialize called" );
87 
88         ENSURE_ARG_OR_THROW( maArguments.getLength() >= 1,
89                              "VCLSpriteCanvas::initialize: wrong number of arguments" );
90 
91         /* maArguments:
92            0: ptr to creating instance (Window or VirtualDevice)
93            1: SystemEnvData as a streamed Any (or empty for VirtualDevice)
94            2: current bounds of creating instance
95            3: bool, denoting always on top state for Window (always false for VirtualDevice)
96            4: XWindow for creating Window (or empty for VirtualDevice)
97            5: SystemGraphicsData as a streamed Any
98          */
99         ENSURE_ARG_OR_THROW( maArguments.getLength() >= 4 &&
100                              maArguments[0].getValueTypeClass() == uno::TypeClass_HYPER &&
101                              maArguments[4].getValueTypeClass() == uno::TypeClass_INTERFACE,
102                              "VCLSpriteCanvas::initialize: wrong number of arguments, or wrong types" );
103 
104         uno::Reference< awt::XWindow > xParentWindow;
105         maArguments[4] >>= xParentWindow;
106 
107         OutDevProviderSharedPtr pOutDev( new WindowOutDevHolder(xParentWindow) );
108 
109         // setup helper
110         maDeviceHelper.init( pOutDev );
111         setWindow(uno::Reference<awt::XWindow2>(xParentWindow, uno::UNO_QUERY_THROW));
112         maCanvasHelper.init( maDeviceHelper.getBackBuffer(),
113                              *this,
114                              maRedrawManager,
115                              false,   // no OutDev state preservation
116                              false ); // no alpha on surface
117 
118         maArguments.realloc(0);
119     }
120 
~SpriteCanvas()121     SpriteCanvas::~SpriteCanvas()
122     {
123         OSL_TRACE( "SpriteCanvas destroyed" );
124     }
125 
126 
disposing()127     void SAL_CALL SpriteCanvas::disposing()
128     {
129         tools::LocalGuard aGuard;
130 
131         mxComponentContext.clear();
132 
133         // forward to parent
134         SpriteCanvasBaseT::disposing();
135     }
136 
showBuffer(::sal_Bool bUpdateAll)137     ::sal_Bool SAL_CALL SpriteCanvas::showBuffer( ::sal_Bool bUpdateAll ) throw (uno::RuntimeException)
138     {
139         return updateScreen( bUpdateAll );
140     }
141 
switchBuffer(::sal_Bool bUpdateAll)142     ::sal_Bool SAL_CALL SpriteCanvas::switchBuffer( ::sal_Bool bUpdateAll ) throw (uno::RuntimeException)
143     {
144         return updateScreen( bUpdateAll );
145     }
146 
updateScreen(sal_Bool bUpdateAll)147     sal_Bool SAL_CALL SpriteCanvas::updateScreen( sal_Bool bUpdateAll ) throw (uno::RuntimeException)
148     {
149         tools::LocalGuard aGuard;
150 
151         // avoid repaints on hidden window (hidden: not mapped to
152         // screen). Return failure, since the screen really has _not_
153         // been updated (caller should try again later)
154         return !mbIsVisible ? false : maCanvasHelper.updateScreen(bUpdateAll,
155                                                                   mbSurfaceDirty);
156     }
157 
getServiceName()158     ::rtl::OUString SAL_CALL SpriteCanvas::getServiceName(  ) throw (::com::sun::star::uno::RuntimeException)
159     {
160         return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SPRITECANVAS_SERVICE_NAME ) );
161     }
162 
repaint(const GraphicObjectSharedPtr & rGrf,const rendering::ViewState & viewState,const rendering::RenderState & renderState,const::Point & rPt,const::Size & rSz,const GraphicAttr & rAttr) const163     bool SpriteCanvas::repaint( const GraphicObjectSharedPtr&	rGrf,
164                                 const rendering::ViewState&     viewState,
165                                 const rendering::RenderState&   renderState,
166                                 const ::Point& 					rPt,
167                                 const ::Size& 					rSz,
168                                 const GraphicAttr&				rAttr ) const
169     {
170         tools::LocalGuard aGuard;
171 
172         return maCanvasHelper.repaint( rGrf, viewState, renderState, rPt, rSz, rAttr );
173     }
174 }
175